Hash-Funktionen sind eine der Grundpfeiler der Blockchain-Technologie. Tatsächlich verleiht das Hashing im Alleingang der Blockchain eine der wichtigsten Eigenschaften: Unveränderlichkeit.

Das In und Out von kryptografischen Hash-Funktionen

In diesem Artikel werden wir uns mit einigen der am häufigsten verwendeten kryptografischen Hash-Funktionen in Kryptowährungen vertraut machen. Aber lassen Sie uns vorher verstehen, was Hashing bedeutet.

Das In und Out von kryptografischen Hash-Funktionen

Also, was ist Hashing??

In einfachen Worten bedeutet Hashing, eine Eingabezeichenfolge beliebiger Länge zu nehmen und eine Ausgabe fester Länge auszugeben. Im Kontext von Kryptowährungen wie Bitcoin werden die Transaktionen als Eingabe verwendet und durch einen Hashing-Algorithmus (Bitcoin verwendet SHA-256) ausgeführt, der eine Ausgabe mit fester Länge liefert.

Mal sehen, wie der Hashing-Prozess funktioniert. Wir werden bestimmte Eingaben machen. Für diese Übung verwenden wir den SHA-256 (Secure Hashing Algorithm 256)..

Wie Sie sehen können, hat im Fall von SHA-256, egal wie groß oder klein Ihre Eingabe ist, die Ausgabe immer eine feste Länge von 256 Bit. Dies ist wichtig, wenn Sie mit einer großen Menge von Daten und Transaktionen arbeiten. Anstatt sich also an die Eingabedaten zu erinnern, die sehr groß sein könnten, können Sie sich einfach an den Hash erinnern und den Überblick behalten. Bevor wir weiter gehen, müssen wir zunächst die verschiedenen Eigenschaften von Hashing-Funktionen und deren Implementierung in der Blockchain betrachten.

Kryptografische Hash-Funktionen

Eine kryptografische Hash-Funktion ist eine spezielle Klasse von Hash-Funktionen mit verschiedenen Eigenschaften, die sie ideal für die Kryptografie machen. Es gibt bestimmte Eigenschaften, die eine kryptografische Hash-Funktion haben muss, um als sicher zu gelten. Lassen Sie uns sie einzeln durchgehen.

Eigenschaft 1: Deterministisch

Dies bedeutet, dass Sie unabhängig davon, wie oft Sie eine bestimmte Eingabe über eine Hash-Funktion analysieren, immer das gleiche Ergebnis erhalten. Dies ist wichtig, da es unmöglich ist, die Eingabe zu verfolgen, wenn Sie jedes Mal andere Hashes erhalten.

Eigenschaft 2: Schnelle Berechnung

Die Hash-Funktion sollte in der Lage sein, den Hash einer Eingabe schnell zurückzugeben. Wenn der Prozess nicht schnell genug ist, ist das System einfach nicht effizient.

Eigenschaft 3: Vorbildwiderstand

Der Zustand vor dem Bildwiderstand ist, dass es bei H (A) nicht möglich ist, A zu bestimmen, wobei A der Eingang und H (A) der Ausgangs-Hash ist. Beachten Sie die Verwendung des Wortes “nicht realisierbar” anstelle von “unmöglich”. Wir wissen bereits, dass es nicht unmöglich ist, die ursprüngliche Eingabe aus ihrem Hashwert zu bestimmen. Nehmen wir ein Beispiel.

Angenommen, Sie würfeln und die Ausgabe ist der Hash der Zahl, die von den Würfeln kommt. Wie können Sie die ursprüngliche Nummer ermitteln? Alles, was Sie tun müssen, ist, die Hashes aller Zahlen von 1 bis 6 herauszufinden und zu vergleichen. Da Hash-Funktionen deterministisch sind, ist der Hash einer bestimmten Eingabe immer der gleiche, sodass Sie einfach die Hashes vergleichen und die ursprüngliche Eingabe herausfinden können.

Dies funktioniert jedoch nur, wenn die angegebene Datenmenge sehr gering ist. Was passiert, wenn Sie eine große Datenmenge haben? Angenommen, Sie haben es mit einem 128-Bit-Hash zu tun. Die einzige Methode, mit der Sie die ursprüngliche Eingabe finden müssen, ist die Verwendung der „Brute-Force-Methode“. Die Brute-Force-Methode bedeutet im Grunde, dass Sie eine zufällige Eingabe aufnehmen, sie hashen und dann die Ausgabe mit dem Ziel-Hash vergleichen und wiederholen müssen, bis Sie eine Übereinstimmung finden.

