Frage

Ich lese Wikipedia-Artikel über md5-Hashwerte, aber ich kann immer noch nicht verstehen, wie ein hash kann nicht sein "rekonstituierter" zurück zu den ursprünglichen text.

Könnte jemand erklären, um jemanden, der weiß sehr wenig über Kryptographie, wie das funktioniert?Welcher Teil der Funktion, die macht es zu einem-Weg?

War es hilfreich?

Lösung

Da jeder bis jetzt einfach definiert, was eine Hash-Funktion war, ich werde beißen.

Eine Einwegfunktion ist nicht nur eine Hash-Funktion - eine Funktion, die Informationen verliert - aber eine Funktion f, für die bei einem gegebenen Bild y ( „SE“ oder 294 in bestehenden Antworten), ist es schwierig zu finden ein Urbild x, so dass f(x)=y.

Aus diesem Grund ist sie ein Weg genannt werden. Sie ein Bild berechnen können, aber Sie können nicht ein Urbild für ein bestimmtes Bild finden

Keine der gewöhnlichen Hash-Funktion vorgeschlagen, bis jetzt in bestehenden Antworten diese Eigenschaft hat. Keiner von ihnen sind Einweg-verschlüsselte Hash-Funktionen. Zum Beispiel gegeben "SE", können Sie leicht den Eingang "SXXXE", einen Eingang mit der Eigenschaft, dass X-encode abholen ( "SXXXE") = SE.

Es gibt keine "einfache" one-way-Funktionen. Sie müssen ihre Eingänge mischen so gut, dass nicht nur Sie nicht erkennen, die Eingabe an alle in der Ausgabe, und Sie erkennen nicht, einen anderen Eingang entweder.

SHA-1 und MD5 beliebte Einwegfunktionen sein, aber sie sind beide fast gebrochen (spezielles Know how Urbilder für bestimmte Bilder zu erzeugen, oder fast der Lage, dies zu tun). Es ist ein Wettbewerb im Gange, einen neuen Standard zu wählen, die genannt werden wird SHA- 3 .

Eine offensichtliche Annäherung an Invertzucker eine Einwegfunktion sein würde viele Bilder zu berechnen und halten sie in einer Tabelle zu jedem Bild Zuordnen des Urbild, die es erzeugt. Um dies in der Praxis unmöglich, alle Einwegfunktion eine große Leistung haben, mindestens 64 Bit, aber möglicherweise viel größer (bis zu, sagen wir, 512 Bit).

EDIT: Wie die meisten verschlüsselten Hash-Funktionen arbeiten

In der Regel haben sie in ihrem Kern eine einzige Funktion, die Transformationen auf einem Block von Bits kompliziert ist (a Blockchiffre ). Die Funktion sollte fast bijektiv sein (es sollte nicht zu viele Sequenzen mit dem gleichen Bild abzubilden, weil die Schwächen später verursachen würde), aber es muss nicht genau bijektiv sein. Und diese Funktion wird eine feste Anzahl von Malen wiederholt, genug, um die Eingabe zu machen (oder einen möglichen Eingang) unmöglich zu erkennen.

Nehmen wir das Beispiel Skein , eine der starken Kandidaten für die SHA-3-Kontext. Seine Kernfunktion wird 72 mal wiederholt. Die einzige Anzahl von Iterationen, für die die Schöpfer der Funktion wissen, wie die Ausgänge auf einige Eingaben beziehen sich auf manchmal ist 25. Sie sagen, es einen „Sicherheitsfaktor“ von 2,9 hat.

Andere Tipps

Denken Sie an eine wirklich grundlegende Hash - für die Eingabezeichenfolge, die Summe der ASCII-Werte jedes Zeichens zurück.

hash( 'abc' ) = ascii('a')+ascii('b')+ascii('c')
              = 97 + 98 + 99
              = 294

Nun gegeben, den Hash-Wert von 294, können Sie sagen, was die ursprüngliche Zeichenfolge war? Offensichtlich nicht, denn ‚abc‘ und ‚cba‘ (und unzählig andere) gibt den gleichen Hash-Wert.

Cryptographic Hash-Funktionen funktionieren auf die gleiche Art und Weise, mit der Ausnahme, dass offensichtlich der Algorithmus viel komplexer ist. Es werden immer Kollisionen sein, aber wenn Sie Zeichenfolge s Hashes h wissen, dann sollte es sehr schwierig sein ( „rechnerisch unmöglich“) zu Konstrukt eine andere Zeichenfolge, die auch auf h Hashes.

Shooting für eine einfache Analogie hier statt einer komplexen Erklärung.

Mit zu beginnen, lassen Sie uns brechen das Thema in zwei Teile, one-way-Operationen und Hashing. Was ist ein One-Way-Betrieb und warum würden Sie einen wollen?

Eine Möglichkeit, Operationen werden so genannt, weil sie sind nicht umkehrbar. Die meisten typischen Operationen wie Addition und Multiplikation kann umgekehrt werden, während Modulo-Division nicht mehr rückgängig gemacht werden kann. Warum ist das wichtig? Da Sie einen Ausgangswert, der 1) zur Verfügung stellen möchten ist schwierig, ohne die ursprünglichen Eingänge zu duplizieren und 2) sieht keine Möglichkeit, herauszufinden, die Eingänge aus der Ausgabe.

Reversible

Addition :

4 + 3 = 7  

Dies kann, indem die Summe und Subtraktion einer der Summanden rückgängig gemacht werden

7 - 3 = 4  

Multiplikation :

4 * 5 = 20  

Dies kann, indem das Produkt und dividiert durch einen der Faktoren rückgängig gemacht werden

20 / 4 = 5

Nicht Reversible

Modulo-Division :

22 % 7 = 1  

Dies kann nicht rückgängig gemacht werden, da keine Operation ist, dass Sie auf die Quotienten und die Dividenden tun, um den Divisor (oder umgekehrt) zu rekonstruieren.

Können Sie eine Operation ausfüllen, wo die finden ‚?‘ ist?

1  ?  7 = 22  
1  ?  22 = 7

Damit wird gesagt, Einweg-Hash-Funktionen haben die gleiche mathematische Qualität als Modulo-Division.

Warum ist das wichtig?

Nehmen wir an ich habe dir einen Schlüssel zu einem Schließfach in einem Bus-Terminal, das eintausend Schließfächer hat und Sie gebeten, es zu meinem Bankier zu liefern. Als der smart guy Sie sind, nicht verdächtig zu erwähnen, würden Sie sofort sehen auf den Schlüssel, um zu sehen, was Schranknummer auf dem Schlüssel geschrieben. Wenn man das weiß, ich habe ein paar hinterhältigen Dinge getan; erstes fand ich zwei Zahlen, die bei der Verwendung von Modulo-Division unterteilt gibt mir eine Zahl im Bereich zwischen 1 und 1000, den zweiten I die Zahl wieder gelöscht, und die von dem Paar von Zahlen auf den Divisor geschrieben zweiten wähle ich einen Bus-Anschluss, der eine hat bewachen die Spinde von Missetätern zu schützen, indem nur die Menschen versuchen, einen Schließfach am Tag mit ihrem Schlüssel im Stich gelassen, dritter die Banker bereits die Dividende wissen also, wenn er den Schlüssel bekommt er die Mathematik und Figur aus dem Rest tun kann und wissen, welcher Schließfach zu öffnen.

Wenn ich die Operanden mit Bedacht wählen, kann ich in der Nähe einer Eins-zu-Eins-Beziehung zwischen dem Quotienten und der Dividende, die Kräfte Sie jeden Spind, um zu versuchen, weil die Antwort Spreads die Ergebnisse der möglichen Eingaben über den Bereich der gewünschten Zahlen , die Schließfächer im Terminal zur Verfügung. Im Grunde ist es bedeutet, dass Sie keine Kenntnisse über den Rest erwerben können, auch wenn Sie einen der Operanden kennen.

So, jetzt kann ich ‚Vertrauen‘ Sie den Schlüssel zu ihren rechtmäßigen Eigentümer liefern, ohne sich Sorgen, dass man leicht zu dem erraten kann locker es hingehört. Natürlich könnten Sie rohe Gewalt alle die Schließfächer suchen, aber das wäre fast 3 Jahre dauern, viel Zeit für meinen Banker den Schlüssel zu verwenden und den Spind zu leeren.

Die anderen Antworten für mehr Einzelheiten über die verschiedenen Hash-Funktionen.

Hier ist ein sehr einfaches Beispiel. Nehmen wir an, ich ein Anfang Kryptograph bin und ich eine Hash-Funktion, die die folgenden:

int SimpleHash(file) {
    return 0 if file.length is even;
    return 1 if file.length is odd;
}

Jetzt ist hier der Test. SimpleHash(specialFile) ist 0. Was war meine ursprüngliche Datei?

Natürlich gibt es keine Möglichkeit zu wissen (obwohl Sie wahrscheinlich ziemlich leicht entdecken können, dass mein Hash auf Dateilänge basieren). Es gibt keine Möglichkeit zu „rekonstituieren“ meiner Datei basierend auf dem Hash, da der Hash nicht alles enthält, dass meine Datei hat.

Ein Hash ist eine (sehr) verlustbehaftete Codierung.

Um Ihnen ein einfacheres Beispiel, stellen Sie sich eine fiktive 2-Buchstaben-Codierung eines 5-Buchstaben-Wort der X-Codierung genannt. Der Algorithmus für die X-Codierung ist einfach:. Die ersten und letzten Buchstaben des Wortes nehmen

So

X-encode( SAUCE ) = SE
X-encode( BLOCK ) = BK

Natürlich kann man nicht SAUCE von seiner Codierung SE rekonstruieren (unter der Annahme unseres Angebotes an möglichen Eingaben ist alle 5-Buchstaben-Wörter). Das Wort könnte genauso gut sein SPACE.

Als Nebenwirkung, die Tatsache, dass SAUCE und SPACE beiden Produkte SE als Codierung genannt werden, eine Kollision , und Sie können sehen, dass das X-ecoding nicht eine sehr gute Hash machen würde. :)

In einfachen Worten, eine Hash-Funktion arbeitet mit einem großen Durcheinander der Eingangsdaten zu machen.

Siehe MD5 zum Beispiel. Er verarbeitet Eingangsdaten durch 512-Bit-Blöcke. Jeder Block wird unterteilt in 16 32-Bit-Worte. Es gibt 64 Schritte, wobei jeder Schritt unter Verwendung von einem der 16 Eingangsworten. So wird jedes Wort viermal im Laufe des Algorithmus verwendet. Dies ist, wo ein wayness herkommt: any Eingangsbit eingegeben wird an mehreren Stellen, und zwischen zwei solchen Eingängen die Funktion mischt alle aktuellen Daten zusammen, so dass jeder Eingang Bit Auswirkungen die meisten der 128-Bit-Betriebszustand. Dies verhindert, dass von Ihnen die Funktion Umkehren oder eine Kollision Berechnung, um nur einen Teil der Daten suchen. Sie haben in den gesamten 128 Bits suchen, und der Raum von 128-Bit-Blöcken zu breit ist effizient ging durch sein.

Jetzt MD5 nicht einen guten Job bei ihm tun, da Kollisionen für diese Funktion gefunden werden kann. Aus Kryptograph Sicht ist MD5 eine gedrehte Verschlüsselungsfunktion. Die Verarbeitung eines Nachrichtenblock M (512 Bits) verwendet einen Eingangszustand V (ein 128-Bit-Wert) und berechnet den neuen Zustand V 'als V' = V + E (M, V), wobei '+' eine Wort- weise Zugabe und ‚E‘ passiert, eine symmetrische Verschlüsselungsfunktion (auch bekannt als einen ‚Block cipher‘) sein, die M als Schlüssel verwendet, und V als die Nachricht verschlüsselt werden. Von näherem Hinsehen ist E kann eine Art „erweiterte Feistel-Netzwerk“, ähnlich wie die Blockchiffre DER, mit vier Vierteln statt zwei Hälften. Details sind hier nicht wichtig; mein Punkt ist, dass das, was eine „gute“ Hash-Funktion macht, die unter Hash-Funktionen diese Struktur verwenden ( „Merkle-Damgård“ genannt), ist ähnlich zu dem, was ein Blockchiffre „sicheren“ macht. Die erfolgreichen Kollision Angriffe auf MD5 Verwendung differentielle Kryptoanalyse, ein Werkzeug, das entworfen wurde, Blockchiffren in erster Linie zum Angriff.

Von einem guten Blockchiffre auf eine gute Hash-Funktion, gibt es ein Schritt, der nicht zu entlassen ist. Mit der Merkle-Damgård Struktur ist die Hash-Funktion sicher, wenn die zugrunde liegende Blockchiffre ist resistent gegen „related Schlüssel Angriffe“, ein eher obskures Objekt, gegen die Blockchiffren selten gestärkt werden, weil für die symmetrische Verschlüsselung, damit verbundene Schlüssel Angriffe kaum praktisches haben Auswirkung. So wandte sich die AES-Verschlüsselung aus nicht so resistent gegenüber nahe stehenden Schlüssel Angriffe zu sein, wie gewünscht werden könnte, und dies auslösen nicht allgemeine Panik. Dieser Widerstand war nicht Teil der Eigenschaften, die für die gesucht wurden, wenn AES entwickelt wurde. Es ist einfach verhindert, dass die AES in eine Hash-Funktion drehen. Es gibt eine Hash-Funktion namens Whirlpool, die auf einem derivate von Rijndael baut „Rijndael“ ist der ursprüngliche Name des späteren AES; aber Whirlpool nimmt die Teile von Rijndael zu modifizieren, die zu verwandten schwach sind Schlüssel-Attacken.

Auch gibt es andere Strukturen, die für den Aufbau einer Hash-Funktion verwendet werden kann. Die aktuellen Standardfunktionen (MD5, SHA-1, und die "SHA-2" Familie, auch bekannt als SHA-224, SHA-256, SHA-384 und SHA-512) sind Merkle-Damgård Funktionen, aber viele der Möchtegern- Nachfolger sind nicht. Es besteht ein ständiger Wettbewerb, organisiert von der NIST (der US-Bundesorganisation, die sich mit dieser Art von Dingen), eine neue Standard-Hash-Funktion zu wählen, genannt „SHA-3“. Siehe dieser Seite . Gerade jetzt, sie sind bis zu 14 Kandidaten von einer anfänglichen 51 (nicht ein Dutzend zusätzliche zählen, die den Verwaltungsakt Test nicht bestanden eine vollständige Vorlage mit Code sendet, die kompiliert und läuft richtig).

Lassen Sie sie haben jetzt einen mehr konzeptionellen Blick. Eine sichere Hash-Funktion sollte aussehen wie ein Random Oracle : ein Orakel ist eine Blackbox, die, wenn eine Nachricht gegeben M als Eingabe, gibt eine Antwort h (M ) , die nach dem Zufallsprinzip gewählt wird, in dem Ausgaberaum (dh alle n -Bit-Strings, wenn die Hash-Funktion Ausgangslänge N ). Wenn die gleiche Meldung gegeben M wieder als Eingabe gibt das Orakel den gleichen Wert als zuvor. Abgesehen von dieser Einschränkung der Ausgang des Orakels auf einem nicht vorher verwendeten Eingang M ist unberechenbar. Man kann für einen Gnom das Orakel als Container vorstellen, den Würfel wirft, und sorgfältig erfasst die Eingangsnachricht und entsprechende Ausgänge in einem großen Buch, so dass er seine Orakel Vertrag ehren. Es gibt keine Möglichkeit, vorherzusagen, was der nächste Ausgang sein wird, da der Gnom sich das nicht weiß.

Wenn ein statistisches Oracle vorhanden ist, dann die Hash-Funktion invertiert hat Kosten 2 ^ n : Um einen gegebenen Ausgang zu haben, gibt es keine bessere Strategie als die Verwendung von unterschiedlichen Eingangsnachrichten bis eine Ausbeute des erwarteten Wert. Durch die gleichmäßige zufällige Auswahl, Erfolgswahrscheinlichkeit ist 1 / (2 ^ n) bei jedem Versuch, und die durchschnittliche Anzahl der Anfragen an den Würfel-Wurf-gnome wird sein 2 ^ n . Kollisionen (zwei verschiedene Eingaben zu finden, die den gleichen Hash-Wert ergibt), sind die Kosten etwa * 1.4 * 2 ^ (n / 2) * (grob gesagt, mit * 1.4 * 2 ^ (n / 2) * Ausgängen können wir zubauen etwa 2 ^ n Paare von Ausgang, die jeweils eine Wahrscheinlichkeit von 1 / (2 ^ n) der Anpassung, das heißt mit zwei verschiedenen Eingängen, die die gleiche Leistung aufweisen). Dies sind die besten, die mit einem zufälligen Orakel getan werden kann.

Deshalb suchen wir für Hash-Funktionen, die so gut wie ein Zufalls Orakel sind: sie müssen die Eingangsdaten in einer solchen Art und Weise mischen, dass wir nicht eine Kollision effizienter als das, was finden sie einfach aufrufen, um die Funktion kosten würde 2 ^ (n / 2) Zeiten. Der fluch der Hash-Funktion ist, mathematische Struktur, dh Verknüpfungen, die die Angreifer in den Hash-Funktion internen Zustand anzuzeigen (die groß ist, zumindest n Bits) als eine Variation auf einem mathematisches Objekt, das in einem lebt viel kürzer Raum. 30 Jahre der öffentlichen Forschung auf symmetrischen Verschlüsselungssysteme haben eine ganze Drum und Dran von Begriffen und Werkzeugen (Diffusion, Lawine, Differentiale, Linearität ...) erzeugt, die angewendet werden können. Bottom-line, ist jedoch, dass wir keinen Beweis haben, dass ein zufälliges Orakel tatsächlich existiert. Wir wollen eine Hash-Funktion, die nicht angegriffen werden kann. Was wir Haben sind Hash-Funktion Kandidaten, für die kein Angriff zur Zeit ist bekannt , und, etwas besser, haben wir einige Funktionen, für die einige Arten Angriff kann nicht zur Arbeit nachgewiesen werden.

Es gibt noch einige Forschung getan werden.

array
Mit etwas schielen, assoziative arrays Aussehen sehr viel wie hashes.Die wichtigsten Unterschiede waren der Mangel von dem % - symbol auf hash-Namen, und das konnte man nur weisen Sie eine Taste gleichzeitig.Damit würde man sagen $foo{'key'} = 1;, aber nur @keys = keys(foo);.Bekannte Funktionen wie jeder, Schlüsseln und Werten gearbeitet, als Sie es jetzt tun (und löschen " wurde Hinzugefügt, in Perl-2).

Perl-3 hatte drei ganze Datentypen:es hatte das % - symbol auf hash-Namen, erlaubt eine ganze hash zugewiesen werden, um auf einmal, und fügte hinzu, dbmopen (now deprecated in favour of Band).Perl 4 durch Komma getrennt hash-Tasten zu emulieren, multidimensionalen arrays (die sind jetzt besser behandelt werden mit array-Referenzen).

Perl 5 nahm den riesigen Sprung auf assoziativen arrays-hashes.(Soweit ich weiß, ist es die erste Sprache bezeichnet haben von der Datenstruktur somit nicht nur als "hash-Tabelle" oder etwas ähnliches.) Etwas ironisch, es zog auch der entsprechende code aus hash.c in hv.c.

Nomenklatur
Wörterbücher, wie bereits erläutert, sind ungeordnete Sammlungen von Werten, indiziert durch eindeutige Schlüssel.Sie werden manchmal auch als assoziative arrays oder maps.Sie implementiert werden kann in mehrere Möglichkeiten, eine davon ist die Verwendung einer Datenstruktur bekannt als hash-Tabelle (und dies ist, was Perl bezieht sich auf ein hash).

Perl ist die Verwendung des Begriffs "Raute" ist die Quelle für einige potenzielle Verwirrung, weil die Ausgabe einer Hash-Funktion ist auch manchmal genannt einen hash (vor allem in kryptographischen Kontexten), und da hash-Tabellen sind in der Regel nicht als hashes bezeichnet woanders.

Sind Sie auf der sicheren Seite, beziehen sich auf die Daten-Struktur als eine hash-Tabelle, und verwenden den Begriff "hash" nur in der Hand, Perl-spezifischen Kontexten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top