Ich mach mal gerade ein kleines Beispiel:
Um Zahlen zu verschluesseln, nehme ich die folgende ausserordentlich komplizierte Hash-Funktion:
[latex] x \mapsto (x+6)^2 % 15 [/latex]
Also:
- Addiere 6
- Quadriere
- Nimm das Ergebnis modulo 15.
Du als Hacker kennst den Algorithmus und moechtest zu einem gegebenen Hash (also einer Zahl zwischen 0 und 14) ein(!) moegliches Urbild finden. Jetzt kannst Du:
A:
Eine Rainbow-Tabelle anlegen, also, vereinfacht, von alen "kleinen" Zahlen (was immer das genau heisst), die Hash-Werte ausrechnen, speichern, und dann mit vergleichen anfangen. Zu gegebenem Hashwert wuerdest Du immer nach maximal 15 Vergleichen ein Urbild finden.
B:
Dir den Algorithmus genau anschauen und folgendes feststellen:
x ist genau dann durch 3 teilbar, wenn der Hashwert durch 3 teilbar ist!
Grund:
1.: x+6 ist durch 3 teilbar gdw x durch 3 teilbar ist - klar.
2.: y^2 ist durch 3 teilbar gdw y durch 3 teilbar ist (Primfaktorzerlegung)
3.: z % 15 ist durch 3 teilbar gdw z durch 3 teilbar ist (klar - es wird nur ein Vielfaches von 15 - und damit von 3 - abgezogen).
Wenn Du das weisst, kannst Du es benutzen:
Wenn ein gegebener Hashwert durch drei teilbar ist, musst Du nur noch alle Zahlen als Urbilder testen, die durch 3 teilbar sind, und wirst damit schon nach hoechstens 5 statt 15 Versuchen fuendig.
Letzteres ist immer noch ein Algorithmus, der aufwaendig ist, aber es ist wesentlich(!) effizienter als der Rainbow-Angriff - wenn auch nur fuer bestimmte Hashwerte. Fuer andere Hashwerte gibt der Angriff etwas weniger her: wenn x Rest 1 oder 2 (mod 3) hat, dann wird der Hashwert in beiden Faellen Rest 1 (mod 3) haben, wegen des Quadrierens, und man muss bis zu zehn Urbilder nachgucken.
So kann man sich das vorstellen. Eine gute Hash-Funktion laesst keine Rueckschluesse vom Hashwert auf das Urbild zu und liefert damit keinen Ansatz wie oben. MD5 aber tut das.
Viele Gruesse,
der Bademeister