it-swarm.com.de

Hat jeder Hashwert einen inversen Wert?

Es gibt viele verschiedene Hash-Funktionen, md5, sha und andere. Sie nehmen einen Wert V an und erzeugen einen H über die Transformation Function(V) = H, wobei Function md5, sha usw. ist.

Meine Frage ist: Hat jeder Hashwert H einen Wert V?

Beispiel: md5-Hashwert f2c057ed1807c5e4227737e32cdb8669 (völlig zufällig), können wir herausfinden, woraus es war?

Mit anderen Worten, wenn wir alle Hashes auflisten:

00000000000000000000000000000000
00000000000000000000000000000001
...
fffffffffffffffffffffffffffffffe
ffffffffffffffffffffffffffffffff

Können wir für jeden einen Wert finden?

Bearbeiten (aus dem Kommentar von OP): Ich möchte wissen, ob für jede mögliche Ausgabe eine Eingabe vorhanden ist. Ich bin nicht daran interessiert, das Gegenteil zu finden

34
bodacydo

Meine Frage ist: Hat jeder Hashwert H einen Wert V?

Können wir beispielsweise bei gegebenem md5-Hashwert f2c057ed1807c5e4227737e32cdb8669 (völlig zufällig) herausfinden, woraus er stammt?

Dies sind tatsächlich zwei sehr unterschiedliche Fragen: ob es für jede Ausgabe eine Eingabe gibt und ob wir finden an Eingang für jeden Ausgang.

Für Ihre erste Frage: wissen wir nicht. Für eine gegebene Hash-Funktion ist die Anzahl möglicher Eingaben viel größer als die Anzahl möglicher Ausgaben, so dass wir es sehr überraschend finden würden, wenn die Funktion nicht surjektiv wäre (d. H. Wenn es eine Ausgabe ohne übereinstimmende Eingabe gäbe). Bei MD5 gibt es beispielsweise 2128 mögliche Ausgänge und 218446744073709551616-1 mögliche Eingaben, daher erwarten wir, dass jede Ausgabe im Durchschnitt etwa 2 hat18446744073709551488 entsprechende Eingänge. Es ist eher unplausibel, dass es eine Ausgabe ohne entsprechende Eingabe gibt.

Wir wissen jedoch nicht, wie wir das beweisen sollen. Wir erwarten weitgehend, dass die Eigenschaft für eine konkrete Hash-Funktion nur sehr schwer nachzuweisen ist (ein solcher Beweis der Surjektivität wäre per se keine Schwäche der Funktion, aber handwavend hängt die Sicherheit einer Hash-Funktion ab über die Unlösbarkeit seiner Struktur im Hinblick auf diese Art der Analyse).

Für Ihre zweite Frage: hoffen wir sehr, dass dies nicht möglich ist. Dies nennt man Vorbildwiderstand: Für eine gegebene Ausgabe y sollte es rechnerisch nicht machbar sein, ein x Zu finden = so dass h ( x) = y. Selbst wenn mathematisch bewiesen wurde, dass eine solche Eingabe existieren muss (es ist nicht bewiesen, aber es wird stark vermutet, wie oben erläutert), sollte es dennoch grausam teuer sein, sie tatsächlich zu finden.

Wenn die Hash-Funktion "ideal" ist, ist der bestmögliche Angriff Glück: Sie probieren mögliche Eingaben aus, bis eine Übereinstimmung gefunden wird. Wenn die Ausgabe die Größe n Bits hat, sollte "Glück" mit einem durchschnittlichen Aufwand von 2 funktionieren n;; mit n groß genug (und n = 128 ist groß genug) ist dies ein Ausweg aus dem, was getan werden kann mit vorhandenen Computern. Eine Hash-Funktion soll gegen Vorbilder resistent sein, wenn "Glück" immer noch der bekannteste Angriff ist.

Es ist bekannt, dass MD5 nicht idealerweise resistent gegen Vorbilder ist, da ein Angriff mit Mühe 2123.4 wurde gefunden - ungefähr 10 mal schneller als 2128, aber immer noch ein langer Weg in den Bereich der Unmöglichkeit, so dass dieser Angriff nur theoretisch ist.

Ich möchte jedoch auf zwei Dinge hinweisen:

  • Wenn ich dir h ( x) für ein unbekanntes x gebe, hast du aber eine Vorstellung von dem x, das ich verwendet habe (z. B. Sie wissen, dass x ein "Passwort" ist, das ein menschlicher Benutzer auswählen und sich merken kann), dann können Sie versuchen, möglich x Werte, die dieser Idee entsprechen. Der tatsächliche durchschnittliche Aufwand zum Finden eines Vorbilds für h ( x) ist der kleinere von 2 n und [~ # ~] m [~ # ~]/2, wobei [~ # ~] m [~ # ~] die Größe der ist Raum möglicher Eingaben x. Für einen "rohen" Preimage-Angriff sind alle Folgen von Bits mögliche Eingaben, daher ist [~ # ~] m [~ # ~] riesig und die Kosten betragen 2 n. Wenn jedoch in einem bestimmten Kontext bekannt ist, dass x aus einem relativ kleinen Raum herausgenommen wird, kann das Finden des "richtigen" x wesentlich sein schneller.

  • Wie oben erwähnt, sollten Vorbilder nicht eindeutig sein: Für ein gegebenes y Sollte eine große Anzahl von Werten x existieren, der Hash zu y. Somit finden Sie für eine gegebene Ausgabe nicht "die" entsprechende Eingabe, sondern "eine" entsprechende Eingabe, die die "richtige" sein kann oder nicht.


Und die dritte Frage? In der Tat ist der Versuch, eine vollständige Karte der Ein- und Ausgänge zu erstellen, noch etwas anderes.

Wie @Xander hervorhob, die Anzahl der möglichen MD5-Ausgänge (2128) ist zu groß, um irgendwo auf der Erde gespeichert zu werden; Es überschreitet die kumulierte Größe aller Festplatten, die jemals gebaut wurden. Wenn Sie jedoch könnten dieses Speicherproblem lösen, können Sie über die Kosten für die Erstellung einer vollständigen Karte nachdenken.

Wenn Sie den "Glück" -Angriff unabhängig auf alle 128-Bit-Ausgänge anwenden, können Sie mit Gesamtkosten von 2 rechnen256 (2128 mal 2 kosten128). Sie können es jedoch viel besser machen, indem Sie alle Ausgaben gleichzeitig verarbeiten, d. H. Zufällige (oder sequentielle) Eingaben ausprobieren und einfach Ihre große Tabelle füllen, während Sie die Ausgaben erhalten. Mit Mühe 2128sollten Sie ungefähr 63% Ihrer gesamten Karte erhalten, während die "unabhängige Glücks" -Methode einen Aufwand von etwas mehr als 2 erfordern würde255 um das gleiche Ergebnis zu erzielen.


Edit: Wie von @Owen und @kasperd hervorgehoben, reichen die Argumente zur Anzahl der Eingaben nicht aus, um Surjektivität zu induzieren. Die interne Funktionsstruktur ist wichtig. MD5 und SHA-1 sind Merkle - Damgård Funktionen, was bedeutet, dass sie wie folgt aufgebaut sind:

  • Es gibt eine innere Pseudozufallspermutation [~ # ~] p [~ # ~]: für einen Eingabeblock b einer gegebenen Größe (512 Bits in der Fall von MD5 und SHA-1), [~ # ~] p [~ # ~] b ist eine Permutation des Raums von Sequenzen von genau n Bits ( n = 128 für MD5, n = 160 für SHA-1).

  • Eine Komprimierungsfunktion ist definiert als:

    f ( b, x) = [~ # ~] p [~ # ~] b( x) + x

    Das heißt, für Block b Wenden wir die Permutation entsprechend b auf die zweite Eingabe x an, und dann wir "add" x zur Ausgabe dieser Permutation. (Im Fall von MD5 und SHA-1 erfolgt diese Addition auf 32-Bit-Word-Basis, aber die Details spielen hier keine Rolle.)

  • Um eine vollständige Eingabenachricht zu verarbeiten m, wird die Nachricht zuerst mit zusätzlichen Bits aufgefüllt, so dass die Gesamtgröße ein Vielfaches der Blockgröße wird und auch die ursprüngliche Nachrichtenlänge codiert. Die aufgefüllte Eingabe wird dann in aufeinanderfolgende Blöcke aufgeteilt b, b1, und so weiter. Ein Register r wird auf einen herkömmlichen Wert der Größe n Bits (das in den MD5- und SHA-1-Standards spezifizierte "IV") initialisiert. Blöcke werden dann einzeln verarbeitet: um Block b zu injizieren iberechnen wir f ( b i, r), und die Ausgabe ist der neue Wert von r. Wenn alle Blöcke verarbeitet wurden, enthält r Die vollständige Ausgabe der Hash-Funktion.

Der Additionsschritt in der Komprimierungsfunktion dreht die pseudozufällige Permutation [~ # ~] p [~ # ~] b in ein Pseudozufall Funktion. Eine relevante Konsequenz ist, dass für einen gegebenen Wert b, f ( b, x) ist sehr unwahrscheinlich surjektiv. Tatsächlich erwarten wir für alle 2 Werte f ( b, x) n Eingänge x, um nur etwa 63% aller möglichen 2 abzudecken n Folgen von n Bits.

Diese Verarbeitung hat interessante Konsequenzen. Betrachten Sie zunächst alle Eingänge mit einer Größe von genau 1 GB (das "traditionelle" Gigabyte von genau 1073741824 Byte): Es gibt 28589934592 solche Sequenzen, d. h. viel mehr als 2128. Wenn Sie jedoch MD5 auf alle diese Nachrichten anwenden, werden alle mit genau einem zusätzlichen Block aufgefüllt (8589934592 = 16777216 × 512, sodass ein zusätzlicher Block der Größe 512 angehängt wird), und außerdem ist dieser letzte Block derselbe für alle 1-GB-Eingänge (es codiert die Eingangslänge, ist aber ansonsten deterministisch, ohne Zufälligkeit und ohne Abhängigkeit von den Werten der Eingangsbits). Nennen wir b z dieser letzte Block. MD5 in einer 1-GB-Eingangsnachricht m beginnt daher mit viel Verarbeitung in den ersten 16777216-Blöcken, was zu einem 128-Bit-Wert x und dem führt Die Hash-Ausgabe MD5 ( m) ist gleich f ( b z, x).

Daher reduzieren sich alle 1-GB-Nachrichten letztendlich auf eine einzelne der Komprimierungsfunktionen same f ( b z, x). Wir erwarten daher, dass die Hash-Ausgaben nur etwa 63% aller 128-Bit-Sequenzen abdecken. Dieses Beispiel zeigt, dass das Argument für die Anzahl der Eingaben in die Hash-Funktion unvollständig ist (obwohl es die richtige Idee liefert).

Wenn wir dagegen alle Nachrichten mit einer Länge von genau 300 Bit betrachten, werden sie alle als f ( b, IV) mit 2 gehasht300 verschiedene Blöcke b. Wir haben also 2300 pseudozufällige Permutationen [~ # ~] p [~ # ~] b, alle an denselben 128-Bit-Eingang (IV) angelegt, was 2 ergibt300 128-Bit-Ergebnisse, die alle gleichmäßig über den Raum der 128-Bit-Werte verteilt sein sollen. Das Hinzufügen von IV zu allen ändert nichts an dieser Einheitlichkeit. In diesem Fall funktioniert das Zählargument und somit wird die Sujektivität sehr wahrscheinlich.


Edit 2: Über die "63%". Wenn Sie einen zufälligen Wert gleichmäßig in einem Raum der Größe [~ # ~] n [~ # ~] erzeugen, ist die Wahrscheinlichkeit, einen bestimmten Wert zu treffen x ist 1/ [~ # ~] n [~ # ~]; Somit ist die Wahrscheinlichkeit, dass nicht einen bestimmten Wert trifft x ( [~ # ~] n [~ # ~] = -1)/ [~ # ~] n [~ # ~].

Versuchen Sie es jetzt [~ # ~] n [~ # ~] Mal: ​​Sie generieren [~ # ~] n [~ # ~] Werte zufällig, einheitlich und unabhängig (insbesondere können Sie mehrmals den gleichen Wert generieren). Für ein gegebenes x ist die Wahrscheinlichkeit, nicht Teil dieser [~ # ~] n [~ # ~] Werte zu sein, die Wahrscheinlichkeit, übersehen worden zu sein [~ # ~] n [~ # ~] mal, dh:

[~ # ~] p [~ # ~] = (( [~ # ~] n [~ # ~] - 1)/ [~ # ~] n [~ # ~]) [~ # ~] n [~ # ~].

Dies kann wie folgt angenähert werden:

[~ # ~] p [~ # ~] = e [~ # ~] n [~ # ~] ln (1-1/ [~ # ~] n [~ # ~]) = e [~ # ~] n [~ # ~] (- 1/ [~ # ~] n [~ # ~] + o(1)) = e-1 + o (1)

Bei großen Werten von [~ # ~] n [~ # ~] Nähert sich die Wahrscheinlichkeit, dass ein bestimmter Wert verfehlt wird, 1/ e. Daher ist die erwartete Abdeckung des Raums der Größe [~ # ~] n [~ # ~], mit [~ # ~] n [~ # ~] zufällige Werte, wären nahe 1- (1/ e). Dies sind ungefähr 63,21%.

60
Thomas Pornin

Dies sind eigentlich sehr häufige Fragen, die Leute über Hash-Funktionen stellen. Ich werde eine mathematischere Antwort geben, einschließlich einiger Begriffe, die Ihnen beim Googeln helfen sollen.

Meine Frage ist: Hat jeder Hashwert H einen Wert V?

Die mathematische Art, diese Frage zu formulieren, ist

Hat für eine Hash-Funktion H = Function(V) jede Ausgabe H ein Vorbild V, das ihr zugeordnet ist?

oder kompakter,

Ist eine Hash-Funktion Function() surjektiv?

Ob MD5, SHA-1, SHA-256, SHA-3 usw. sind surjektiv ist eine gute Frage, die im Internet oft gestellt wurde (Google kann Ihnen einige gute Diskussionen finden). Die kurze Antwort lautet: Wir wissen es nicht . Wir vermuten stark, dass dies der Fall ist, aber dies konnten wir weder mathematisch noch durch Experimente beweisen.

Um Ihnen eine Vorstellung davon zu geben, warum dies eine schwierige Frage ist; diese Antwort auf CS.se spricht über MD5 und weist darauf hin, dass Hash-Funktionen so konzipiert sind, dass sie sehr zufällig sind und keine Muster enthalten, was jede Art von mathematischer Analyse sehr schwierig macht. Sie können jederzeit ein Programm schreiben, um Eingaben zu erraten, bis Sie alle möglichen Ausgaben gesehen haben. MD5 hat ein 128-bit Ausgabe, was bedeutet, dass es 2 gibt128 Hashes, die Sie treffen müssen. Angenommen, Sie haben sie alle beim ersten Versuch erhalten und könnten 1 pro Sekunde überprüfen, dann würden Sie ungefähr 10) benötigen31 Jahre und mindestens 1028 GB Festplattenspeicher , um die vollständige Überprüfung durchzuführen (beachten Sie, dass das Universum auf ~ 10 geschätzt wird10 Jahre alt, und die gesamte Festplattenkapazität auf der Erde beträgt etwa 1012 gb).

Hash-Funktionen in der SHA- Familie haben größere Ausgaberäume und sind mathematisch komplexer, was bedeutet, dass diese Art der Analyse für sie noch weniger nachvollziehbar ist.

Da eine Hash-Funktion eine Eingabe beliebiger Größe aufnimmt und eine Ausgabe fester Größe liefert, kann es (theoretisch) eine unendliche Anzahl von Eingaben geben, die einem bestimmten Hash zugeordnet werden. Ein Hash-Wert H hat also wahrscheinlich eine große Menge von Werten {V1, V2, ...} diese Karte dazu.


Für den zweiten Teil Ihrer Frage:

gegebener md5 Hashwert f2c057ed1807c5e4227737e32cdb8669 (völlig zufällig), können wir [die Menge der Eingaben finden, die es erzeugen würden]?

Das Finden einer Zeichenfolge, die einen bestimmten Hash erzeugt, ist eine Form der Krypanalyse, die als Preimage Attack bezeichnet wird. Wie andere bereits betont haben, muss eine Hash-Funktion, um als kryptografische Hash-Funktion betrachtet zu werden, resistent gegen Preimage-Angriffe sein - oder mit anderen Worten, es muss unmöglich sein, sie umzukehren, außer die Liste aller zu übernehmen mögliche Zeichenfolgen, Hashing und prüfen, ob sie übereinstimmen.

Wenn jemand eine Verknüpfung findet, um einen Hash schneller zu invertieren als alle möglichen Zeichenfolgen zu überprüfen, wird dies als Sicherheitslücke in dieser Hash-Funktion und diese Hash-Funktion als "defekt" angesehen. MD5 gilt als fehlerhaft und wird für die kryptografische Verwendung nicht mehr empfohlen, sodass Sie möglicherweise bekannte Preimage-Angriffe darauf finden können. Wenn Sie diese nachschlagen, finden Sie möglicherweise Tools, mit denen Sie Ihre MD5 Hashes. Die SHA- Familie von Hashes wurde noch nicht gebrochen, daher haben Sie für diese kein Glück.

15
Mike Ounsworth

Dies ist der eigentliche Zweck von Einweg-Hashes (dh md5, sha1, sha2 usw.). Sie sollen nicht reversibel sein. Wenn Sie einen Hash rückgängig machen könnten, würde viel Sicherheit sofort unsicher werden. Der Hash enthält nicht die Informationen, von denen er gehasht wurde. Der Prozess des Hashings ist in die eine Richtung einfach und in die andere Richtung wirklich sehr, sehr schwierig.

Wenn Sie nun viel Inhalt hatten und ihn gehasht haben und diesen Inhalt mit seinem Hash in einer großen Hashmap gespeichert haben, können Sie die Dinge schnell umkehren, indem Sie ihn anhand des Hashs nachschlagen und den Inhalt finden, mit dem Sie diesen Hash erstellt haben. Dies nennt man Rainbow-Tabellen, was in der Vergangenheit eine praktikable Möglichkeit war, Passwörter zu knacken, aber nicht mehr so ​​sehr.

Auch wenn Sie könnten, bedenken Sie dies. Angenommen, ich habe einen MD5-Hash eines Films mit 100 MB erstellt. Wenn ich diesen Hash-Wert umkehren und meinen 100-MB-Film daraus erhalten könnte, hätte ich einen extrem leistungsfähigen Komprimierungsalgorithmus! Denn das würde bedeuten, dass ich jeden Inhalt mit 1 MB, 100 MB, 1 GB, 1 TB usw. in einen Hash mit 32 Byte umwandeln könnte, um alles darzustellen, was ich wollte. Könnte ich nun wirklich jeden denkbaren Inhalt in jeder Größe in 32 Bytes darstellen? Dies wäre unmöglich, da nicht genügend Informationsdichte in 32 Bytes vorhanden ist, um jeden möglichen Inhalt darzustellen, den wir uns jemals als 2 ^ 128 = 340.282.366.920.938.463.463.374.607.431.768.211.456 vorstellen könnten. Das wäre die Obergrenze für eindeutige Inhalte, die ich auch erstellen könnte.

Ich denke, diese Antwort erklärt es besser als ich kann, wie die Mathematik dies unmöglich (oder zumindest sehr, sehr schwierig) macht:

Warum sind Hash-Funktionen in eine Richtung? Wenn ich den Algorithmus kenne, warum kann ich die Eingabe daraus nicht berechnen?

2
chubbsondubs

Wenn Sie von kryptohgrafischen Hashes sprechen, gibt es keine Möglichkeit, den "V" -Wert wiederherzustellen, der zum Generieren von "H" -Hash verwendet wird. Sie sind so konstruiert, dass dies verhindert wird.

Um den ursprünglichen "V" -Wert zu ermitteln, müssen verschiedene "V" generiert, ihr jeweiliges "H" berechnet und diese "H" verglichen werden, um festzustellen, welcher dem ursprünglichen "H" -Hash entspricht. Ja, nur indem man es brutal erzwingt.

1
DarkLighting