Was passiert also, wenn Sie diese Methode verwenden??

Best-Case-Szenario: Sie erhalten Ihre Antwort beim ersten Versuch. Sie müssen ernsthaft der glücklichste Mensch der Welt sein, damit dies geschieht. Die Chancen dafür sind astronomisch.

Worst-Case-Szenario: Sie erhalten Ihre Antwort nach 2 ^ 128 – 1 Mal. Grundsätzlich bedeutet dies, dass Sie Ihre Antwort am Ende aller Daten finden.

Durchschnittliches Szenario: Sie finden es irgendwo in der Mitte, also im Grunde nach 2 ^ 128/2 = 2 ^ 127 Mal. Um das ins rechte Licht zu rücken: 2 ^ 127 = 1,7 x 10 ^ 38. Mit anderen Worten, es ist eine riesige Zahl.

Obwohl es möglich ist, den Widerstand vor dem Bild mithilfe der Brute-Force-Methode zu unterbrechen, dauert es so lange, dass es keine Rolle spielt.

Eigenschaft 4: Der Lawineneffekt.

Selbst wenn Sie eine kleine Änderung an Ihrer Eingabe vornehmen, sind die Änderungen, die sich im Hash widerspiegeln, sehr groß. Testen wir es mit SHA-256:

Das In und Out von kryptografischen Hash-Funktionen

Siehst du das? Auch wenn Sie gerade die Groß- und Kleinschreibung des ersten Alphabets der Eingabe geändert haben, sehen Sie sich an, wie stark sich dies auf den Ausgabe-Hash ausgewirkt hat.

Diese Eigenschaft wird auch als Lawineneffekt bezeichnet.

Eigenschaft 5: Kollisionsbeständig

Bei zwei verschiedenen Eingängen A und B, bei denen H (A) und H (B) ihre jeweiligen Hashes sind, ist es nicht möglich, dass H (A) gleich H (B) ist. Dies bedeutet, dass zum größten Teil jede Eingabe ihren eigenen Hash hat. Warum haben wir “größtenteils” gesagt? Um das zu verstehen, müssen wir wissen, was „The Birthday Paradox“ ist.

Was ist das Geburtstagsparadoxon??

Wenn Sie auf der Straße einen zufälligen Fremden treffen, ist die Wahrscheinlichkeit sehr gering, dass Sie beide denselben Geburtstag haben. Unter der Annahme, dass alle Tage des Jahres die gleiche Wahrscheinlichkeit haben, Geburtstag zu haben, beträgt die Wahrscheinlichkeit, dass eine andere Person Ihren Geburtstag teilt, 1/365, was 0,27% entspricht. Mit anderen Worten, es ist wirklich niedrig.

Wenn Sie jedoch 20 bis 30 Personen in einem Raum versammeln, steigt die Wahrscheinlichkeit, dass zwei Personen genau denselben Geburtstag haben, astronomisch. Tatsächlich besteht in diesem Szenario eine 50: 50-Chance für zwei Personen, denselben Geburtstag zu teilen!

Das In und Out von kryptografischen Hash-Funktionen

Warum passiert das? Dies liegt an einer einfachen Wahrscheinlichkeitsregel, die wie folgt lautet:

Angenommen, Sie haben N verschiedene Möglichkeiten, dass ein Ereignis eintritt, dann benötigen Sie eine Quadratwurzel von N zufälligen Elementen, damit diese eine 50% ige Chance auf eine Kollision haben.

Wenn Sie diese Theorie für Geburtstage anwenden, haben Sie 365 verschiedene Möglichkeiten für Geburtstage. Sie benötigen also nur Sqrt (365), also ~ 23 ~, zufällig ausgewählte Personen für eine 50% ige Chance, dass zwei Personen Geburtstage teilen.

Was ist die Anwendung davon beim Hashing?

Angenommen, Sie haben einen 128-Bit-Hash mit 2 ^ 128 verschiedenen Möglichkeiten. Wenn Sie das Geburtstagsparadoxon verwenden, haben Sie eine 50% ige Chance, den Kollisionswiderstand in der Instanz sqrt (2 ^ 128) = 2 ^ 64 zu brechen.

Wie Sie sehen können, ist es viel einfacher, die Kollisionsbeständigkeit zu brechen, als die Vorbildbeständigkeit zu brechen. Keine Hash-Funktion ist kollisionsfrei, aber es dauert normalerweise so lange, bis eine Kollision gefunden wird. Wenn Sie also eine Funktion wie SHA-256 verwenden, können Sie davon ausgehen, dass A = B ist, wenn H (A) = H (B).

