Vous êtes sur la page 1sur 8

Université Hassan II-Mohammedia Ann. Univ.

2009-10

F.S.T. Mohammedia Filière Ingénieur ILIS


Département de Mathématiques Module : Cryptographie

Chap. 3. FONCTIONS CRYPTOGRAPHIQUES DE HACHAGE

O. KHADIR, FSTM

Ce chapitre traite des fonctions de hachage dont l’importance réside dans deux applica-
tions fondamentales :
1. Protéger l’intégrite des documents qui se transmettent à travers un canal non sûr ou
qui sont stockés sur des supports exposés, comme les mots de passe.
2. Permettre les signatures de messages et de contrats de grande taille.

I. Introduction et définitions

Une fonction de hachage h est une fonction qui transforme un long message donné M
en un autre, noté h(M ), de taille plus courte et ayant des qualité lui permettant de
caractériser le long message de départ M . Le nouveau message obtenu h(M ) s’appelle
résumé, empreinte ou haché (Message digest, MD).
Une fonction de hachage doit donc posséder des qualités telles que :
1. h(M ) se calcule rapidement.
2. La connaissance de l’empreinte h(M1 ) d’un message M1 , ne permet pas de calculer
facilement ni M1 ni un autre message M2 tel que h(M1 ) = h(M2 ).
3. Il est difficile dans la pratique de construire deux message M1 et M2 tels que : h(M1 ) =
h(M2 ).

Plus précisément :

Définition 1 Une fonction de hachage est une application h : {0,1}∗ −→ {0,1}n , n ∈ N.


Elle est dite faiblement résistante aux collisions si, étant donné un message M1 , il est
difficile de construire un message M2 tel que h(M1 ) = h(M2 ).

Définition 2 Une fonction de hachage h est dite fortement résistante aux collisions si, il
est difficile de trouver deux messages M1 et M2 tels que h(M1 ) = h(M2 ).

33
Université Hassan II-Mohammedia Ann. Univ. 2009-10

Un célèbre exemple des fonctions de hachage est la fonction proposées par Chaum et

al. Elle se base sur le problème du logarithme discret.

Soit p un nombre premier tel que p − 1 = 2 q et q premier aussi (comme 23 − 1 = 2 × 11).

Considérons a et b deux racines primitives, c’est-à-dire des générateurs, modulo p.


Z Z Z ∗
Soit h : × −→ ( )
qZ qZ pZ
(X,Y ) −→ aX bY [p]

Théorème S’il existe une collision de h, alors le problème du logarithme discret


x
a ≡ b [p] admettra facilement une solution calculable.

Preuve. Voir exercie 4, TD3.

Lors de la construction de fonctions de hachage, nous devons rendre la recherche des col-
lisions calculatoirement difficile. C’est pour cela que nous devons tenir compte de certains
resultats mathématiques comme le paradoxe des anniversaires.

II. Paradoxe des anniversaires et dimensionnement


On considr̀e n valeurs distinctes : a1 , a2 , a3 , . . . , an toutes distinctes.
On en choisit au hasard k, éventuellement avec répitition : X1 , X2 , X3 , . . . , Xk .
Soit p la probabilité pour que 2 des k valeurs Xi tirées soient égales. Donc :
q = 1 − p est la probabilité pour que toutes les valeurs Xi tirées soient différentes.
On montre par des calculs de probabilité que
k−1
Y
q= (1 − i/n) = (1 − 1/n)(1 − 2/n)(1 − 3/n)...(1 − (k − 1)/n) (1)
i=1

D’après le programme du bac : ex ≥ x + 1, ∀x ∈ R, donc e−i/n ≥ −i/n + 1 = 1 − i/n.


k−1
Y Pk−1
L’équation (1) =⇒ q ≤ e−i/n = e−1/n i=1 i
= e−1/n k(k−1)/2
. Donc
i=1

q ≤ e−k(k−1)/2n (2)

Il est naturel de se poser la question : A quelle condition sur n et k, a-t-on p ≥ 1/2?


