FireWall.net - Le guide de l'installation et configuration FireWall
o Accueil > Forum
 

Forum de discussion

 

Vous pouvez exprimer ici toutes questions relatives aux firewalls ou tout point que vous souhaiteriez faire connaître relatifs au sujet des firewalls.

 
 Signature MD5
Auteur: thomas (62.161.229.---)
Date:   20/07/2001 11:31

Bonjour,

je voudrais savoir ce qu est la signature MD5

merci d'avance
et bravo pour ce tres bon site

 Re: Signature MD5
Auteur: Superdav (---.116.rev.fr.colt.net)
Date:   20/07/2001 14:08

Comme son nom l indique c est une signature
qui je crois donne une clé pour chaque programme. Un exemple tu as un fichier netscape auquel correspond une clé
tu peux essayer de rennomer le fichier iexplore par netscape et lancer ainsi le fichier rennommé.
Ben ca ne marchera pas parce que la clé de ce nouveau programme ne correspondra pas a celle de l ancien netscape

J espere que tu as compris et je sais que c est un peu floue

David

 Re: Signature MD5
Auteur: chris33140 (---.abo.wanadoo.fr)
Date:   20/07/2001 19:49

Salut à tous :=)
C'est une signature specifique à chaque programme :=)
Bye
chris

http://chris33140.pour-internet.com
http://ninou33140.free.fr

 Re: Signature MD5
Auteur: jmb (---.abo.wanadoo.fr)
Date:   20/07/2001 22:21

Un peu plus de précision que diantre


MD5 (Message Digest version 5) est un algorithme d'identification qui permet d'obtenir pour chaque message une empreinte digitale unique.
C'est un algorithme à sens unique car l'empreinte ne permet pas de retrouver le message.
MD5 est utilisé en FTP pour vérifier l'intégrité des données transférées.
Algorithme
Padding
Le message doit avoir une taille en bits Tb telle que Tb modulo 512 = 448 modulo 512 = 448.
Si ca n'est pas le cas, on effectue un padding : un bit valant 1 suivi de bits valant 0.
Ajout de la taille
On ajoute ensuite la longueur du message (sans le padding) en bits à la fin du message étendu. Cette taille est ajoutée sur 64 bits en little endian (cf. annexe)
Le message a maintenant une taille en bits multiple de 512, c'est-à-dire qu'il contient un multiple de 16 mots de 32 bits.

Calcul de l'empreinte
Initialisation
On considère les registres A, B, C et D suivants :
A = 0x67452301
B = 0xefcdab89
C = 0x98badcfe
D = 0x10325476
Ainsi que les fonctions suivantes :
F(x,y,z) = x and y or not(x) and z => (x & y) | (~x & z)
G(x,y,z) = x and z or not(z) and y => (x & z) | (~z & y)
H(x,y,z) = x xor y xor z => x ^ y ^ z
I(x,y,z) = y xor (x or not(z)) => y ^ (x | ~z)
(la 2e notation correspond au langage C)
FF(a,b,c,d,k,s,i) => a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
GG(a,b,c,d,k,s,i) => a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s)
HH(a,b,c,d,k,s,i) => a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s)
II(a,b,c,d,k,s,i) => a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s)
(<<< s représente une rotation circulaire à gauche de s bits)
Et le tableau T suivant :

T[0] = 0xd76aa478
T[1] = 0xe8c7b756
T[2] = 0x242070db
T[3] = 0xc1bdceee
T[4] = 0xf57c0faf
T[5] = 0x4787c62a
T[6] = 0xa8304613
T[7] = 0xfd469501
T[8] = 0x698098d8
T[9] = 0x8b44f7af
T[10] = 0xffff5bb1
T[11] = 0x895cd7be
T[12] = 0x6b901122
T[13] = 0xfd987193
T[14] = 0xa679438e
T[15] = 0x49b40821
T[16] = 0xf61e2562
T[17] = 0xc040b340
T[18] = 0x265e5a51
T[19] = 0xe9b6c7aa
T[20] = 0xd62f105d
T[21] = 0x02441453
T[22] = 0xd8a1e681
T[23] = 0xe7d3fbc8
T[24] = 0x21e1cde6
T[25] = 0xc33707d6
T[26] = 0xf4d50d87
T[27] = 0x455a14ed
T[28] = 0xa9e3e905
T[29] = 0xfcefa3f8
T[30] = 0x676f02d9
T[31] = 0x8d2a4c8a
T[32] = 0xfffa3942
T[33] = 0x8771f681
T[34] = 0x6d9d6122
T[35] = 0xfde5380c
T[36] = 0xa4beea44
T[37] = 0x4bdecfa9
T[38] = 0xf6bb4b60
T[39] = 0xbebfbc70
T[40] = 0x289b7ec6
T[41] = 0xeaa127fa
T[42] = 0xd4ef3085
T[43] = 0x04881d05
T[44] = 0xd9d4d039
T[45] = 0xe6db99e5
T[46] = 0x1fa27cf8
T[47] = 0xc4ac5665
T[48] = 0xf4292244
T[49] = 0x432aff97
T[50] = 0xab9423a7
T[51] = 0xfc93a039
T[52] = 0x655b59c3
T[53] = 0x8f0ccc92
T[54] = 0xffeff47d
T[55] = 0x85845dd1
T[56] = 0x6fa87e4f
T[57] = 0xfe2ce6e0
T[58] = 0xa3014314
T[59] = 0x4e0811a1
T[60] = 0xf7537e82
T[61] = 0xbd3af235
T[62] = 0x2ad7d2bb
T[63] = 0xeb86d391
M représente le message. M[n] représente le (n-1)-ième mot de 32 bits du message.
N est le nombre de mots de 32 bits.
X est un tableau de 16 mots de 32 bits.
AA, BB, CC et DD sont des registres tampons.

