L'algoritmo MD5

Dettaglio di un passaggio
Ricerca di collisioni
Riferimenti

L'algoritmo MD5 è stato disegnato da R. Rivest (la R nell'acronimo RSA) per produrre un digest, ossia una sequenza di byte unica per il messaggio fornito in input. La sigla MD sta per Message Digest. Qui spieghiamo cos'è MD5 in modo intuitivo ma dettagliato.

MD5 accetta in input un messaggio qualsiasi (anche binario) e di qualsiasi lunghezza; il testo può essere passato all'algoritmo un po' alla volta. L'output dell'algoritmo è costituito da una sequenza di 16 byte che si chiama il digest o hash MD5 del messaggio.

Dettaglio di un passaggio

Quelli che si vedono alla riga 0 del primo round sono i valori iniziali del digest. Nelle 16 righe successive ci sono i valori del digest durante le 16 operazioni che costituiscono il primo round.

Un passo dell'algoritmo consiste di quattro round, quindi 64 operazioni, per ogni blocco di 64 byte di testo del messaggio. Ma andiamo con ordine.

Che operazione viene fatta tra una riga e la successiva? Come si vede, cambiano quattro byte. In questo senso MD5 è un algoritmo a 32 bit: perché i byte vengono considerati a quattro per volta, interpretandoli come un numero tra 0 e 4294967295 (il più grande numero che si possa esprimere con quattro byte è 232-1).

Per ogni operazione vengono presi quattro byte di messaggio e sommati a un numero pseudo-casuale, i bit del risultato vengono ruotati e scambiati, anche a seconda dei valori correnti del digest. In questo modo, i nuovi quattro byte dipendono dal messaggio, ma dipendono anche da tutte le operazioni svolte sul digest fino a questo punto.

Durante il primo round i 64 byte del blocco corrente intervengono nel loro ordine naturale, ossia i primi 4 nella prima operazione, i secondi 4 nella seconda e così via. Nei tre round successivi l'ordine viene cambiato. I 64 numeri pseudo-casuali fissi (ricavati da π) che vengono sommati in ogni operazione vanificano la ricerca di collisioni basate su particolari regolarità del messaggio.

Quando tutto il messaggio è stato digerito, viene aggiunto un blocco di 64 byte che contiene la lunghezza del messaggio stesso.

Ricerca di collisioni

Due messaggi diversi danno luogo a una collisione quando generano un identico digest. Il numero di digest possibili, cioé le combinazioni di 16 byte diversi, sono 216x8, ossia circa 3x1038. È chiaro che, dato che invece i messaggi possibili sono infiniti, anche le possibili collisioni con un dato messaggio sono infinite. Tuttavia 3x1038 è un numero elevato: se ci limitiamo a considerare i messaggi scritti dall'uomo, bisognerebbe che un'umanità di 10 miliardi di individui in un periodo di 10'000 anni scriva centinaia di milioni di miliardi di messaggi al secondo per arrivare a quella cifra.

È relativamente più semplice trovare connessioni casuali: con circa 2x1019 messaggi casuali si ha una probabilità del 50% di trovare una collisione. Questo viene spiegato con lo stesso calcolo secondo cui è sufficiente raccogliere 23 persone per avere il 50% di probabilità che due di queste compiano gli anni lo stesso giorno. Questo tipo di ricerca di collisioni si chiama birthday attack.

Un perfezionamento di questa tecnica è stato messo a punto da Marc Stevens, che ha pubblicato un software, fastcoll, in grado di trovare collisioni tra due messaggi che condividono uno stesso prefisso. Il programma trova una collisione in pochi secondi, con un numero stimato di circa 1015 tentativi. Si veda Il progetto Chosen-prefix collisions (in inglese) dell'Università Tecnica di Eindhoven (NL)

Messaggio originale:
Nel mezzo del cammin di nostra vita
Mi ritrovai per una selva os

Messaggio variato ('M' minuscola nella seconda riga):
Nel mezzo del cammin di nostra vita
mi ritrovai per una selva os

MD5 del messaggio originale (esadecimale: ricordiamo che due caratteri esadecimali _cifre 0-9 o lettere a-f_ rappresentano un byte)

    c4 87 7f 10 79 ac 0e 3d 56 db 4a a6 11 37 85 94

  
Primo round per il messaggio originale
(la spiegazione è nel testo a fianco)

 0: 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10
 1: 84 8e 52 db 89 ab cd ef fe dc ba 98 76 54 32 10
 2: 84 8e 52 db 89 ab cd ef fe dc ba 98 79 c2 15 b0
 3: 84 8e 52 db 89 ab cd ef a9 c6 a5 e3 79 c2 15 b0
 4: 84 8e 52 db 42 98 d8 27 a9 c6 a5 e3 79 c2 15 b0
 5: 3b 85 bf 86 42 98 d8 27 a9 c6 a5 e3 79 c2 15 b0
 6: 3b 85 bf 86 42 98 d8 27 a9 c6 a5 e3 34 dd b3 81
 7: 3b 85 bf 86 42 98 d8 27 be 2b ed 84 34 dd b3 81
 8: 3b 85 bf 86 84 a8 74 7f be 2b ed 84 34 dd b3 81
 9: c3 c0 fc 43 84 a8 74 7f be 2b ed 84 34 dd b3 81
10: c3 c0 fc 43 84 a8 74 7f be 2b ed 84 2b 85 9b 32
11: c3 c0 fc 43 84 a8 74 7f e2 0d 5a 7b 2b 85 9b 32
12: c3 c0 fc 43 4b 0c 31 32 e2 0d 5a 7b 2b 85 9b 32
13: cc 67 13 7f 4b 0c 31 32 e2 0d 5a 7b 2b 85 9b 32
14: cc 67 13 7f 4b 0c 31 32 e2 0d 5a 7b fa 3f 2d 66
15: cc 67 13 7f 4b 0c 31 32 9b 5c 85 23 fa 3f 2d 66
16: cc 67 13 7f 78 b7 60 4e 9b 5c 85 23 fa 3f 2d 66

Il calcolo del digest MD5 per il messaggio originale e per quello variato.

Una riga orizzontale di pixel della figura rappresenta tutti i bit del digest (a due pixel per bit) con una tacca ogni 32 bit. La parte tra la prima e la seconda tacca equivale quindi alle 16 righe in esadecimale mostrate sopra.

Dall'alto verso il basso, si può vedere l'evoluzione del digest durante il calcolo. Le tacche lungo la verticale segnano l'inizio di ciascuno dei quattro round per i due passi dell'algoritmo.

Dato che il messaggio originale e quello variato differiscono di un solo bit, i due digest si mantengono uguali fino a metà del primo round. Alla decima operazione del primo round entra in gioco il bit diverso. Per la fine del primo round la differenza che era localizzata a metà della terza sequanza di 32 bit (le tacche orizzontali) si è già diffusa per tutto il digest.

colore originale variato bit
giallo   0 0 uguali
verdino   1 1
rosso   0 1 diversi
trasüdeciuk   1 0

Riferimenti

MD5 è il perfezionamento di MD4. Quest'ultimo, sempre ideato da Rivest, è la versione a 32 bit di MD2. In MD5, Rivest ha sacrificato un briciolo di efficienza per una maggiore sicurezza. Come risultato, MD5 è considerato tra i migliori algoritmi di digest, assieme a SHA-1, ritenuto ancora più sicuro.

Maggiori informazioni su MD5 sono disponibili in inglese nei siti ufficiali:

 

Inizio paginasu


Copyright (C) 2002-2008 Vesely Alessandro