p ≥ 1/2 ⇐⇒ q ≤ 1/2. D’après (2), il suffit que : e−k(k−1)/2n ≤ 1/2. Or :

34
Université Hassan II-Mohammedia Ann. Univ. 2009-10

e−k(k−1)/2n ≤ 1/2 ⇐⇒ −k(k − 1)/2n ≤ − ln 2 ⇐⇒ k(k − 1)/2n ≥ ln 2 ⇐⇒ k(k − 1) ≥


2n ln n ⇐⇒ (k − 1/2)2 − 1/4 ≥ 2n ln 2 ⇐⇒ (k − 1/2)2 ≥ 2n ln
√ 2 + 1/4 ⇐⇒ k − 1/2 ≥
p p 8n ln 2+1/4
2n ln 2 + 1/4 ⇐⇒ k ≥ 1/2 + 2n ln 2 + 1/4 ⇐⇒ k ≥ 1/2 + 4
. Finalement :

1 + 8n ln 2 + 1
k≥ (3)
2

Le paradoxe

n = 365 jours de l’année : J1 , J2 , . . . , J365


k personnes dans une salle : P1 , P2 , . . . , Pk
On trouve que k ≥ 22.99 à partir de la relation (3). Autrement dit, pour avoir avec un
probabilité ≥ 1/2, dans la même salle deux personnes avec la même date d’anniversaire,
il suffit que leur nombre k ≥ 23.

Dimensionnement

Soit h : {0,1}∗ −→ {0,1}n


M −→ h(M )
une fonction de hachage. Puisque ||h(M )|| = n, le nombre de possibilités pour h(M ) est
2n : a1 , a2 , . . . , aN , N = 2n .
Posons X1 = h(M1 ), X2 = h(M2 ), ..., Xk = h(Mk ) pour des messages Mi arbitraires.

√ probabilité ≥ 1/2 d’avoir Xi = Xj , c’est-à-dire une


D’après la relation (3), on a une
1 + 8 N ln 2 + 1
collision, dès lors que k ≥ , N = 2n .
√ 2
1 + 8 N ln 2 + 1
Posons f (n) = .
2
Pour simuler la signature d’une empreinte ou altérer un document à des fins mal inten-
tionnées, les pirates sont confrontés à la recherche de collisions pour h. C’est pourquoi,
nous devons la rendre la plus difficile possible. Si f (n) est très grand, le nombre k le serait
aussi et les calculs
√ de h(Mi ) seraient coûteux et décourageants.
8 2 ln 2 √
n
Comme k ≥ = 2 ln 2 2n/2 ≥ 2n/2 .
2
Il suffit de rendre 2n/2 très grand. Voici un tableau indicatif :

n: nbre de bits de h(M ) 50 100 150 200


n/2 25 50 75 100
n/2
nbre de chiffres de 2 9 16 23 31

35
Université Hassan II-Mohammedia Ann. Univ. 2009-10

Les choix recommandés pour n sont n = 128, n = 160 et plus.

III. Algorithme du Message Digest MD5 (1992)

1. Principe : Suite aux travaux indépendants de Merkle et de Damgard de 1989, Rivest a


élaboré la suite des algorithmes MD. L’idée de fond est très simple. On se fixe un message
M écrit en binaire, peu importe sa taille ||M ||. On initialise d’abord 128 bits, nous verrons
comment. Ensuite :
(1) On applique à ces 128=X bits un traitement à l’aide de fonctions booléennes qui font
intervenir les 512=Y premiers bits du message à hacher M . Le résultat du traitement
donnera 128=Z nouveaux bits.
(2) On recommence en (1) en remplacant X par Z et Y par les 512 bits suivants du
message.
(3) On recommence le (2) jusqu’à épuisement du message M .

Le message M −→ 512 - 512 - 512 · · · · · · · · · · · · <512 +suffixe


↓ ↓ ↓ ↓
128 bits initiaux −→ Trait. −→ Trait. −→ Trait. −→ · · · −→ Trait. −→ 128 bits

fig. 1. Schéma de MD5

Il est, en conséquence, normal de penser à compléter M , dès le début de l’algorithme,


