L'intégrité

Un des problèmes annexes à la cryptographie est la vérification de l'intégrité d'un message: comment savoir si le message que l'on reçoit n'a pas été modifié en cours de route? Ce problème peut aussi se poser avec Internet: comment savoir si la version du logiciel X mis en téléchargement sur le web est bien le logiciel original et non pas une version avec un virus? Quand la police confisque un disque dur pour une enquête, a aussi besoin d'assurer l'intégrité de ce disque pour prouver que son contenu n'a pas été modifié entre la confisquation et l'éventuel procès.

La réponse à ces problèmes est la notion de fonction de hachage à sens unique. Cette fonction (H), qui doit être rapide à calculer, transforme un message M de longueur arbitraire en une empreinte numérique h de taille fixée:

h = H(M), où h est de longueur m.

Cette fonction doit en outre avoir les propriétés suivantes:

Alice envoie à Bob le message lui-même et son empreinte qu'elle aura calculée. Bob calcule à son tour l'empreinte du message puis la compare avec celle qu'il a reçue. Si ce sont les mêmes, le message n'a pas été modifié.
On peut voir une analogie avec les empreintes digitales: c'est aussi une manière fiable de vérifier l'identité d'un individu avec une petite quantité d'informations.

Deux exemples de fonction de hachage

MD4 et MD5

MD5 est une version améliorée de MD4, tous deux conçus par Ron Rivest (le R de RSA, photo ci-contre). MD signifie «Message Digest», qui peut être traduit par «empreinte» en français. MD4 et MD5 produisent des empreintes de 128 bits. MD5 est un peu lent que MD4. MD5 fait l'objet de la RFC 1321. Des faiblesses ont été trouvées et son utilisation se raréfie.

SHA-1

SHA signifie Secure Hash Algorithm et on utilise souvent le terme SHA-1 pour désigner la version. Cette fonction de hachage, elle aussi basée sur MD4, a été publiée par conjointement par la NSA et le NIST. Elle renvoie une empreinte de 160 bits. C'est l'un des algorithmes les plus utilisés avec le MD5. SHA-1 fait l'objet de la FIPS PUB 180-1. Il a déjà un successeur qui a pour nom SHS (Secure Hash Standard), décrit dans la FIPS PUB 180-2.


Le programme javascript ci-dessous va illustrer comment une petite modification d'un texte change complètement son empreinte. Après avoir calculé les empreintes du texte donné en exemple, remplacez le "é" par un "e" du texte clair pour voir la différence.

Texte
           
Empreinte MD4
Empreinte MD5
Empreinte SHA-1


L'un des exemples les plus étranges dans l'histoire des mathématiques de ce que l'on pourrait appeler une empreinte d'un document semble être dû à Newton. Entre 1673 et 1676 a commencé ce que Maor appelle la grande controverse entre Newton et Leibniz au sujet de la primauté de l'invention du calcul différentiel. Leibniz essayait de savoir ce que Newton savait. Ils ont échangé quelques courriers mais Newton, obsédé par l'idée qu'on puisse s'approprier une de ses découvertes, n'a finalement donné que peu d'informations à Leibniz. L'un des derniers messages de Newton, a priori très énigmatique, est le suivant:

6accdæ13eff7i3l9n4o4qrr4s8t12vx

Il s'agit en fait d'une sorte d'empreinte du message suivant:

data æquationae quotcunque fluentes quantitates involvente, fluxiones invenire : et vice versa.

On peut vérifier que ce message contient bien six fois le caractère "a", deux fois le caractère "c", etc. (u et v sont confondus).


Attaque des anniversaires

Combien faut-il réunir de personnes pour avoir 1 chance sur 2 que deux d'entre elles soient nés le même jour ? Si l'on pose cette question dans la rue, on aura beaucoup de réponses différentes. La plupart des gens pensent qu'il faudra 183 personnes (la moitié de 365). Il n'en est rien. En fait, il suffit de... 23 personnes!
Calculons la probabilité qu'aucune des personnes présentes ait le même anniversaire: nous avons 365 jours possibles pour le premier, 364 pour le deuxième et ainsi de suite. Ce qui nous donne, pour n personnes, 365·364·363·...·(365-n+1) cas favorables. Il y a bien sûr 365n cas possibles. Donc :

Or, cette probabilité tombe en dessous de 0.5 quand n=23.

Ce «paradoxe» a son importance en cryptographie, lorsqu'on étudie les fonctions de hachage. Pour que cette fonction soit fiable, il ne faut pas que l'on puisse produire deux textes aux sens très différents mais donnant la même empreinte.
Si l'empreinte est codée sur b bits, il y a 2b empreintes possibles. Si l'on prend k textes différents, la probabilité pour que deux textes aient la même empreinte est donc:

Combien l'attaquant doit-il essayer de textes avant de trouver la même empreinte avec une probabilité d'au moins 0.5? Le tableau suivant donne des valeurs pour différentes valeurs de b:

Nombre de bits
de l'empreinte (b)
Nombre
d'empreintes
Nombre de textes
à essayer (k)
825613
1665536213
324.3·10954562
641.8·10199.6·109
1283.4·10381.5·1019
1601.4·10481.0·1024
2561.1·10772.8·1038

On voit sur ce tableau qu'on a environ une chance sur deux de trouver deux textes à l'empreinte identique en en essayant un nombre de l'ordre de la racine carrée du nombre d'empreintes. On considère en général que, pour obtenir un niveau de sécurité correct, il faut prendre une taille d'empreinte d'au moins 128 bits.


Références


  Didier Müller, 27.1.21