OVH Cloud OVH Cloud

Un générateur de collisions MD5

3 réponses
Avatar
Xavier Roche
Il permet de trouver, en moins d'une heure, des collisions sur du MD5
(<http://www.stachliu.com/md5coll.c>) et quelques secondes pour du MD4
(<http://www.stachliu.com/md4coll.c>)

Voir aussi
<http://www.stachliu.com.nyud.net:8090/collisions.html>

3 réponses

Avatar
gla
sur le MD5, on trouve ca :

Q0[16] ^= mask22[random() % 30];

et le tableau ci contre.

const unsigned int mask22[30] = {
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000, 0x00080000,
0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x40000000
};



de toute évidence on pourrait accélerer le processus par :

Q0[16] ^= 1 << (random() % 30)

ou en enlevant la division et en agrandissant le tableau

Q0[16] ^= mask22[random() & 31];

ou les deux en modifiant légerement l'algo (pas sur que ca marche du coup!)

Q0[16] ^= 1 << (random() & 31)


"Xavier Roche" a écrit dans le message de
news: dlekh2$lj5$
Il permet de trouver, en moins d'une heure, des collisions sur du MD5
(<http://www.stachliu.com/md5coll.c>) et quelques secondes pour du MD4
(<http://www.stachliu.com/md4coll.c>)

Voir aussi
<http://www.stachliu.com.nyud.net:8090/collisions.html>


Avatar
Jacques Caron
Salut,

On Fri, 18 Nov 2005 12:36:44 +0100, gla wrote:

Q0[16] ^= mask22[random() % 30];

const unsigned int mask22[30] = {
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000, 0x00080000,
0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x40000000
};

de toute évidence on pourrait accélerer le processus par :

Q0[16] ^= 1 << (random() % 30)


1. C'est plus court à écrire, mais il est loin d'être évident que ce soit
plus rapide, suivant l'architecture.
2. La dernière valeur de la table ne respecte pas la règle...

Jacques.
--
Oxado http://www.oxado.com/

Avatar
gla
1. C'est plus court à écrire, mais il est loin d'être évident que ce soit
plus rapide, suivant l'architecture.


Tous les processeurs modernes possèdent un modul de décalage en barillet qui
met généralement 1 cycle pour decaller un registre quelquesoit le nombre de
rotation qu'on lui demande.

Alors que l'acces à un tableau demande un petit peu plus (calcul d'adresse,
chargement dasn le cache si ça n'y est pas, passage de la donnée dans le
bus...)

Quant a la routine de division pour obtenir le modulo, elle prend
généralement plusieurs cycles, voir même 10 sur un pentium.

2. La dernière valeur de la table ne respecte pas la règle...


Oui, c'est le problème.