pour que sa taille devienne un multiple de 512 bits. Voici comment le fait MD5 :
Décomposons M : M = M1 .M2 .M3 . . . . Mn−1 .Mn avec ||M1 || = ||M2 || = ... = ||Mn−1 || =
512 et ||Mn || < 512.
On complétera Mn en écrivant : Mn = a1 .a2 . . . ak .1.0z .||M ||. La taille de M sera écrite en
fin de la chaı̂ne sur 64 bits. Ces derniers sont suffisant pour représenter les tailles les plus
élevées. 0z est le mot constitué de z zéros. Pour savoir combien de zéros on ajoutera à la
fin du message M , on a les relations :

512 = ||Mn || + 1 + z + 64 (4)

Ce qui donne
z = 447 − ||Mn || (5)

36
Université Hassan II-Mohammedia Ann. Univ. 2009-10

2. Remarque : Si on complétait M par de simples 0, il serait plus facile aux pirates de


trouver deux messages avec la même empreinte car tous les messages complétés auront
trop de bits identiques.

3. Exemple : Prenons pour M le message à 40 bits :

M = 01100001 0110010 01100011 01100100 01100101

On complète par le bit 1 et un nombre z de 0 tels que z = 447 − 40 = 407 d’après la


relation (5). On termine par la longuer ||M || = 101000 en binaire et 28 en hexadécimal.
D’où :

M = 01100001 0110010 01100011 01100100 01100101 (10...000


| {z }). (00...101000
| {z })
448 bits 64 bits

Le message M complété peut-être codé en héxadécimal. Chaque quartet de bits est


représenté par un seul symbole :

M = 61626364 65800000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000028

A l’issue de cette transformation du message M , nous obtenons n paquets de 512 bits


chacun, ou de manière équivalente n paquets de 16 mots de 32 bits chacun. On les notera :
M [0], M [1], ..., M [n − 1]

Les 4 fonctions intervenant dans le traitement des 128 bits mélangés aux 512 bits pris au
message sont :
f1 (X,Y,Z) = Si X alors Y sinon Z= (X et Y ) ou (X et Z)
f2 (X,Y,Z) = Si Z alors X sinon Y = (Z et X) ou (Z et Y )
f3 (X,Y,Z) =somme modulo 2=X ⊕ Y ⊕ Z
f4 (X,Y,Z) = Y ⊕ (X ou Z)

37
Université Hassan II-Mohammedia Ann. Univ. 2009-10

4. Algorithme MD5

1. initialiser (A, B, C, D) ←− (67 45 23 01, EF CD AB 89, B,


e A)
e (Image miroir)
2. pour i de 0 à n/16-1 faire :
2.1. Pour j de 0 à 15 faire X[j] ←− M [16i + j].# fin de pour j
2.2. (AA, BB, CC, DD) ←− (A, B, C, D)
2.3. étape1, étape2, étape3, étape4 sur X[0],...X[15] et (AA, BB, CC, DD).
2.4. (A, B, C, D) ←− (AA + A, BB + B, CC + C, DD + D)
# fin de pour i
3. concaténer(A, B, C, D) et les afficher.

A titre d’illustration , on va exposer ce qu’est l’étape1. Les 3 autres autres lui sont
semblables.
On remplit un tableau T par 64 valeurs égales à la partie entière de 232 | sin i|; i = 1 à 64.
On note [abcd k s i] l’opération