Wie erstellen Sie eine kollisionssichere Hash-Funktion? Dafür verwenden wir ein Paradigma namens Merkle-Damgard-Paradigma.

Was ist das Merkle-Damgard-Paradigma??

Das Paradigma ist sehr einfach und basiert auf der folgenden Philosophie: Bei einer kollisionssicheren Hash-Funktion für Kurznachrichten können wir eine kollisionssichere Hash-Funktion für lange Nachrichten erstellen.

Das In und Out von kryptografischen Hash-Funktionen

Bildnachweis: Youtube

Beachten Sie unter Berücksichtigung des obigen Diagramms Folgendes:

  • Eine größere Nachricht M wird in kleinere Blöcke von m [i] zerlegt..

  • Die Hash-Funktion H besteht aus vielen kleineren Hash-Funktionen “h”.

  • “H” ist eine kleinere Hash-Funktion, auch bekannt als Komprimierungsfunktion, die einen kleinen Nachrichtenblock aufnimmt und einen Hash zurückgibt.

  • Die erste Hash-Funktion “h” (die im obigen Diagramm eingekreist ist) nimmt den ersten Nachrichtenblock (m [0]) auf und addiert einen festen Wert IV und gibt den Hash zurück.

  • Der Hash wird nun zum zweiten Nachrichtenblock hinzugefügt und durchläuft einen anderen Hash

  • Funktion h und dies geht weiter bis zum letzten Nachrichtenblock, wo der Nachricht auch ein Füllblock PB hinzugefügt wird.

  • Die Ausgabe jeder Kompressionsfunktion h wird als Verkettungsvariable bezeichnet.

  • Der Füllblock besteht aus einer Reihe von Einsen und Nullen. Im SHA-256-Algo ist der PB 64 Bit lang.

  • Die Ausgabe der Hash-Komprimierungsfunktion h ist die Ausgabe der großen Nachricht M..

Wie folgt dies der Kollisionsbeständigkeit??

Dazu folgen wir der einfachen Theorie: Wenn „h“ kollisionsfest ist, sollte auch „H“ kollisionsfest sein.

Um diesen Satz zu beweisen, werden wir in die entgegengesetzte Richtung gehen. Das heißt, wenn wir beweisen können, dass eine Kollision auf H vorliegt, sollte h auch eine Kollision haben.

Angenommen, es gibt zwei Nachrichten M und M ‘und wir bekommen eine Kollision mit beiden Hashes, was bedeutet:

H (M) = H (M ‘)

Dann können wir diese Informationen verwenden, um die Kollision in h abzuleiten. Lassen Sie uns zunächst die Verkettungsvariablen für H (M) und H (M) ableiten..

Für H (M)

IV = H (0), H (1), …, H (t), H (t + 1) = H (M)

Für H (M ’)

IV = H ‘(0), H’ (1), …, H ‘(r), H’ (r + 1) = H (M ‘)

Beide Hash-Funktionen haben möglicherweise nicht die gleiche Anzahl von Verkettungsvariablen (t ist möglicherweise nicht gleich r). In beiden Szenarien:

H (t + 1) = H (M).

UND

H ‘(r + 1) = H (M’)

Und da wir wissen, dass H (M) = H (M ‘) ist, da eine Kollision existiert, ist H’ (r + 1) = H (t + 1).

Hmm … wir haben hier eine interessante Vermutung. Lassen Sie uns auf unser Diagramm oben zurückgreifen:

Das In und Out von kryptografischen Hash-Funktionen

Wenn nun H (t + 1) und H ‘(r + 1) die letzten Hashes ihrer jeweiligen Hash-Funktionen sind, was wäre dann die Nachricht, die in die letzte Komprimierungsfunktion jeder Funktion eingegangen wäre??

Für H (t + 1) wäre das h (H (t), M (t) || PB)

In ähnlicher Weise ist H ‘(r + 1) = h (H’ (r), M ‘(r) || PB’)

Wenn nun H (t + 1) und H ‘(r + 1) die letzten Hashes ihrer jeweiligen Hash-Funktionen sind, was wäre dann die Nachricht, die in die letzte Komprimierungsfunktion jeder Funktion eingegangen wäre??

Für H (t + 1) wäre das h (H (t), M (t) || PB)

In ähnlicher Weise ist H ‘(r + 1) = h (H’ (r), M ‘(r) || PB’)

Unter welchen Bedingungen sollte die Kompressionsfunktion „h“ nicht kollisionssicher sein? IFF gibt Eingaben, die keine ähnliche Bedeutung haben, dieselbe Ausgabe:

  • H (t)! = H ’(r).
  • M (t)! = M ‘(r).
  • PB! = PB ’.

