Algorytm MD5 jest następujący:
1. Doklejamy do wiadomości wejściowej bit o wartości 1
2. Doklejamy tyle zer ile trzeba żeby ciąg składał się z 512-bitowych bloków, i ostatniego niepełnego - 448-bitowego
3. Doklejamy 64-bitowy (zaczynając od najmniej znaczącego bitu) licznik oznaczający rozmiar wiadomości. W ten sposób otrzymujemy wiadomość złożoną z 512-bitowych fragmentów.
4. Ustawiamy stan początkowy na 0123456789abcdeffedcba9876543210
5. Uruchamiamy na każdym bloku (jest przynajmniej jeden blok nawet dla pustego wejścia) funkcję zmieniającą stan
6. Po przetworzeniu ostatniego bloku zwracamy stan jako obliczony skrót wiadomości
Funkcja zmiany stanu ma 4 cykle (64 kroki). Stan jest traktowany jako 4 liczby 32-bitowe, i w każdym kroku do którejś z tych liczb dodawany jest jeden z 16 32-bitowych fragmentów bloku wejściowego, pewna stała zależna od numeru kroku oraz pewna prosta funkcja boolowska 3 pozostałych liczb. Następnie liczba ta jest przesuwana cyklicznie o liczbę bitów zależną od kroku, oraz jest dodawana do niej jedna z pozostałych liczb.
Funkcje te to:
* W krokach 1 do 16 (cykl 1) funkcja F(x,y,z) = (x and y) or (neg x and z) (jeśli x to y, w przeciwnym wypadku z)
* W krokach 17 do 32 (cykl 2) funkcja G(x,y,z) = (x and z) or (y and neg z) (jeśli z to x, w przeciwnym wypadku y)
* W krokach 33 do 48 (cykl 3) funkcja H(x,y,z) = (x xor y xor z) (suma argumentów modulo 2, lub innymi słowy: czy występuje nieparzysta liczba jedynek w argumentach)
* W krokach 49 do 64 (cykl 4) funkcja I(x,y,z) = (y xor (x or neg z)) (jeżeli (z=1 i x=0) wtedy y, w przeciwnym wypadku nie y)
Podobną budowę mają funkcje skrótu MD4, SHA0 i SHA1 – różnią się one jedynie postacią funkcji zmieniającej stan, oraz rozmiarem stanu (160 bitów, czyli 5 32-bitowych rejestrów w SHA i SHA1, wobec 128 w MD4 i MD5).
Skróty 128-bitowe są zbyt krótkie, żeby zabezpieczyć przed generowaniem kolizji w oparciu o atak urodzinowy. Z tego powodu do większości zastosowań lepiej jest używać skrótów co najmniej 160-bitowych.
licencja: GNU FDL / źródło: Wikipedia.org
10.1.2007 - 21:23