MD5
MD5 (Message Digest Algorithm 5) is een veelgebruikte cryptografische hashfunctie met een 128-bit hashwaarde. MD5 is als internetstandaard (RFC 1321) gebruikt in vele veiligheidstoepassingen en wordt ook gebruikt om de integriteit van bestanden te controleren. MD5 is ontworpen door Ronald Rivest in 1991 om de eerdere hashfunctie MD4 te vervangen. In 1996 werd er een fout in het MD5-ontwerp gevonden; hoewel het geen ernstige fout was werd het aanbevolen om andere algoritmen te gaan gebruiken zoals SHA-1 (hoewel recentelijk wordt gezegd dat ook deze fouten bevat).
In 2004 werden ernstigere fouten gevonden, waardoor het gebruik voor veiligheidstoepassingen twijfelachtig is. In oktober 2005 volgde de publicatie van de broncode van een programma waarmee 'collisions' gevonden kunnen worden. Dit programma genereert een brontekst die dezelfde hashwaarde oplevert als een gegeven hash. Gegeven voldoende rekentijd kan dit altijd, maar het geïmplementeerde algoritme is in staat om op een Pentium IV 1,6 GHz processor in 45 minuten een collision te genereren.
[bewerk] Pseudocode
Pseudocode voor het MD5 algoritme volgt.
//Opmerking: Alle variabelen hebben als type een 32-bits integer zonder teken tijdens de berekening //Definieer r als het volgende var int[64] r, k r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22} r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20} r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23} r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21} //Use binary fractional part of the sines of integers as constants: for i from 0 to 63 k[i] := floor(abs(sin(i + 1)) × 2^32) //Initialiseer variablen: var int h0 := 0x67452301 var int h1 := 0xEFCDAB89 var int h2 := 0x98BADCFE var int h3 := 0x10325476 //Voorbewerking: voeg "1" bit aan het bericht toe voeg "0" bits aan bericht toe totdat berichtlengte in bits ≡ 448 (mod 512) voeg lengte van bericht als 64-bit little-endian integer toe aan bericht //Verwerk het bericht in opeenvolgende blokken van 512-bit: for each 512-bit chunk of message break chunk into sixteen 32-bit little-endian words w(i), 0 ≤ i ≤ 15 //Initialiseer de hashwaarde voor dit blok: var int a := h0 var int b := h1 var int c := h2 var int d := h3 //Hoofdlus: for i from 0 to 63 if 0 ≤ i ≤ 15 then f := (b and c) or ((not b) and d) g := i else if 16 ≤ i ≤ 31 f := (d and b) or ((not d) and c) g := (5×i + 1) mod 16 else if 32 ≤ i ≤ 47 f := b xor c xor d g := (3×i + 5) mod 16 else if 48 ≤ i ≤ 63 f := c xor (b or (not d)) g := (7×i) mod 16 temp := d d := c c := b b := ((a + f + k(i) + w(g)) leftrotate r(i)) + b a := temp //Tel de hash van dit blok op bij het resultaat tot nog toe: h0 := h0 + a h1 := h1 + b h2 := h2 + c h3 := h3 + d var int digest := h0 append h1 append h2 append h3 //(uitgedrukt als little-endian)
Opmerking: In plaats van de formulering van de originele RFC 1321 zoals hier getoond kan het volgende gebruikt worden om de efficiëntie te verbeteren:
(0 ≤ i ≤ 15): f := d xor (b and (c xor d)) (16 ≤ i ≤ 31): f := c xor (d and (b xor c))
[bewerk] MD5 hashes
De 128-bit (16-byte) MD5 hashes worden meestal weergegeven als 32-cijferige hexadecimale getallen. Het volgende laat een 46-bytes ASCII invoer en de bijbehorende MD5 hash zien:
- MD5("Pa's wijze lynx bezag vroom het fikse aquaduct") = b06c0444f37249a0a8f748d3b823ef2a
Zelfs een kleine verandering in de tekst zal (naar grote waarschijnlijkheid) een compleet andere hash veroorzaken, bijvoorbeeld het vervangen van P naar M:
- MD5("Ma's wijze lynx bezag vroom het fikse aquaduct") = de1c058b9a0d069dc93917eefd61f510
De hash van een lege tekenreeks is:
- MD5("") = d41d8cd98f00b204e9800998ecf8427e
[bewerk] Zie ook
- MD2
- MD4
- SHA-familie