Il modo più semplice per capire MD5 è implementarlo dalla specifica , che è piuttosto semplice.
In parole molto grezze:
-
I dati di hash sono una sequenza di bit. Mantieni le cose semplici, e supponiamo che sia una sequenza di byte . Alcuni byte aggiuntivi (il "padding") vengono aggiunti a quella sequenza, in modo che il numero di byte extra sia compreso tra 9 e 72 (inclusi) e la lunghezza totale dopo il riempimento sia un multiplo di 64. La specifica spiega il contenuto del imbottitura; in pratica un sacco di zeri e una codifica della lunghezza dei dati di input.
-
I dati inseriti vengono divisi in blocchi di 64 byte. I blocchi verranno elaborati uno per uno. L'elaborazione di ciascun blocco (64 byte) prende come input un valore di 128 bit (16 byte) che è l'output dell'elaborazione del blocco precedente e genera un nuovo valore di 128 bit.
-
Poiché il primo blocco non ha un blocco precedente, per avviare il processo viene utilizzato un valore fisso convenzionale. La specifica MD5 specifica questo valore.
-
L'output MD5 completo è il valore a 128 bit ottenuto dopo l'elaborazione dell'ultimo blocco.
L'elaborazione di un singolo blocco divide sia il valore a 128 bit ottenuto dal blocco precedente, sia il nuovo blocco da elaborare, in parole a 32 bit (4 parole per il valore precedente, 16 parole per il blocco). Tutti i calcoli sono fatti con queste parole a 32 bit. La struttura generale è stata descritta come un algoritmo di crittografia che giace su un lato: il blocco da 64 byte viene utilizzato come un tipo di chiave per crittografare lo stato di esecuzione a 128 bit, in uno schema Feistel generalizzato. Sono consapevole che tale affermazione non spiega realmente le cose - per ottenere veramente ciò che sta succedendo nell'algoritmo, utilizzare il tuo linguaggio di programmazione preferito e provare a implementarlo.
(Qualsiasi linguaggio dovrebbe andare bene per questo compito, dato che si tratta semplicemente di apprendimento, ma alcuni sono meno validi di altri.Ad esempio, i numeri di Javascript sono in realtà valori in virgola mobile, che sono scomodi per l'implementazione di MD5. sono utili per tali compiti, in particolare perché hanno tipi interi con una lunghezza garantita di 32 bit, esattamente ciò che è necessario per MD5.)
Potresti anche voler leggere questa risposta , che cerca di spiegare perché le funzioni di hash sono "a senso unico" "e prende MD5 come esempio, quindi include una descrizione di MD5.