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

Benutzer:
Passwort:

                                         

MD5-Antwort:


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