md5 - C - Programmation
Marsh Posté le 01-12-2005 à 21:56:01
http://www.faqs.org/rfcs/rfc1321.html
Il y les sources de global.h, md5.h, md5c.c. Ca fournit trois fonctions :
MD5Init, MD5Update, MD5Final
Et un fichier mddriver.c qui monre comment ca marche.
Marsh Posté le 02-12-2005 à 12:39:17
ReplyMarsh Posté le 02-12-2005 à 13:13:38
Merci Hoty , ca m'a l'air d'etre totalement ce que je cherchais.
Oui tcp/ip gèrent déjà les erreus, le md5 ne me servira ici
concrétement à rien... C'est juste un point pédagogique
Merci pour vos réponses, je teste ces fonctions ce soir.
Marsh Posté le 02-12-2005 à 13:44:43
meumeul a écrit : Oui tcp/ip gèrent déjà les erreus, le md5 ne me servira ici |
tcp/ip gère les erreurs au niveau du protocole. Mais il est possible que l'info transmise soit modifiée en cours de transfert. C'est pour ça que sur les gros fichiers offerts en download (comme la distrib Mandrake par exemple) sont associés la signature MD5 qui permet de vérifier l'intégrité du fichier téléchargé.
Marsh Posté le 02-12-2005 à 16:42:49
Taz a écrit : et IP aussi. |
ah
me semblait qu'il y avait un checksum sur l'en-tête ip seulement, ce que je n'appelle pas une 'gestion des erreurs de transmission'. Il y aurait donc autre chose ?
Marsh Posté le 02-12-2005 à 18:16:39
Non tu as raison, IP ne gere pas les alterations de la "charge utile" des packets. D'ailleurs c'est pour ca que si tu fais de l'UDP (sur IP donc), il faut gerer les erreurs au niveau applicatif. Par contre TCP detecte les alterations de la charge utile des packet. Par contre c'est vrai que le checksum de TCP est relativement faible, donc ca n'est pas completement inutile de faire quelque chose de plus robuste.
Marsh Posté le 08-12-2005 à 17:17:40
hoty a écrit : http://www.faqs.org/rfcs/rfc1321.html |
coucou
encore merci pour ce source qui a l'air pas mal.
mais je suis surement trés bête j'arrive pas à a le compiler :S
Code :
|
il faut modifier quelque chose ?
Marsh Posté le 11-12-2005 à 16:32:56
Ca tombe dans cette partie la :
Code :
|
Y'avait une ligne vide juste avant un (a) += (b), faut la virer
Marsh Posté le 12-12-2005 à 09:58:59
Ace17 a écrit : Ca tombe dans cette partie la :
|
Pas obligé... mais en revanche CHAQUE ligne placée entre le début du "#define" et la fin "}" doit se terminer par un backslash pour que le compilo ne voie qu'une seule ligne. En effet, l'instruction "#define" doit impérativement s'écrire sur une seule ligne donc si on l'écris sur plusieurs (lisibilité du code), il faut masquer le caractère "fin de ligne" par un backslash.
Marsh Posté le 12-12-2005 à 19:06:32
ReplyMarsh Posté le 12-12-2005 à 19:52:12
Ok , j'ai réussi a faire ça :
Code :
|
Mais en fait, je me pose la question ...
J'envoie des paquets de n octets à un client. Comment le client vérifie si le paquet qu'il a recu est juste ?
( car le chemin inverse n'existe pas)
Il faut donc que j'envoie aussi ce code, non ? mais si j'envoie le code, il peut aussi y avoir des erreurs dessus...
en fait .... je sais pas vraiment comment l'utiliser
Marsh Posté le 12-12-2005 à 20:53:35
De toutes facons tu ne pourras jamais etre sur a 100% que ce que le client a recu est juste. Mais si tu balances les donnees et le md5, evidemment il peut y avoir des erreurs sur les deux, mais si les erreurs tombent de maniere a ce que le paquet corresponde encore au md5 transmis, c'est que tu as vraiment pas de bol!
Dans la pratique les erreurs vont modifier ton paquet "un peu". Mais quand un paquet change "un peu", le md5 associe a ce paquet change "beaucoup". Donc si ton md5 transmis est lui aussi faux, il y a tres tres peu de chances qu'il ait change de maniere a toujours correspondre au paquet.
Marsh Posté le 12-12-2005 à 21:03:41
ok, donc j'envoi données|md5
a la reception, si getMd5(donnée) == md5
alors j'accepte le paquet, sinon je le redemande.
Le truc c'est que c'est gros un md5 ! j'ai interet a envoyer des gros paquets.
enfin des pas trop petits. Il y'a un ration de données par rapport a la taille du md5 conseillé ? normé? car il fait quand meme 32 octets le joli
Marsh Posté le 12-12-2005 à 21:34:09
non le md5 fait tout le temps 32 caractères
Marsh Posté le 12-12-2005 à 21:45:42
ok donc pas de norme conseillé pour la taille des données pour UN md5 .
genre une paquet de 1024 octets pour 32 octets de md5 ?
Marsh Posté le 12-12-2005 à 21:50:42
oui..
Marsh Posté le 13-12-2005 à 11:03:29
KangOl a écrit : non le md5 fait tout le temps 32 caractères |
le md5 fait une empreinte 128 bit, bon ca fait aussi 32 caractéres si on l'affiche mais je vois mal qqn transmettre 32 caracteres pour faire le test (32 bytes*8 => 256 bit au lieu de 128...)
Marsh Posté le 13-12-2005 à 11:36:45
Ace17 a écrit : De toutes facons tu ne pourras jamais etre sur a 100% que ce que le client a recu est juste. Mais si tu balances les donnees et le md5, evidemment il peut y avoir des erreurs sur les deux, mais si les erreurs tombent de maniere a ce que le paquet corresponde encore au md5 transmis, c'est que tu as vraiment pas de bol ! |
1 bit passant de "0" à "1" ou l'inverse change TOUTE la signature MD5
Ace17 a écrit : Donc si ton md5 transmis est lui aussi faux, il y a tres tres peu de chances qu'il ait change de maniere a toujours correspondre au paquet. |
Ca s'appelle une "collision".
A ma connaissance, la seule collision md5 jamais enregistrée a été créée artificiellement au japon en août 2004.
Artificiellement parce que le la seconde chaîne donnant le même MD5 que la première a été créée de toute pièces par les chercheurs et mathématiciens japonais.
Marsh Posté le 13-12-2005 à 16:33:40
les collisions sont tres facile a reproduire
il suffit de rajouter un block binaire bien specifique a deux fichier (identique pour les 2)
on fait le md5 des 2 fichiers.... magie c identique
enfait ce block annule le resultat un peut comme le fait de multiplier par 0 donne tjs 0 peut importe les resultats precedents
Marsh Posté le 13-12-2005 à 19:12:28
red faction a écrit : le md5 fait une empreinte 128 bit, bon ca fait aussi 32 caractéres si on l'affiche mais je vois mal qqn transmettre 32 caracteres pour faire le test (32 bytes*8 => 256 bit au lieu de 128...) |
en fait ca donne 32 caractères
1. MD5 ("bonjour" ) =
2. 6f3767a5232c66df9a1e5a88a2355400
Mais c'est de l'hexa, autant pour moi, j'ai pas reflechi j'ai pris ca pour des caractères
sur 8 bits chacun ... un hexa codé sur 4 bits donc
ca fait 4 * 32 = 128. bien vu
Marsh Posté le 14-12-2005 à 09:21:50
red faction a écrit : les collisions sont tres facile a reproduire |
J'aimerais bien récupérer ce bloc...
Marsh Posté le 01-12-2005 à 14:23:05
bonjour, j'implémente un protocole sur tcp/ip, au quel je voudrais rajouter un petit controle sur les bit...
Un crc ou mieux, un md5. je cherche une libraire trés simple pour faire cela, je n'en ai trouvé que des
compliqués. En connaissez vous un simple ? je précise que je ne cherche pas l'efficacité, c'est juste
une question pédagogique ...
Merci, bonne journée (ou soirée pour les accrocs )