md5

md5 - C - Programmation

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 ;))

Reply

Marsh Posté le 01-12-2005 à 14:23:05   

Reply

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.

Reply

Marsh Posté le 01-12-2005 à 22:11:36    

TCP gere deja les erreurs de transmission.

Reply

Marsh Posté le 02-12-2005 à 12:39:17    

et IP aussi.
sinon y a openssl aussi, et des tas de bibli qui font ça.

Reply

Marsh 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.

Reply

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
concrétement à rien...


 
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é.
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 02-12-2005 à 16:42:49    

Taz a écrit :

et IP aussi.
sinon y a openssl aussi, et des tas de bibli qui font ça.


 
ah  :heink:  
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 ?


---------------
-( BlackGoddess )-
Reply

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.

Reply

Marsh Posté le 08-12-2005 à 17:17:40    

hoty a écrit :

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.


 
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 :
  1. gcc -c md5.c
  2. md5.c:81: error: erreur de syntaxe before '+=' token
  3. md5.c: Dans la fonction « MD5Transform »:
  4. md5.c:340: error: erreur de syntaxe at end of input
  5. make: *** [md5.o] Erreur 1


 
il faut modifier quelque chose ?

Reply

Marsh Posté le 11-12-2005 à 16:26:42    

up

Reply

Marsh Posté le 11-12-2005 à 16:26:42   

Reply

Marsh Posté le 11-12-2005 à 16:32:56    

Ca tombe dans cette partie la :

Code :
  1. /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
  2. Rotation is separate from addition to prevent recomputation.
  3. */
  4. #define FF(a, b, c, d, x, s, ac) { \
  5. (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
  6. (a) = ROTATE_LEFT ((a), (s)); \
  7. (a) += (b); \
  8.   }
  9. #define GG(a, b, c, d, x, s, ac) { \
  10. (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
  11. (a) = ROTATE_LEFT ((a), (s)); \
  12. (a) += (b); \
  13.   }
  14. #define HH(a, b, c, d, x, s, ac) { \
  15. (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
  16. (a) = ROTATE_LEFT ((a), (s)); \
  17. (a) += (b); \
  18.   }
  19. #define II(a, b, c, d, x, s, ac) { \
  20. (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
  21. (a) = ROTATE_LEFT ((a), (s)); \
  22. (a) += (b); \
  23.   }


 
Y'avait une ligne vide juste avant un (a) += (b), faut la virer

Reply

Marsh Posté le 12-12-2005 à 09:58:59    

Ace17 a écrit :

Ca tombe dans cette partie la :

Code :
  1. /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
  2. Rotation is separate from addition to prevent recomputation.
  3. */
  4. #define FF(a, b, c, d, x, s, ac) { \
  5. (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
  6. (a) = ROTATE_LEFT ((a), (s)); \
  7. (a) += (b); \
  8.   }
  9. #define GG(a, b, c, d, x, s, ac) { \
  10. (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
  11. (a) = ROTATE_LEFT ((a), (s)); \
  12. (a) += (b); \
  13.   }
  14. #define HH(a, b, c, d, x, s, ac) { \
  15. (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
  16. (a) = ROTATE_LEFT ((a), (s)); \
  17. (a) += (b); \
  18.   }
  19. #define II(a, b, c, d, x, s, ac) { \
  20. (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
  21. (a) = ROTATE_LEFT ((a), (s)); \
  22. (a) += (b); \
  23.   }


 
Y'avait une ligne vide juste avant un (a) += (b), faut la virer


 
 
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.

Message cité 1 fois
Message édité par Sve@r le 12-12-2005 à 09:59:35

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-12-2005 à 11:58:57    

J'ai viré la ligne vide et ca marche, merci.

Reply

Marsh Posté le 12-12-2005 à 19:06:32    

Sve@r a écrit :

Pas obligé...

Pardon, il suffit de la virer [:itm]

Reply

Marsh Posté le 12-12-2005 à 19:52:12    

Ok , j'ai réussi a faire ça :  
 

Code :
  1. MD5 ("bonjour" ) =
  2. 6f3767a5232c66df9a1e5a88a2355400


 
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


Message édité par meumeul le 12-12-2005 à 20:26:18
Reply

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.

Reply

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

Reply

Marsh Posté le 12-12-2005 à 21:34:09    

non le md5 fait tout le temps 32 caractères


---------------
Nos estans firs di nosse pitite patreye...
Reply

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 ?

Reply

Marsh Posté le 12-12-2005 à 21:50:42    

oui..


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 12-12-2005 à 22:47:15    

mdr, ok, merci, désolé pour les questions à la con :)

Reply

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...)

Message cité 1 fois
Message édité par red faction le 13-12-2005 à 11:18:52
Reply

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 !
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".


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.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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  :ange:  
 
enfait ce block annule le resultat un peut comme le fait de multiplier par 0 donne tjs 0 peut importe les resultats precedents

Reply

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 ;)

Reply

Marsh Posté le 14-12-2005 à 09:21:50    

red faction a écrit :

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  :ange:  
 
enfait ce block annule le resultat un peut comme le fait de multiplier par 0 donne tjs 0 peut importe les resultats precedents


 
J'aimerais bien récupérer ce bloc...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed