Wie one-way-hash-Funktionen arbeiten? (Bearbeitet)
Lese ich den Wikipedia-Artikel über md5-hashes, aber ich kann immer noch nicht verstehen, wie ein hash kann nicht sein "rekonstituierter" back to the original text.
Könnte mir jemand erklären, an jemanden, der weiß sehr wenig über Kryptographie, wie das funktioniert? Welchen Teil der Funktion macht es one-way?
- "Rekonstitution" und "original text" ist vielleicht das falsche Worte und der Grund, warum jeder beharrt auf die Angabe der definition eine gewöhnliche hash-Funktion. Es ist vielleicht besser zu denken, im Begriff des "crafting eine beliebige Eingabe, die hashes zu den angegebenen hash". Es muss nicht das original.
- Ich hatte so Bearbeiten Sie den Titel zum Bearbeiten der tags. :\
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da jeder bis jetzt hat einfach definiert, was eine hash-Funktion, ich werde beißen.
Einem one-way-Funktion ist nicht nur eine hash-Funktion-eine Funktion, die verliert Informationen -- aber eine Funktion
f
für, die, gegeben ein Bildy
("SE" oder 294 in bereits vorhandene Antworten), ist es schwierig, eine pre-image-x, so dassf(x)=y
.Dies ist, warum Sie genannt werden one-way: Sie können berechnen Sie Bild, aber Sie nicht finden können, ein vor-Bild für ein bestimmtes Bild.
Keiner der gewöhnliche hash-Funktion vorgeschlagen, die bis jetzt in den vorhandenen Antworten, die diese Eigenschaft haben. Keiner von Ihnen sind one-way-kryptografische hash-Funktionen. Für den Fall, da "SE", Sie können ganz einfach abholen den Eingang "SXXXE", ein input mit der Eigenschaft, dass X-encode("SXXXE")=SE.
Gibt es keine "einfache" one-way-Funktionen. Sie haben zu mischen, deren Eingänge so gut, dass Sie nicht nur nicht erkennen, die Eingabe an alle in der Ausgabe, aber Sie nicht erkennen, eine weitere Eingabe entweder.
SHA-1 und MD5 verwendet, populär zu sein one-way-Funktionen, aber Sie sind beide fast kaputt (fachliche know-how zu erstellen, vor-Bilder für die gegebenen Bilder, oder sind fast in der Lage, dies zu tun). Es ist ein Wettbewerb im Gange, um wählen Sie einen neuen standard ein, die den Namen SHA-3.
Einen offensichtlichen Ansatz zum invertieren ein one-way-Funktion wäre zu berechnen, viele Bilder und halten Sie in einer Tabelle verknüpfen, um jedes Bild der vor-Bild, die es produziert. Um dies in der Praxis unmöglich, alle one-way-Funktion eine große Ausgabe, die mindestens 64 bit, aber möglicherweise viel größer (bis zu, sagen wir, 512 bit).
EDIT: Wie die meisten kryptografischen hash-Funktionen arbeiten?
In der Regel haben Sie in Ihrem Kern eine einzelne Funktion macht komplizierte Transformationen auf einem block von bits (ein block cipher). Die Funktion sollte fast bijektive (es sollte nicht anzeigen zu viele Sequenzen, um das gleiche Bild, denn das würde dazu führen, Schwächen später), aber es muss nicht um genau zu sein bijektive. Und diese Funktion iteriert man über eine Feste Anzahl von Zeiten, genug, um den Eingang (oder jede mögliche Eingabe) unmöglich zu erkennen.
Nehmen Sie das Beispiel der Strang, einer der starken Kandidaten für SHA-3-Kontext. Seine Kern-Funktion iteriert wird 72 mal. Nur die Anzahl der Iterationen, für die die Macher von der Funktion wissen, wie man manchmal beziehen sich die Ausgaben auf einige Eingänge 25. Sie sagen, es ist ein "Sicherheitsfaktor" von 2,9.
Denken Sie an eine ganz einfache hash - den input-string, return die Summe der ASCII-Werte der einzelnen Zeichen.
Nun, da der hash-Wert von 294, können Sie sagen, was der ursprüngliche string war? Offensichtlich nicht, weil " abc " und " cba " (und unzählige andere) den gleichen hash-Wert.
Kryptografische hash-Funktionen funktionieren auf die gleiche Weise, außer dass offensichtlich der Algorithmus ist wesentlich komplexer. Es gibt immer wieder Kollisionen, aber wenn Sie wissen, string
s
hashesh
, dann soll es sehr schwierig sein ("rechnerisch unmöglich") zu konstruieren anderen string, dass auch hashesh
.hash('acb')
(und viele andere) haben das gleiche Ergebnis wiehash('abc')
. Für eine starke hash, sollte es keine Möglichkeit, das zu tun (umwandeln einer Eingabe in ein anderes, welche den gleichen hash), dass ist schneller als nur hashing, random-Eingänge, bis Sie einen finden, mit den richtigen hash (bruteforce).Dreharbeiten für eine einfache Analogie hier statt einer komplexen Erklärung.
So starten Sie mit, lassen Sie uns brechen Sie das Thema herunter in zwei Teile, one-way-Operationen und der Vermischung. Was ist ein one-way-Betrieb und warum wollen Sie eins?
One-way-Operationen aufgerufen werden, die, weil Sie nicht reversibel ist. Die meisten typischen Operationen wie addition und Multiplikation rückgängig gemacht werden können, während die modulo-division kann nicht rückgängig gemacht werden. Warum ist das wichtig? Denn Sie möchten Ihnen eine Ausgabe Wert der 1), ist schwer zu duplizieren, ohne die original-inputs und 2) keine Möglichkeit bietet, herauszufinden, die Eingänge aus der Ausgabe.
Reversible
Neben:
Dies kann rückgängig gemacht werden, indem Sie die Summe und Subtraktion einer der Summanden
Multiplikation:
Dies kann rückgängig gemacht werden, indem Sie das Produkt und die Division durch eins der Faktoren
Nicht Reversibel
Modulo-division:
Dies kann nicht rückgängig gemacht werden, denn es gibt keine operation, die Sie tun können, um den Quotienten und die Dividende zum Wiederaufbau der divisor (oder Umgekehrt).
Finden Sie eine operation zu füllen, wo das"? " ist?
With, die being said, one-way-hash-Funktionen haben die gleiche mathematische Qualität als modulo-division.
Warum ist das wichtig?
Können sagen, ich gab Euch einen Schlüssel zu einem Schließfach in einem bus-terminal, die hat tausend Schließfächer und fragte Sie, um es zu liefern mein Bankier. Die smart-Kerl Sie sind, nicht zu erwähnen, verdächtige, Sie würde sofort schauen Sie auf die Taste, um zu sehen, was Schließfach Nummer steht auf dem Schlüssel. Dies zu wissen, ich habe ein paar hinterhältigen Dinge; zuerst fand ich zwei zahlen, die bei Division mit modulo-division gibt mir eine Zahl im Bereich zwischen 1 und 1000, die zweite habe ich gelöscht, die original-Nummer und steht auf der divisor von den paar zahlen, die zweite wählte ich ein bus-terminal, das eine Wache zum Schutz der Schränke von Kerle von nur lassen die Leute versuchen, ein Spind, einen Tag mit Ihrem Schlüssel, Dritter Bankier kennt bereits die Dividende, so dass, wenn er bekommt den Schlüssel, kann er die Mathematik zu tun und herausfinden, den Rest und weiß, das Schließfach zu öffnen.
Wenn ich wählen Sie die Operanden mit bedacht, die ich bekommen kann in der Nähe eine eins-zu-eins-Beziehung zwischen dem Quotienten und der Dividende, die Sie zwingt, zu versuchen, jeden Schrank, denn die Antwort, breitet sich die Ergebnisse der möglichen Eingaben über die gewünschten zahlen, die Schließfächer im terminal zur Verfügung. Das bedeutet im Grunde, können Sie nicht erwerben keine Kenntnisse über den Rest, auch wenn Sie wissen, dass einer der Operanden.
So, jetzt kann ich 'Vertrauen' Sie liefern den Schlüssel zu seinem rechtmäßigen Eigentümer ohne sich sorgen, dass Sie können leicht erraten, zu welchem Schrank gehört. Sicher, man könnte brute-force-Suche durch alle die Schränke, aber das würde fast schon 3 Jahren, viel Zeit für meine Bankier, um die Schlüssel zu verwenden, und leeren Sie den Schrank.
Siehe die anderen Antworten, für weitere Einzelheiten über die verschiedenen hash-Funktionen.
Hier ist ein sehr einfaches Beispiel. Angenommen, ich bin ein Anfang Kryptologe und ich erstellen Sie eine hash-Funktion, die Folgendes macht:
Nun, hier ist der test.
SimpleHash(specialFile)
0 ist. , Was war meine ursprüngliche Datei?Offensichtlich, es gibt keine Möglichkeit zu wissen (obwohl Sie könnte wahrscheinlich entdecken sehr einfach, dass mein hash basiert auf der Länge der Datei). Es gibt keine Möglichkeit zu "rekonstruieren" meine Datei basiert auf der hash, da der hash nicht alles enthalten, was meiner Datei habe.
Ein hash ist eine (sehr) verlustbehaftete Codierung.
Geben Sie ein einfacheres Beispiel, stellen Sie sich einen fiktiven 2-Buchstaben-Kodierung der 5-Buchstaben-Wort genannt die X-Kodierung. Der Algorithmus für die X-Codierung ist einfach: nehmen Sie den ersten und letzten Buchstaben des Wortes.
So,
Klar, man kann nicht rekonstruieren, SAUCE von seiner Codierung SE (vorausgesetzt unsere Reihe von möglichen Eingaben alle 5-Buchstaben-Wörter). Das Wort könnte genauso gut PLATZ.
Nebenbei bemerkt, die Tatsache, dass SAUCE und RAUM produzieren SE als ein encoding heißt ein Kollision, und Sie können sehen, dass die X-ecoding würde nicht machen ein sehr gutes Haschisch. 🙂
In einfachen Worten, eine hash-Funktion arbeitet, indem Sie eine große Wirren Durcheinander von den input-Daten.
Sehen MD5 zum Beispiel. It-Prozesse input-Daten mit 512-bit-Blöcke. Jeder block ist aufgeteilt in 16 32-bit Worten. Es sind 64 Schritte, wobei jeder Schritt unter Verwendung einer der 16 input-Worte. Also jedes Wort wird vier mal verwendet wird, im Verlauf des Algorithmus. Dies ist, wo one-wayness kommt aus: jede Eingabe bit-Eingabe an mehreren stellen, und zwischen zwei solcher Eingänge der Funktion mischt alle aktuellen Daten zusammen, so dass jeder Eingang bit Auswirkungen die meisten der 128-bit-Zustand ausgeführt werden. Dies verhindert, dass Sie umkehren der Funktion, bzw. die EDV zu einem Zusammenstoß, durch den Blick auf nur einen Teil der Daten. Sie müssen sich das ganze anschauen 128 bits, und der Speicherplatz von 128-bit-Blöcke ist zu groß, um sich effizient durch ging.
Nun MD5 nicht machen einen guten job auf Sie, da Kollisionen für diese Funktion gefunden werden kann. Von einem Kryptologen Sicht MD5 ist eine gedrehte Verschlüsselung Funktion. Die Verarbeitung einer message block M (512 bit) verwendet eine input-Status V (eine 128-bit-Wert) und berechnet den neuen Zustand V' mit V' = V + E(M, V), wobei '+' ist eine Wort-weisen addition und 'E' geschieht, um eine symmetrische Verschlüsselung-Funktion (auch bekannt als ein "block cipher"), die M als Schlüssel und V als die Nachricht verschlüsselt werden. Aus einem genaueren Blick, E, kann eine Art "extended Feistel-network", ähnelt der DES block cipher, mit vier Vierteln anstatt zwei Halbzeiten. Details sind hier nicht wichtig; mein Punkt ist, dass, was macht eine "gute" hash-Funktion, bei hash-Funktionen, die Verwendung, die Struktur (genannt "Merkle-Damgård"), ist ähnlich wie ein block cipher "sicher". Die erfolgreiche Kollision Angriffe auf MD5 verwenden, differenzielle Kryptoanalyse, ein Werkzeug, das entworfen war, um Angriff-block-Chiffren in den ersten Platz.
Aus einer guten block-Chiffre, um eine gute hash-Funktion, es ist ein Schritt, der nicht zu entlassen. Mit der Merkle-Damgård-Struktur, die Hashfunktion ist sicher, wenn die zugrunde liegende Blockchiffre ist beständig "related-key-attacks", einem eher obskuren Eigenschaft, gegen die block-Chiffren sind selten gestärkt, weil, für die symmetrische Verschlüsselung, related-key-Angriffe haben kaum praktische Auswirkungen. Zum Beispiel die AES-Verschlüsselung erwies sich als nicht so widerstandsfähig gegen related-key-Attacken wie könnte sein wünschte, und diese nicht auslösen Allgemeinen Panik. Dieser Widerstand war nicht Teil der Eigenschaften, die gesucht wurden, wenn AES entwickelt wurde. Es einfach verhindert das drehen des AES in eine hash-Funktion. Es gibt eine hash-Funktion genannt, Whirlpool, baut auf einem Derivat von Rijndael, "Rijndael" war der ursprüngliche name von dem, was wurde der AES; aber Whirlpool kümmert sich um ändern Sie die Teile des Rijndael welche schwach sind, um den zugehörigen Schlüssel-Attacken.
Außerdem gibt es andere Strukturen, die verwendet werden können für den Aufbau einer hash-Funktion. Die aktuelle standard-Funktionen (MD5, SHA-1, und der "SHA-2" - Familie, auch bekannt als SHA-224, SHA-256, SHA-384 und SHA-512) sind Merkle-Damgård-Funktionen, aber viele der möchte-gern-Nachfolger nicht. Es ist ein andauernder Wettbewerb, organisiert von der NIST (US-Bundes-Organisation, die sich mit dieser Art von Dingen), wählen Sie eine neue standard-hash-Funktion, die auch als "SHA-3". Sehen auf dieser Seite für details. Jetzt sind Sie unten zu 14 Kandidaten von ursprünglich 51 (nicht mitgerechnet ein Dutzend zusätzliche, die nicht den Verwaltungs-test senden eine komplette Vorlage mit code, der kompiliert und läuft einwandfrei).
Wir haben jetzt eine mehr konzeptionelle look. Eine sichere hash-Funktion Aussehen soll wie ein random oracle: ein Orakel ist eine black box, die, wenn gegeben, eine Nachricht M als Eingangs -, Ausgangs einer Antwort h(M) das ist zufällig gewählt, gleichmäßig, in die Ausgabe-Raum (d.h. alle n-bit-strings, wenn die hash-Funktion, die ausgabelänge ist n). Wenn Sie die gleiche Nachricht M wieder als Eingang, die oracle-Ausgänge den gleichen Wert als zuvor. Abgesehen von dieser Einschränkung ist die Ausgabe des Orakels ein, die nicht zuvor verwendet Eingang M ist unberechenbar. Man kann sich vorstellen, die oracle als container für eine gnome, wirft Würfel und sorgfältig die Datensätze der input-Meldungen und die entsprechenden Ausgänge in einem großen Buch, so dass er die Ehre seiner oracle-Vertrag. Es gibt keine Möglichkeit, vorherzusagen, was die nächste Ausgabe wird, da die gnome sich selbst nicht wissen.
Wenn ein random oracle existiert, dann invertieren die hash-Funktion gekostet hat 2^n: um einen bestimmten Ausgang, es gibt keine bessere Strategie als die Verwendung von distinct input-Nachrichten, bis man die Erträge den erwarteten Wert. Durch die einheitliche zufällige Auswahl, die Wahrscheinlichkeit des Erfolgs ist 1/(2^n) bei jedem Versuch, und die Durchschnittliche Anzahl der Anfragen, um die Würfel zu werfen gnome 2^n. Für Kollisionen (finden zwei unterschiedliche Eingänge, das ergibt den gleichen hash-Wert), werden die Kosten über *1.4*2^(n/2)* (grob gesagt, mit *1.4*2^(n/2)* die Ausgänge, wir bauen über 2^n Paare-Ausgang, jeweils mit einer Wahrscheinlichkeit von 1/(2^n) der Anpassung, d.h. dass zwei unterschiedliche Eingaben, die die selbe Ausgabe). Diese sind die besten, die kann man mit einem random oracle.
Deshalb suchen wir für die hash-Funktionen so gut wie ein random-oracle: müssen Sie mischen Sie die Eingabe von Daten in der Weise, dass wir nicht finden können, eine Kollision effizienter als das, was es Kosten würde, einfach aufrufen der Funktion 2^(n/2) Zeiten. Der Fluch der hash-Funktion ist die mathematische Struktur, D. H. Verknüpfungen, mit denen die Angreifer die hash-Funktion den internen Zustand (was ist groß, mindestens n bits) als eine variation auf ein mathematisches Objekt, das Leben in einer viel kürzeren Raum. 30 Jahren von der öffentlichen Forschung für die symmetrische Verschlüsselung Systeme produziert eine ganze Krimskrams der Begriffe und tools (diffusion, Lawine, Differentiale, Linearität,...), die angewendet werden können. Bottom-line, aber ist, dass wir keinen Beweis dafür, dass ein random oracle existieren könnten. Wir wollen eine hash-Funktion, die kann nicht angegriffen werden. Was wir haben hash Funktion Kandidaten, für die es kein Angriff ist derzeit bekannt, und, etwas besser, wir haben einige Funktionen, für die einige Arten des Angriffs nachgewiesen werden kann, nicht zu arbeiten.
Da ist noch einige Forschungsarbeit geleistet werden.
array
Mit etwas schielen, assoziative arrays sehen sehr ähnlich wie hashes. Die großen Unterschiede, die das fehlen des % - Zeichens hash-Namen, und das konnte man nur weisen Sie eine Taste gleichzeitig. So würde man sagen
$foo{'key'} = 1;
, aber nur@keys = keys(foo);
. Bekannte Funktionen wie jeder, Schlüsseln und Werten gearbeitet, wie Sie es jetzt tun (und löschen wurde Hinzugefügt, in Perl-2).Perl 3 hatte ganze drei Datentypen: es hatte das % - symbol auf dem hash-Namen darf einen ganzen hash zugeordnet werden, die auf einmal, und fügte hinzu, dbmopen (jetzt veraltet zu Gunsten der Band). Perl-4-durch Komma getrennt-hash-Schlüssel zu emulieren, mehrdimensionale arrays (die sind jetzt besser gehandhabt werden mit dem array-Referenzen).
Perl 5 brachte dem Riesen Sprung auf assoziative arrays als hashes. (Soweit ich weiß, ist es die erste Sprache bezeichnet haben, um die Daten-Struktur daher, eher als "hash-Tabelle" oder so ähnlich.) Etwas ironisch, es zog auch die entsprechenden hash-code aus.c in hv.c.
Nomenklatur
Wörterbücher, wie bereits erläutert, sind ungeordnete Sammlungen von Werten, indiziert von eindeutigen Schlüsseln. Sie werden manchmal auch als assoziative arrays oder maps. Sie können auf vielerlei Weise implementiert werden, von denen durch die Verwendung einer Daten-Struktur, bekannt als hash-Tabelle (und das ist das, was Perl bezieht sich auf ein hash).
Perl-Nutzung der Begriff "hash" ist die Quelle für einige potenzielle Verwirrung, weil die Ausgabe der Hash-Funktion wird manchmal auch als hash (insbesondere in kryptographischen Kontexten), und weil die hash-Tabellen sind in der Regel nicht als hashes bezeichnet überall sonst.
Sind Sie auf der sicheren Seite, beziehen sich auf die Datenstruktur als hash-Tabelle, und verwenden den Begriff "hash" nur in offensichtliche, Perl-spezifischen Kontexten.