a ←− b + ((a + f1 (b,c,d) + X[k] + T [i]) << s

Tous les termes sont formés de 32 bits et << est la permutation circulaire à gauche de s
bits; 0 ≤ s ≤ 31.
L’étape1 consiste en les 16 opérations :
[ABCD 0 7 1] [CDAB 2 17 3]
[ABCD 4 7 5] [CDAB 6 17 7]
[ABCD 8 7 9] [CDAB 10 17 11]
[ABCD 12 7 13] [CDAB 14 17 15]
[DABC 1 12 2] [BCDA 3 22 4]
[DABC 5 12 6] [BCDA 7 22 8]
[DABC 9 12 10] [BCDA 11 22 12]
[DABC 13 12 14] [BCDA 15 22 16]

A suivre ...

38
Université Hassan II-Mohammedia Ann. Univ. 2009-10

III. Algorithme de Hachage SHA1

1. Principe : SHA1 est une fonction de hachage de 160 bits pour chaque message de 512
bits. Elle améliore le MD5 qui, lui était sur 128 bits seulement.

Les 4 fonctions intervenant dans le traitement des 160 bits mélangés aux 512 bits pris au
message sont :
f1 (X,Y,Z) =Si X alors Y sinon Z=(X et Y ) ou (X et Z)
f2 (X,Y,Z) =somme modulo 2=X ⊕ Y ⊕ Z
f3 (X,Y,Z) = vote(X,Y,Z) = (X et Y ) ou (Y et Z) ou (Z et X)
f4 (X,Y,Z) = f2 (X,Y,Z)

80 constantes Ki sont prédéfinies selon 4 segments.


Ki = 5A82 7999 pour i ∈ [0,19]
Ki = 6ED9 EBA1 pour i ∈ [20,39]
Ki = 8F 1B BCDC pour i ∈ [40,59]
Ki = CA62C1D6 pour i ∈ [60,79]
√ √
Ces constantes sont en fait les valeurs respectives en héxadécimal des réels 2/4, 3/4,
√ √
5/4, 10/4 choisis pour l’imprévisibilité de leurs chiffres.
On choisit, comme en MD5, cinq mots d’initialisation de 32 bits, donc 160 bits :
(A0 , B0 , C0 , D0 , E0 ) ←− (67 45 23 01, EF CD AB 89, B,
e A,C3D2E1F
e 0) (Image miroir)
Soit M = M1 ....Mn le message à hacher séparé en paquets de Mi de 512 bits.
Pour chaque paquet Mi de 512 bits du message, l’algorithme SHA1 fait 80 ronde Rj , j = 0
à 79, à l’aide des quatre fonctions f1 , f2 , f3 , f4 .
f1 (X,Y,Z) est utilisée pour les rondes Rj telles que j ∈ [0,19].
f2 (X,Y,Z) est utilisée pour les rondes Rj telles que j ∈ [20,39].
f3 (X,Y,Z) est utilisée pour les rondes Rj telles que j ∈ [40,59].
f4 (X,Y,Z) = f2 (X,Y,Z) est utilisée pour les rondes Rj telles que j ∈ [60,79].

On partage chaque paquet Mi de 512 bits en des mots de 32 bits, donc 16 : W0 , . . . ,W15
On complète à 80 mots de 32 bits de la manière suivante :
Pour k = 16,...,79 : Wk = (Wk−3 ⊕ Wk−8 ⊕ Wk−14 ⊕ Wk−16 ) << 1
Voici le détail de l’algorithme

39
Université Hassan II-Mohammedia Ann. Univ. 2009-10

Algorithme SHA1

1. pour i = 1 à n faire les tâches de 2 à 6.


1.1. Mi ←− W0 W1 ... W15 (Séctionner M en 16 sous-mots de 32 bits )
1.2. Pour k = 16 à 79 faire : Wk ←− (Wk−3 ⊕ Wk−8 ⊕ Wk−14 ⊕ Wk−16 ) << 1
1.3.(A, B, C, D, E) ←− (A0 , B0 , C0 , C0 , E0 )
1.4. Pour j = 0 à 79 faire :
1.4.1 T ←− fj (B,C,D) + (A << 5) + E + Wj + Kj
1.4.2 (E, D, C, B, A) ←− (D, C, (B << 30), A, T )
1.5. (A0 , B0 , C0 , D0 , E0 ) ←− (A + A0 , B + B0 , C + C0 , D + C0 , E + E0 )
2. écrire A0 B0 C0 D0 E0 . (L’empreinte de 160 bits)

2. Remarque : Pour se convaincre de l’efficacité des deux algorithmes MD5 et SHA1,


il serait utile de voir les empreintes (très différentes) des quatre messages très proches :
M1 =””, M2 = a, M3 = abc, et M4 = abcdef...z. Voir TP3.

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

40