Calcul
Voici le pseudo-code correspondant aux calculs à effectuer :
Boucle i de 0 à N/16 - 1
Faire

Boucle j de 0 à 15
Faire
X[j] = M[i*16 + j]
FinBoucle j
AA = A
BB = B
CC = C
DD = D

/* Ronde 1 */
FF(a, b, c, d, 0, 7, 0)
FF(d, a, b, c, 1, 12, 1)
FF(c, d, a, b, 2, 17, 2)
FF(b, c, d, a, 3, 22, 3)
FF(a, b, c, d, 4, 7, 4)
FF(d, a, b, c, 5, 12, 5)
FF(c, d, a, b, 6, 17, 6)
FF(b, c, d, a, 7, 22, 7)
FF(a, b, c, d, 8, 7, 8)
FF(d, a, b, c, 9, 12, 9)
FF(c, d, a, b, 10, 17, 10)
FF(b, c, d, a, 11, 22, 11)
FF(a, b, c, d, 12, 7, 12)
FF(d, a, b, c, 13, 12, 13)
FF(c, d, a, b, 14, 17, 14)
FF(b, c, d, a, 15, 22, 15)

/* Ronde 2 */
GG(a, b, c, d, 1, 5, 16)
GG(d, a, b, c, 6, 9, 17)
GG(c, d, a, b, 11, 14, 18)
GG(b, c, d, a, 0, 20, 19)
GG(a, b, c, d, 5, 5, 20)
GG(d, a, b, c, 10, 9, 21)
GG(c, d, a, b, 15, 14, 22)
GG(b, c, d, a, 4, 20, 23)
GG(a, b, c, d, 9, 5, 24)
GG(d, a, b, c, 14, 9, 25)
GG(c, d, a, b, 3, 14, 26)
GG(b, c, d, a, 8, 20, 27)
GG(a, b, c, d, 13, 5, 28)
GG(d, a, b, c, 2, 9, 29)
GG(c, d, a, b, 7, 14, 30)
GG(b, c, d, a, 12, 20, 31)

/* Ronde 3 */
HH(a, b, c, d, 5, 4, 32)
HH(d, a, b, c, 8, 11, 33)
HH(c, d, a, b, 11, 16, 34)
HH(b, c, d, a, 14, 23, 35)
HH(a, b, c, d, 1, 4, 36)
HH(d, a, b, c, 4, 11, 37)
HH(c, d, a, b, 7, 16, 38)
HH(b, c, d, a, 10, 23, 39)
HH(a, b, c, d, 13, 4, 40)
HH(d, a, b, c, 0, 11, 41)
HH(c, d, a, b, 3, 16, 42)
HH(b, c, d, a, 6, 23, 43)
HH(a, b, c, d, 9, 4, 44)
HH(d, a, b, c, 12, 11, 45)
HH(c, d, a, b, 15, 16, 46)
HH(b, c, d, a, 2, 23, 47)

/* Ronde 4 */
II(a, b, c, d, 0, 6, 48)
II(d, a, b, c, 7, 10, 49)
II(c, d, a, b, 14, 15, 50)
II(b, c, d, a, 5, 21, 51)
II(a, b, c, d, 12, 6, 52)
II(d, a, b, c, 3, 10, 53)
II(c, d, a, b, 10, 15, 54)
II(b, c, d, a, 1, 21, 55)
II(a, b, c, d, 8, 6, 56)
II(d, a, b, c, 15, 10, 57)
II(c, d, a, b, 6, 15, 58)
II(b, c, d, a, 13, 21, 59)
II(a, b, c, d, 4, 6, 60)
II(d, a, b, c, 11, 10, 61)
II(c, d, a, b, 2, 15, 62)
II(b, c, d, a, 9, 21, 63)

A = A + AA
B = B + BB
C = C + CC
D = D + DD

