Dark ITSec
MD5 RFC
MD5 ist ein in Authentifikationsprotokollen verwendeter Algorithmus, der auf
einer Einwegübertragung mittels Hashfunktion und eines Schlüssels basiert. Daher
können aus dem Ergebnis keine Rückschlüsse auf den Schlüssel erfolgen. Dem
Verfahren nach wird aus einer beliebig langen Nachricht eine 128 Bit lange
Information, der Message Digest, gebildet, der an die unverschlüsselte Nachricht
angehangen wird. Der Empfänger vergleicht den Message Digest mit dem von ihm aus
der Information ermittelten Wert.
The MD5 Message Digest Algorithm RFC 1321
HMAC-MD5 wird in RFC 2104
MD5 ist eine
Einweg-Hashfunktion, die von Ron Rivest entworfen wurde. Es ist die verbesserte
Version von MD4. MD steht für Message Digest, was soviel wie Zusammenfassung
einer Nachricht bedeutet.
MD5 liefert einen Hashwert (oder Message Digest) der Länge 128Bit. Der
Eingabetext wird in Blöcke von 512 Bits verarbeitet und in 16 Blöcke der Länge
32Bit aufgeteilt. Die Ausgabe besteht aus vier 32-Bit-Blöcken, die zusammen
einen 128Bit langen Hashwert ergeben.
Die Nachricht wird so aufgeteilt, dass die Länge einem Vielfachen von 512
minus 64Bit entspricht. Aufgefüllt wird die Nachricht mit einer 1 am Ende und so
vielen Nullen wie nötig.
Vor dem Auffüllen wird noch eine 64-Bit-Darstellung der Länge angehängt.
Somit haben wir die Länge der Nachricht auf ein Vielfaches von 512Bit gebracht.
Anschliessend werden vier 32Bit Variablen (Verkettungsvariablen) initialisiert:
A = 0*01234567
B = 0*89abcdef
C = 0*fedcba98
D = 0*76543210
Nun beginnt die Hauptschleife, die für alle 512Bit-Blöcke wiederholt wird:
Zuletzt werden die Variablen abcd zu ABCD addiert und es beginnt die Verarbeitung des nächsten Blocks. Die Ausgabe schliesslich, besteht aus einer Zusammensetzung von A, B, C, D.
Sicherheit:
Eine Kollision bedeutet: Zwei verschiedene Nachrichten produzieren den gleichen
Hashwert.
Der Hashwert ist 128Bit lang, er kann daher 2^128 verschiedene Ausgabewerte
annehmen. Bei 2^128+1 verschiedenen Nachrichten haben zwangsläufig zwei
Nachrichten den gleichen Hashwert. Es sollte allerdings nicht einfach sein
solche Kollisionen zu finden. Diese Erkenntnisse liefern jedoch nicht
automatisch einen Angriff gegen MD5 oder beeinträchtigen die Sicherheit im
praktischen Einsatz.
JavaSkript md5.js |
<html> <head> <title>Login</title> <script language="javascript" src="md5.js"></script> <script language="javascript"> <!-- function doChallengeResponse() { str = document.login.username.value+"*"+document.login.password.value; document.login.response.value = MD5(str); document.login.password.value = ""; } // --> </script> </head> <body> <form name="login"> Benutzer: <input type="text" name="username" size=32 maxlength=32><br> Passwort: <input type="password" name="password" size=32 maxlength=32><br> <input onClick="doChallengeResponse(); return false;" type="submit" name="submitbtn" value="Login now"> MD5-Antwort: <input type="text" name="response" value="" size=32> </form> </body> </html> Beispiel |
PHP
string md5 ( string str)
Berechnet den MD5-Code von
str unter Verwendung des RSA Data Security,
Inc. MD5 Message-Digest Algorithmus.
string md5_file ( string filename)
Berechnet den MD5-Code zu eine datei in filename unter Verwendung des RSA
Data Security, Inc. MD5 Message-Digest Algorithmus.
PERL MD5 in 8 Zeilen
#!/bin/perl -iH9T4C`>_-JXF8NMS^$#)4=@<,$18%"0X4!`L0%P8*#Q4``04``04#!P`` ~JLA
@A=unpack N4C24,unpack u,$^I;@K=map{int abs 2**32*sin$_}1..64;sub L{($x=pop)
<<($n=pop)|2**$n-1&$x>>32-$n}sub M{($x=pop)-($m=1+~0)*int$x/$m}do{$l+=$r=read
STDIN,$_,64;$r++,$_.="\x80"if$r<64&&!$p++;@W=unpack V16,$_."\0"x7;$W[14]=$l*8
if$r<57;($a,$b,$c,$d)=@A;for(0..63){$a=M$b+L$A[4+4*($_>>4)+$_%4],M&{(sub{$b&$c
|$d&~$b},sub{$b&$d|$c&~$d},sub{$b^$c^$d},sub{$c^($b|~$d)})[$z=$_/16]}+$W[($A[
20+$z]+$A[24+$z]*($_%16))%16]+$K[$_]+$a;($a,$b,$c,$d)=($d,$a,$b,$c)}$v=a;for(
@A[0..3]){$_=M$_+${$v++}}}while$r>56;print unpack H32,pack V4,@A # RSA's MD5