TP #3 : collisions de MD5

Transcription

TP #3 : collisions de MD5
TP #3 : collisions de MD5
Charles Bouillaguet
5 mars 2014
Pour ce TP nous mettons à votre disposition deux choses :
– Une implémentation en C de la fonction de hachage MD5
– Un algorithme (efficace) qui trouve des collisions sur MD5
Tout ceci se trouve dans une archive située à l’adresse :
http://ftpweb.fil.univ-lille1.fr/~bouillaguet/tp_md5.tar.gz
Ce document lui-même est accessible à l’adresse :
http://ftpweb.fil.univ-lille1.fr/~bouillaguet/tp_md5.pdf
1
Implémentation de référence de MD5
Elle se trouve dans les fichiers md5.c et md5.h. Ce code est (largement) celui de l’implémentation
de référence, qu’on trouve dans la RFC correspondance (http://www.ietf.org/rfc/rfc1321.
txt).
Voici un extrait de son interface, et un résumé de son fonctionnement :
/* MD5 context. */
typedef struct {
uint32_t state[4];
/* state (ABCD) */
uint32_t count[2];
/* number of bits, modulo 2^64 (lsb first) */
unsigned char buffer[64];
/* input buffer */
} MD5_CTX;
void MD5Init (MD5_CTX * context);
void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen);
void MD5Final (unsigned char digest[16], MD5_CTX *context);
void MD5Transform (uint32_t state[4], unsigned char block[64]);
– Comme le hachage d’une grande quantité de donnée est un processus qui ne peut pas forcément
s’accomplir d’un seul coup, les appels à MD5 se font en passant un contexte, qui contient
—entre autre—l’état interne actuel de la fonction, ainsi que le nombre de bits déjà hachés.
– La fonction MD5Init sert à initialiser un tel contexte (en gros, ça fixe l’état interne de la
fonction au vecteur d’initialisation).
– Pour hacher des données, on invoque la fonction MD5Update en lui passant un contexte,
un pointeur vers les données à hacher, et le nombre d’octets à hacher. Il peut y en avoir un
nombre arbitraire, et la fonction peut se servir de la fonction de compression plusieurs fois (ou
même zéro fois si vous ne fournissez pas assez de données).
– Pour obtenir l’empreinte, on invoque la fonction MD5Final. Cette dernière met en place le
schéma de bourrage, puis calcule l’empreinte avec un dernier appel de la fonction de compression.
– La fonction de compression elle-même est MD5Transform.
Pour fixer les idées, la fonction MDFile du fichier main.c prend en argument le nom d’un fichier
et affiche son empreinte. Elle fait donc la même chose que le programme md5sum qui est présent
de manière standard sur les systèmes Unix — et en principe elle calcule le même résultat !.
1
2
Algorithme de recherche de collisions
Ce code, qui date de 2006, a été écrit par Marc Stevens pendant son Master. Il est devenu
aujourd’hui l’un des meilleurs spécialistes mondiaux des collisions sur MD5 et ses dérivés (cf.
https://marc-stevens.nl/research/).
Ce code fabrique, à partir d’une valeur de l’état interne arbitraire, deux messages qui collisionnent. Les messages font deux blocs 1 de long, soit 2 × 64 octets :
m0
h1
m1
h0
h2
m00
h01
m01
La procédure est randomizée, donc son temps d’exécution peut varier, et le résultat est largement
aléatoire.
La seule fonction qu’on peut invoquer est décrite par le fichier coll.h et c’est :
void find_collision(const uint32_t IV[],
uint32_t msg1block0[], uint32_t msg1block1[],
uint32_t msg2block0[], uint32_t msg2block1[],
int verbose);
En gros, elle prend un état interne en premier argument, et renvoie les quatre blocs m0 , m00 , m1 , m01
dans les quatre tableaux passés en paramètres. Si on veut voir la progression du calcul on peut
passer une valeur non-nulle au dernier argument.
Le code de cette fonction se trouve réparti dans plusieurs fichiers dans le dossier coll_finder. Il
y a un Makefile qui va produire une librairie statique libcoll.a, qui peut ensuite être utilisée
facilement (mais regardez les deux Makefile car ils font déjà tout le boulot).
Digression
Il faut noter qu’il existe aussi des code de recherche de collision qui fabriquent des collisions à
partir d’états internes différents :
h0
M
h1
h00
M0
Cependant ces codes sont d’une complexité beaucoup plus grande (48h de calcul sur un cluster
de 215 consoles PlayStation 3 à l’Ecole Polytechnique Fédérale de Lausanne, en Suisse). Plus de
détails sur https://code.google.com/p/hashclash/.
3
Travail à faire : Partie I (échauffement)
. Question 1: Ecrivez un programme qui prend en argument le nom d’un fichier F , dont la taille
est un multiple de 64 octets et qui produit deux fichiers A et B de 128 octets chacuns, de contenus
différents et tels que M D5(F k A) = M D5(F k B).
1. Ce même Marc Stevens a gagné en 2012 un prix de $10’000 pour avoir fabriqué des collisions d’un seul
bloc, et le code source de son algorithme est public, cependant la complexité du processus est de l’ordre de 250
évaluations de la fonctions de compression : c’est trop long pour nous !
2
. Question 2: Téléchargez les deux fichiers HTML accessibles aux adresses http://fr.wikipedia.
org/wiki/MD5 et http://fr.wikipedia.org/wiki/Collision_(cryptologie). Ensuite, produisez deux fichiers qui ont la même empreinte par MD5, qui commencent par la première page
web et qui finissent par la seconde.
. Question 3: Fabriquez 16 fichiers tous différents ayant la même empreinte MD5. Voici un indice :
combien y a-t-il de chemins différents dans ce graphe entre le noeud IV à gauche et le noeud h3
à droite ?
m0
h0
IV
m00
4
m1
m2
h1
m01
m3
h2
m02
h3
m03
Travail à faire : Partie II (les choses sérieuses)
Autant trouver des collisions est facile sur MD5, autant trouver des préimages ou des secondes
préimages est aujourd’hui hors de portée. On rappelle qu’un adversaire en seconde-préimage
est un programme qui prend en entrée une chaine de bits M , et qui en produit M 0 6= M qui
collisionne avec M (en gros, c’est une collision où un des deux messages est imposé).
Le but de ce TP est de programmer l’attaque du message empoisonné (« Trojan Message Attack »), dont l’idée est due à John Kelsey en 2009. Il s’agit d’une attaque où tout se passe comme
si on fabriquait des secondes préimages, alors qu’en fait on utilise juste des collisions.
Voici une description superficielle :
– On part d’un nombre fini de préfixes P1 , P2 , . . . , Pk .
– On fabrique un suffixe empoisonné S.
– On sera capable de produire des secondes préimages de chacun des messages Mi = Pi k S
obtenus en concatenant l’un des préfixe avec le suffixe empoisonné.
. Question 4: Quand il n’y a qu’un seul préfixe, c’est très facile. Expliquez comment on pourrait
s’y prendre.
Par contre, dès qu’il y a deux préfixes ou plus, on ne peut plus utiliser de technique élémentaire,
et il faut ruser.
Dans ce TP, les préfixes ont été générés par nos soins. Il s’agit d’une variante de la fameuse
arnaque nigériane, dans laquelle vous recevez un email (qui provient généralement du nigéria),
qui vous demande de fournir vos coordonnées bancaires en échange de la promesse d’un pactole
faramineux. Vous pouvez voir un exemple en annexe de ce document. Nous avons généré 54
préfixes en remplaçant « Dear Winner » par une salutation personnalisée contenant chacun de
vos noms. Les prefixes se trouvent dans le dosser prefixes de l’archive. Notez que pour vous
simplifier la vie, leur taille est un multiple de 64 octets.
Pour produire le suffixe empoisonné, on utilise la procédure suivante.
a. On calcule k collisions (Ai , Bi ) en utilisant cet algorithme :
1: function Collision-Trojan-Suffix(P1 , . . . , Pk )
2:
for i = 1 to k do
3:
hi [0] = MD5-No-Padding(Pi )
4:
for i = 1 to k do
5:
(Ai , Bi ) ← CollisionFinder(hi [i − 1])
6:
for j = 1 to k do
7:
hj [i] ← CompressionFunction (hj [i − 1], Ai )
8:
return (A1 , B1 ), . . . , (Ak , Bk )
b. On fabrique le suffixe S = A1 k . . . k Ak .
c. Pour fabriquer une seconde préimage de Mi = Pi k S on renvoie :
M 0 = Pi k A1 k . . . k Ai−1 k Bi k Ai+1 k . . . k Ak
3
A1
IV
P1
h1 [0]
B1
h1 [1]
A2
h1 [2]
A3
h1 [3]
A4
h1 [4]
A2
IV
P2
h2 [0]
A1
h2 [1]
B2
h2 [2]
A3
h2 [3]
A4
h2 [4]
A3
IV
P3
h3 [0]
A1
h3 [1]
A2
h3 [2]
B3
h3 [3]
A4
h3 [4]
A4
IV
P4
h4 [0]
A1
h4 [1]
A2
h4 [2]
A3
h4 [3]
B4
h4 [4]
Figure 1 – Illustration graphique de la fabrication du suffixe empoisonné.
Comme tout ceci est un peu compliqué, le petit dessin de la figure 1 vaut mieux que de longs
discours. Après avoir haché chacun des préfixes (sans utiliser de schéma de bourrage), on construit
une colonne après l’autre. Lors de la i-ème étape, on produit une collision « sur la diagonale », et
on se sert de l’un des deux messages obtenus (Ai ) pour faire passer toutes les lignes à la colonne
d’après.
En regardant le dessin, on voit bien que pour chaque préfixe, on a deux suffixes possibles qui
aboutissent à une collision : celui qui qui consiste à ne prendre que les Ai , et celui qui consiste à
prendre les Ai sauf au bon endroit.
. Question 5: Fabriquez le suffixe empoisonné S.
. Question 6: Fabriquez les 54 messages Mi = Pi k S.
. Question 7: Fabriquez une seconde préimage de chacun d’entre eux ! N’oubliez pas de vérifier
que les secondes préimages sont correctes.
4
Figure 2 – Le texte des préfixes — « Winner » est remplacé par vos noms
Dear Winner,
This is to inform you that you have been selected for a cash prize of
1,000,000.00 (British Pounds) held on the 5th of March 2014 in London
UK. The selection process was carried out through random selection in
our computerized email selection system(ess) from a database of over
250,000 email addresses drawn from which you were selected. Your
e-mail address emerged as one of two winners in the category "A"
with the following winning information:
REF No: UKNL-L/200-26937
BATCH No: 2005MJL-01
TICKET No: 20511465463-7644
SERIAL No: S/N-00168
LUCKY No: 887-13-865-37-10-83
The BRITISH UK. Lottery is approved by the British Gaming Board. To
begin the processing of your prize you are to contact our fiduciary
claims department for more information as regards procedures to claim
your prize.
Mr. Eric Wegrzynowski
Tel: +33-3-20-43-69-73
Email: [email protected]
Contact him by sending him with the under listed informations
1. Name in full:
2. Home Address:
3. Age:
4. Occupation:
5. Company:
6. Phone Number:
7. Present Country:
8. Nationality:
9. Sex:
10. Winning Email:
Congratulations once more from our members of staff and thank you
for being part of our promotional program.
Sincerely,
Mr Charles Bouillaguet
for UK NATIONAL LOTTERY.
NOTE: You are to contact your officer immediately with the official
EMAIL ADDRESS: [email protected]
5

Documents pareils