FinBoucle i
Résultats
Le résultat correspond aux registres A, B, C, D concaténés de l'octet de poids faible de A à l'octet de poids fort de D.
C'est-à-dire :
(Digest est une chaine de 16 caractères, Digest[n] est le (n-1)-ième caractère, le 1e octet est l'octet de poids faible, ..., le 4e est l'octet de poids fort)

Digest[0] = 1e octet de A
Digest[1] = 2e octet de A
Digest[2] = 3e octet de A
Digest[3] = 4e octet de A
Digest[4] = 1e octet de B
Digest[5] = 2e octet de B
Digest[6] = 3e octet de B
Digest[7] = 4e octet de B
Digest[8] = 1e octet de C
Digest[9] = 2e octet de C
Digest[10] = 3e octet de C
Digest[11] = 4e octet de C
Digest[12] = 1e octet de D
Digest[13] = 2e octet de D
Digest[14] = 3e octet de D
Digest[15] = 4e octet de D

L'empreinte de M est Digest.

Implémentation dans DreamOS/LibC
L'implémentation que j'ai choisi pour DreamOS/LibC est strictement personnelle c'est-à-dire que les fonctions MD5 de DreamOS/LibC ne sont pas identiques à celles de la GNULibC.
Utilisation
#include
typedef unsigned long md5_size;
Ce type est utilisé pour les tailles des messages.
Le type unsigned long est l'un des défauts de cette implémentation (cf. plus bas).
md5_size md5_needed(char *M, md5_size len);
Cette fonction recoit en paramètre le message M de taille len.
Elle calcule puis renvoie la taille de M aprés padding et ajout de la taille.
En effet, c'est au programmeur de contrôler que la mémoire allouée est suffisamment grande pour ces opérations.

char *md5(char *M, md5_size len, char *Digest);
Cette fonction calcule l'empreinte de M, un message de longueur len. Cette empreinte est stockée dans Digest.
La fonction renvoie le pointeur Digest.
Digest doit pointer vers une zone d'au moins 16 octets.
Fonctionnement
typedef struct{ ... } md5_regs;
unsigned long A;
unsigned long B;
unsigned long C;
unsigned long D;
typedef unsigned long md5_size;
Voir plus haut.
md5_size md5_needed(char *M, md5_size len);
Voir plus haut.
char *md5(char *M, md5_size len, char *Digest);
Voir plus haut.
void md5_padding(char *M, md5_size *len);
Effectue le padding de M et modifie len en conséquence.
void md5_addsize(char *M, md5_size *len, md5_size oldlen);
Ajoute la taille oldlen (avant padding) à M et modifie len en conséquence.
void md5_calc(md5_regs *regs, md5_size len, char *M);
Calcul l'empreinte de M (message + padding + taille), la taille valant len, et en utilisant les registres regs.
#define rotate(w,s)
Effectue une rotation circulaire à gauche de w de s bits.
#define F(x,y,z) - #define G(x,y,z) - #define H(x,y,z) - #define I(x,y,z)
Voir plus haut.
#define FF(a,b,c,d,x,s,t) - #define GG(a,b,c,d,x,s,t) - #define HH(a,b,c,d,x,s,t) - #define II(a,b,c,d,x,s,t)
Voir plus haut.
char *md5_result(md5_regs regs, char *Digest);
Détermine l'empreinte Digest à partir des registres regs après calcul et renvoie le pointeur Digest.
Bogues et défauts
Allocation mémoire
C'est au programmeur que revient la tâche d'allouer la mémoire nécessaire car les opérations de padding et d'ajout de la taille sont réalisées directement à l'adresse indiquée par le pointeur recu en argument. De plus, la chaine envoyée est alors modifiée.
Taille des messages
Normalement, MD5 peut fonctionner avec des messages dont la taille en bits tient sur 64 bits (voire plus). Or, ici, le type utilisée pour la taille en octets est unsigned long (soit 32 bits). La taille en bits tient donc sur 35 bits au maximum.
Lorsque md5_size équivaut à unsigned long, la compilation produit 3 warnings lignes 67, 68 et 69. C'est tout à fait normal.

Plate-forme
Ces fonctions n'ont été écrites que pour des machines à la norme little endian.
Conclusion
MD5 est donc un algorithme rapide et simple à implémenter, mais pourtant très fiable. Les quelques problèmes dont souffre l'implémentation de DreamOS/LibC seront probablement corrigés plus tard mais ils ne sont pas très génants.

 Re: Signature MD5
Auteur: nazlurf (---.abo.wanadoo.fr)
Date:   09/08/2001 23:49

ben le message de superdav etait plus simple a comprendre !!!

 Répondre à ce message
 Votre Nom:
 Votre Email:
 Sujet:
Envoyer un mail à l'adresse ci-dessus, en cas de réponse.
  

Votez pour ce site au WebOrama
Ce site est copyright © Chryjs 1999-2001, toute reproduction interdite.
phorum.org