Wenn diese Ausgänge jedoch ähnlich sind, müssen wir etwas tiefer gehen. Wenn PB = PB ’, dann wissen wir, dass beide die gleiche Anzahl von Nachrichtenblöcken haben, was t = r bedeutet, was automatisch bedeuten würde, dass:

M (t) = M ‘(r)

UND H (t) = H ‘(r)

In diesem Fall betrachten wir H (t) und H ‘(r), die wir als H’ (t) umschreiben können, da der Wert von t und r gleich ist.

Was wäre also der Wert von H (t) und H ’(t)??

H (t) = h (H (t-1), M (t-1)) und H ‘(t) = h (H’ (t-1), M ‘(t-1))

Da H (t) = H ‘(t), dann ist h (H (t-1), M (t-1)) = h (H’ (t-1), M ‘(t-1)).

Damit die Kollision durchhält, müssen die folgenden Bedingungen beachtet werden:

H (t-1)! = H ‘(t-1)

M (t-1)! = M ‘(t-1),

Wenn diese Bedingungen zutreffen, wissen wir, dass wir eine Kollision auf h gefunden haben und aufhören können.

Was passiert nun, wenn diese Bedingungen erfüllt sind??

Bedeutung H (t-1) = H ‘(t-1) und da wir bereits wissen, dass M (t) = M’ (t), dann ist M (t-1) = M ‘(t-1).

Wir können die obigen Berechnungen für H (t-1) und H ‘(t-1) bis zum Anfang der Nachricht fortsetzen. In diesem Fall muss eine der beiden folgenden Bedingungen erfüllt sein:

  • Finden Sie eine Kollision für h.
  • Alle Nachrichtenblöcke von M und M sind gleich.

Da wir bereits wissen, dass die Hauptbedingung für eine auftretende Kollision darin besteht, dass die Eingangsnachricht M und M nicht gleich sein können, ist die einzige andere Bedingung, bei der eine Kollision von H auftritt, wenn die Kompressionsfunktion h ebenfalls eine Kollision aufweist.

Daher können wir sehen, dass wir für jede Hash-Funktion H, die eine Kollision hat, eine Kompressionsfunktion h erhalten, die ebenfalls eine Kollision hat, und daher gilt Merkle-Damgard.

Eigenschaft 6: Puzzle freundlich

Dies ist eine sehr faszinierende Eigenschaft, und die Anwendung und die Auswirkungen dieser einen Eigenschaft auf die Kryptowährung sind enorm. Definieren wir zunächst die Eigenschaft. Anschließend werden wir jeden Begriff im Detail behandeln.

Wenn für jede Ausgabe “Y” k aus einer Verteilung mit hoher Min-Entropie ausgewählt wird, ist es unmöglich, eine Eingabe x zu finden, so dass H (k | x) = Y ist.

Das ist dir wahrscheinlich über den Kopf gegangen! Aber es ist in Ordnung, lassen Sie uns jetzt verstehen, was diese Definition bedeutet.

Was bedeutet “hohe Min-Entropie”??

Dies bedeutet, dass die Verteilung, aus der der Wert ausgewählt wird, so stark verteilt ist, dass wir einen zufälligen Wert auswählen unerheblich Wahrscheinlichkeit. Wenn Sie aufgefordert wurden, eine Zahl zwischen 1 und 5 zu wählen, ist dies im Grunde eine niedrige Min-Entropie-Verteilung. Wenn Sie jedoch eine Zahl zwischen 1 und einer Unmenge wählen, ist dies eine hohe Min-Entropie-Verteilung.

Was bedeutet “k | x”??

Das “|” bezeichnet die Verkettung. Verkettung bedeutet, zwei Zeichenfolgen zu addieren. Z.B. Wenn ich “BLAU” und “HIMMEL” zusammen verketten würde, wäre das Ergebnis “BLUESKY”..

Lassen Sie uns nun die Definition überdenken:

Angenommen, Sie haben einen Ausgabewert “Y”. Wenn Sie einen zufälligen Wert “k” aus einer breiten Verteilung auswählen, ist es unmöglich, einen Wert X zu finden, so dass der Hash der Verkettung von k und x die Ausgabe Y ergibt.

Beachten Sie noch einmal das Wort “undurchführbar”, es ist nicht unmöglich, weil die Leute dies die ganze Zeit tun. Tatsächlich arbeitet der gesamte Bergbauprozess daran (dazu später mehr)..

Beispiele für kryptografische Hash-Funktionen

  • MD 5: Es wird ein 128-Bit-Hash erzeugt. Die Kollisionsbeständigkeit wurde nach ~ 2 ^ 21 Hashes gebrochen.

  • SHA 1: Erzeugt einen 160-Bit-Hash. Der Kollisionswiderstand brach nach ~ 2 ^ 61 Hashes.

  • SHA 256: Erzeugt einen 256-Bit-Hash. Dies wird derzeit von Bitcoin verwendet.

  • Keccak-256: Erzeugt einen 256-Bit-Hash und wird derzeit von Ethereum verwendet.

  • RIPEMD-160: Erzeugt eine 160-aber-Ausgabe und wird vom Bitcoin-Skript (zusammen mit SHA-256) verwendet..

  • CryptoNight: Die von Monero verwendete Hash-Funktion.

Nachdem wir uns nun mit der Bedeutung von Hashing und den Eigenschaften kryptografischer Hash-Funktionen befasst haben, möchten wir uns mit einigen der am häufigsten verwendeten kryptografischen Hash-Funktionen in Cryptocurrency vertraut machen.

Sichere Hashing-Algorithmen (SHA)

Sichere Hash-Algorithmen, laut seiner Wikipedia-Seite, sind eine Familie von kryptografischen Hash-Funktionen, die vom National Institute of Standards and Technology (NIST) als US-amerikanischer Federal Information Processing Standard (FIPS) veröffentlicht wurden. Die SHA besteht aus folgenden Algorithmen:

  • SHA-0: Bezieht sich auf die ursprüngliche 160-Bit-Hash-Funktion, die 1993 unter dem Namen „SHA“ veröffentlicht wurde. Es wurde kurz nach der Veröffentlichung aufgrund eines unbekannten „signifikanten Fehlers“ zurückgezogen und durch die leicht überarbeitete Version SHA-1 ersetzt.

  • SHA-1: Wurde eingeschaltet, als SHA-0 nicht liefern konnte. Dies ist eine 160-Bit-Hash-Funktion, die dem früheren MD5-Algorithmus ähnelt. Dies wurde von der National Security Agency (NSA) als Teil der Digital konzipiert Unterschrift Algorithmus. Es wurde jedoch kurz nachdem die Leute kryptografische Schwächen bemerkt hatten, abgeladen.

  • SHA-2: Ah, jetzt kommen wir zu einer der beliebtesten Kategorien von Hash-Funktionen da draußen. Es wurde von der NSA nach dem Merkle-Damgard-Paradigma entworfen. Sie sind eine Familie von zwei Hash-Funktionen mit unterschiedlichen Wortgrößen: SHA-256 und SHA-512. Bitcoin verwendet SHA-256

  • SHA-3: Früher als Keccak bekannt, wurde es 2012 nach einem öffentlichen Wettbewerb unter Nicht-NSA-Designern ausgewählt. Es unterstützt die gleichen Hash-Längen wie SHA-2 und seine interne Struktur unterscheidet sich erheblich vom Rest der SHA-Familie. Ethereum verwendet diese Hash-Funktion.

Das In und Out von kryptografischen Hash-Funktionen

Bildnachweis: Wikipedia

Schauen wir uns SHA-256 und SHA-3 genauer an.

SHA-256

SHA-256 ist eine SHA-2-Funktion, die 32-aber-Wörter verwendet, im Gegensatz zu SHA-512, die 64-Bit-Wörter verwendet. Bitcoin verwendet SHA-256 auf zwei wichtige Arten:

  • Bergbau.
  • Erstellung von Adressen.

Bergbau:

Beim Bergbau in Bitcoin lösen Bergleute komplexe Rechenrätsel, um einen Block zu finden, der dann an die Bitcoin-Blockchain angehängt wird. Dies wird als Proof-of-Work bezeichnet und beinhaltet die Berechnung einer SHA-256-Hash-Funktion.

Erstellung von Adressen

Die SHA-256-Hash-Funktion wird verwendet, um den öffentlichen Bitcoin-Schlüssel zu hashen und die öffentliche Adresse zu generieren. Durch Drücken des Schlüssels wird die Identität der Person zusätzlich geschützt. Außerdem ist eine Hash-Adresse einfach kürzer als ein öffentlicher Bitcoin-Schlüssel, was die Speicherung verbessert.

SHA-256 in Aktion

Eingang: Hallo

Ausgabe: 98EA6E4F216F2FB4B69FFF9B3A44842C38686CA685F3F55DC48C5D3FB1107BE4

SHA-3

Wie oben erwähnt, war dies früher als Keccak bekannt und wird von Ethereum verwendet. Es wurde nach einem öffentlichen Wettbewerb von Nicht-NSA-Designern erstellt. Der SHA-3 verwendet die Schwammfunktion.

Was ist die Schwammfunktion??

Das In und Out von kryptografischen Hash-Funktionen

Bildnachweis: Wikipedia

Eine Schwammfunktion ist eine Klasse von Algorithmen mit endlichem internen Zustand, die einen Eingangsbitstrom beliebiger Länge und einen Ausgangsbitstrom beliebiger Länge erzeugt.

Bevor wir fortfahren, müssen wir einige Begriffe definieren:

Wir wussten, dass in einer Schwammfunktion Daten „absorbiert“In den Schwamm, dann ist das Ergebnis”gedrückt” aus.

Es gibt also ein „Absorbieren“Phase und ein”DrückenPhase.

Phase absorbieren:

In dieser Phase wird die Nachricht in Blöcke unterteilt und XOR in eine Teilmenge des Zustands umgewandelt, die dann mithilfe einer Permutationsfunktion f als Ganzes transformiert wird.

Das In und Out von kryptografischen Hash-Funktionen

Quetschphase:

Aus Wikipedia. „Ausgabeblöcke werden abwechselnd mit der Zustandstransformationsfunktion f aus derselben Teilmenge des Zustands gelesen. Die Größe des Teils des Zustands, der geschrieben und gelesen wird, wird als “Rate” (bezeichnet mit r) bezeichnet, und die Größe des Teils, der durch Eingabe / Ausgabe unberührt bleibt, wird als “Kapazität” (bezeichnet mit c) bezeichnet. Die Kapazität bestimmt die Sicherheit des Schemas. Die maximale Sicherheitsstufe beträgt die Hälfte der Kapazität. “

Das In und Out von kryptografischen Hash-Funktionen

Um zu sehen, wie es funktioniert, betrachten Sie die folgenden Elemente:

  • Eine Eingabezeichenfolge N..

  • Eine Polsterfunktion “Pad”.

  • Eine Permutationsfunktion “f”, die aus Bitblöcken der Breite b arbeitet.

  • Eine Rate “r”.

  • Ausgangslänge = “d”.

  • Kapazität “c” = b-r.

  • Schwammkonstruktion: Schwamm [f, Pad, r] (N, d), der zu einer Bitfolge Z der Länge d führt.

Wie wird der Prozess jetzt funktionieren??

  • Zunächst wird die Eingabezeichenfolge mit “pad” aufgefüllt, was zu der aufgefüllten Bitfolge P mit einer durch r teilbaren Länge führt.
  • Der aufgefüllte String P wird dann in n aufeinanderfolgende r-Bit-Blöcke von P [0] bis P [n-1] zerlegt..
  • Dann initialisieren wir den Zustand S mit einer Folge von b 0 Bits.
  • Jetzt wird jeder Block der gepolsterten Zeichenfolge P mit dem folgenden Verfahren absorbiert:

    a) Jeder Block p [i] wird mit einer Folge von c “0 Bits” aufgefüllt, bis er die Länge “b” erreicht..

  1. b) Die resultierende Zeichenfolge ist XOR mit “S”, d. h. dem Zustand, der vom vorherigen Block stammt.

    c) Schließlich wird die Blockpermutationsfunktion f auf das Ergebnis angewendet, was einen neuen Zustand S ergibt.

    HINWEIS: Jeder Block führt zu einem neuen Zustand S. Wie wir in Schritt 3 gesehen haben, ist der initialisierte Wert “0”..

  • Das Ergebnis Z wird mit der leeren Zeichenfolge initialisiert.
  • WENN die Länge von Z kleiner als d ist:

    a) Die ersten r Bits von S werden an Z angehängt.

    b) Wenn Z immer noch nicht die erforderliche Länge hat, wird die Permutationsfunktion f auf S angewendet, um einen neuen Zustand zu erzeugen, und von dort werden die Bits zu Z addiert.

  • Wenn Z zu lang ist, wird es auf d Bits abgeschnitten.

SHA-3 in Aktion:

Eingang: Hallo

Ausgabe: 154013cb8140c753f0ac

358da6110fe237481b26c75c3ddc1b

59eaf9dd7b46a0a3aeb2cef164b3c82

d65b38a4e26ea9930b7b2cb3c01da

4ba331c95e62ccb9c3

RIPEMD-160 Hash-Funktion

RIPEMD ist eine Familie kryptografischer Hash-Funktionen, die in Leuven, Belgien, von Hans Dobbertin, Antoon Bosselaers und Bart Preneel in der COSIC-Forschungsgruppe der Katholieke Universiteit Leuven entwickelt und 1996 erstmals veröffentlicht wurde.

Während RIPEMD auf den Designprinzipien von MD4 basiert, ist seine Leistung SHA-1 sehr ähnlich. RIPEMD-160 ist die 160-Bit-Version dieser Hash-Funktion und wird häufig zum Generieren von Bitcoin-Adressen verwendet.

Der öffentliche Bitcoin-Schlüssel wird zuerst über die SHA-256-Hash-Funktion und dann über RIPEMD-160 ausgeführt. Der Grund, warum wir das tun, ist, dass die Ausgabe von 160 Bit viel kleiner als 256 Bit ist, was zur Platzersparnis beiträgt.

Darüber hinaus ist RIPEMD-160 die einzige Hash-Funktion, die die kürzesten Hashes erzeugt, deren Eindeutigkeit noch ausreichend gewährleistet ist.

Das In und Out von kryptografischen Hash-Funktionen

Bildnachweis: Wikipedia

Das Bild oben zeigt eine Momentaufnahme eines Unterblocks aus der Komprimierungsfunktion des RIPEMD-160-Hash-Algorithmus.

RIPEMD-160 in Aktion:

Eingang: Hallo

Ausgabe: 242485ab6bfd3502bcb3442ea2e211687b8e4d89

CryptoNight Hash-Funktion

Jetzt haben wir die CryptoNight-Hash-Funktion, die von Monero verwendet wird. Im Gegensatz zu Bitcoin wollte Monero, dass das Mining so GPU-unfreundlich wie möglich ist. Die einzige Möglichkeit, dies zu tun, bestand darin, ihren Hash-Algorithmus speicherhart zu machen.

Geben Sie CryptoNight ein

CryptoNight ist eine speicherharte Hash-Funktion. Es ist so konzipiert, dass es auf GPU-, FPGA- und ASIC-Architekturen ineffizient berechenbar ist. Der kurze Überblick über die Funktionsweise von CryptoNight lautet wie folgt:

  • Der Algorithmus initialisiert zunächst ein großes Notizbuch mit pseudozufälligen Daten.

  • Danach finden zahlreiche Lese- / Schreiboperationen an Pseudozufallsadressen statt

  • im Notizblock enthalten.

  • Schließlich wird das gesamte Notizblock gehasht, um den endgültigen Wert zu erzeugen.

Das folgende Diagramm zeigt das Schema des CryptoNight-Hash-Algorithmus.

Das In und Out von kryptografischen Hash-Funktionen

Bildnachweis: Daves Daten

HINWEIS: Alle Daten und Codes aus CryptoNight-Whitepaper

Schritt 1: Scratchpad-Initialisierung

Der erste Schritt der CryptoNight-Hash-Funktion ist die Initialisierung des Notizblocks. Die Initialisierung erfolgt wie folgt:

  • Die Eingabedaten werden mit Keccak mit den Parametern b = 1600 und c = 512 gehasht.
  • Die ersten 32 Bytes der Ausgabe des Keccak werden als AES-256-Schlüssel [AES] interpretiert und auf 10 runde Schlüssel erweitert.
  • Ein Notizblock mit 2097152 Bytes (2 MiB) wird zugewiesen.
  • Die Bytes 64-191 werden aus dem Keccak-Endzustand extrahiert und in 8 Blöcke mit jeweils 16 Bytes aufgeteilt.
  • Jeder Block wird dann wie folgt verschlüsselt:

    für i = 0..9 mache:

    block = aes_round (block, round_keys [i])

  • Die AES-Verschlüsselung wird für die Blöcke durchgeführt und das Ergebnis ist XOR mit dem runden Schlüssel.
  • Die resultierenden Blöcke werden zu den ersten 128 Bytes des Notizblocks. Danach werden die Blöcke erneut verschlüsselt, was zu den zweiten 128 Bytes des Notizblocks wird. Der Prozess wird fortgesetzt, bis er vollständig initialisiert ist.

Das In und Out von kryptografischen Hash-Funktionen

Bild: Aus GitHub. Das Diagramm zeigt die Initialisierung des Scratch Pads.

Schritt 2: Speicher-Hard-Loop

Dieser Schritt der Hash-Funktion dient dazu, den Hash für GPUS so schwer wie möglich abzubauen.

  • Zunächst werden die Bytes 0..31 und 32..63 der Keccak-Ausgabe XOR-verknüpft, und die resultierenden 32 Bytes werden verwendet, um die Variablen a und b mit jeweils 16 Bytes zu initialisieren.
  • Die Variablen a und b treten dann in die Hauptschleife ein.
  • Die Schleife wird 524.288 Mal wiederholt.
  • Wenn ein 16-Byte-Wert im Notizblock in eine Adresse konvertiert werden muss, wird er als Little-Endian-Ganzzahl interpretiert, und die 21 niederwertigen Bits werden als Byte-Index verwendet. Die 4 niederwertigen Bits des Index werden jedoch gelöscht, um die 16-Byte-Ausrichtung sicherzustellen.
  • Die resultierenden Daten werden in 16-Byte-Blöcken in das Notizbuch eingegeben.

Jede Iteration kann mit dem folgenden Pseudocode ausgedrückt werden:

Das In und Out von kryptografischen Hash-Funktionen

  • Im obigen Code repräsentiert die 8byte_add-Funktion jedes der Argumente als ein Paar von 64-Bit-Little-Endian-Werten und addiert sie komponentenweise modulo 2 ^ 64. Das Ergebnis wird wieder in 16 Bytes konvertiert.
  • Andererseits verwendet die 8byte_mul-Funktion jedoch nur die ersten 8 Bytes jedes Arguments, die als vorzeichenlose 64-Bit-Little-Endian-Ganzzahlen interpretiert und miteinander multipliziert werden. Das Ergebnis wird in 16 Bytes konvertiert, und schließlich werden die beiden 8-Byte-Hälften des Ergebnisses ausgetauscht.

Das In und Out von kryptografischen Hash-Funktionen

Bild: Dies ist ein Diagramm des Memory Hard Loop-Segments.

Schritt 3: Die Ergebnisberechnung

Schließlich haben wir die Ergebnisberechnung.

  • Wenn die Speicher-Hard-Loop-Funktion ausgeführt ist, werden die Bytes 32-63 des Keccak-Ausgangs auf die gleiche Weise wie im ersten Teil in 10 AES-Rundschlüssel erweitert.
  • Die Bytes 64..191 werden aus dem Keccak-Status extrahiert und mit den ersten 128 Bytes des Notizblocks XOR-verknüpft.
  • Der resultierende Status wird dann auf die gleiche Weise wie im ersten Teil verschlüsselt, jedoch unter Verwendung der neuen Schlüssel.
  • Das Ergebnis ist XOR mit den zweiten 128 Bytes vom Notizblock, erneut verschlüsselt und so weiter.
  • Nach dem XOR-Vorgang mit den letzten 128 Bytes des Notizblocks wird das Ergebnis das letzte Mal verschlüsselt, und dann werden die Bytes 64..191 im Keccak-Status durch das Ergebnis ersetzt.
  • Der Keccak-Zustand wird dann durch Keccak-f (die Keccak-Permutation) mit b = 1600 geleitet.
  • Die 2 niederwertigen Bits des ersten Bytes des Zustands werden verwendet, um eine Hash-Funktion auszuwählen: 0 = BLAKE-256 [BLAKE], 1 = Groestl-256 [GROESTL], 2 = JH-256 [JH] und 3 = Strang-256 [SKEIN]. Die ausgewählte Hash-Funktion wird dann auf den Keccak-Status angewendet, und der resultierende Hash ist ENDLICH die Ausgabe von CryptoNight.

Das In und Out von kryptografischen Hash-Funktionen

Das In und Out von kryptografischen Hash-Funktionen

Bild: Diagramm der Endergebnisgenerierung.

Im Gegensatz zum Scrypt Hashing-Algorithmus ist der Cryptonight-Algorithmus für jeden neuen Block von allen vorherigen Blöcken abhängig. CryptoNight ist elegant einfach und durch die clevere Verwendung der nativen AES-Verschlüsselung und der schnellen 64-Bit-Multiplikatoren bleibt der Algorithmus CPU-freundlich und gleichzeitig so GPU-unfreundlich wie möglich.

CryptoNight in Aktion:

Eingang: Das ist ein Test

Ausgabe: a084f01d1437a09c6985401b60d43554ae105802c5f5d8a9b3253649c0be6605

Fazit

Da haben Sie es also! Vier der am häufigsten verwendeten Hashing-Algorithmen in Kryptowährungen. Wenn Sie ein grundlegendes Verständnis ihrer Funktionsweise haben, können Sie die Vielzahl der Berechnungen, die hinter den Kulissen durchgeführt werden, respektieren. Neuere Hashing-Algorithmen werden möglicherweise auch in Zukunft hinzukommen, wodurch die oben genannten völlig überholt sind. Ist diese ständige Innovation jedoch nicht der aufregendste Teil des Krypto-Ökosystems??

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me