Zum Hauptinhalt springen

SHA-256 Schritt für Schritt

Im Artikel Wie funktioniert SHA-256? habe ich die Bestandteile des Algorithmus erklärt: Padding, Message Schedule, die Funktionen Ch, Maj, Σ₀ und Σ₁ sowie die 64 Kompressionsrunden.

Dieser Artikel ist anders. Statt nur die Theorie zu betrachten, kannst du hier deinen eigenen Namen oder einen beliebigen kurzen Text eingeben und die tatsächliche SHA-256-Berechnung dafür verfolgen.

Alle Werte, die der Explorer anzeigt, stammen aus einer echten SHA-256-Berechnung für genau deine Eingabe. SHA-256 ist dabei der bekannteste Vertreter der SHA-2-Familie.

SHA-256 Explorer

Was passiert in SHA-256, wenn du deinen eigenen Namen hashst? Hier siehst du die echte Berechnung – Schritt für Schritt.

0 Zeichen, 0 UTF-8-Bytes (maximal 55)

Diese Implementierung dient der Veranschaulichung von SHA-256. Für produktive kryptografische Anwendungen solltest du die Kryptografie-Funktionen deiner Plattform oder eine etablierte Bibliothek verwenden.

Der Explorer führt dich in sieben Schritten durch den Algorithmus:

  1. Eingabe & Bytes
  2. Padding
  3. 512-Bit-Block
  4. Message Schedule
  5. Initial State
  6. 64 Kompressionsrunden
  7. Finaler Hash

Diese sieben Schritte gehe ich im Folgenden nacheinander durch. Öffne sie parallel im Explorer und schau dir jeweils deine eigenen Werte an.

Der Explorer ist eine Lernimplementierung. Er dient dazu, SHA-256 verständlich zu machen, und ist keine Kryptografie-Bibliothek für den produktiven Einsatz.

Schritt 1: Aus deinem Text werden Bytes​

SHA-256 verarbeitet nicht die sichtbaren Zeichen, sondern Bytes.

Damit aus einem Text Bytes werden, muss er kodiert werden. Im Web ist dafür meist UTF-8 üblich, und auch der Explorer verwendet UTF-8. Jedes Zeichen wird dabei in ein bis vier Bytes übersetzt.

Die Zeichenanzahl und die Byteanzahl müssen deshalb nicht übereinstimmen. Ein einfaches lateinisches Zeichen wie a besteht aus einem Byte. Zeichen wie ä, é oder ñ benötigen zwei Bytes, und viele Emoji benötigen vier.

Gib im Explorer deinen Namen oder Text ein und starte die Untersuchung. In Schritt 1 siehst du für jedes Zeichen die zugehörigen Bytes in hexadezimaler und binärer Schreibweise sowie die Gesamtzahl der Bytes und Bits deiner Eingabe.

Probiere ruhig auch Zeichen mit Umlauten oder Akzenten aus und beobachte, wie sich die Byteanzahl verändert.

Schritt 2: Padding​

SHA-256 verarbeitet Nachrichten in Blöcken von jeweils 512 Bit. Deine Eingabe ist dafür fast immer zu kurz und wird deshalb aufgefüllt:

[ Nachricht ][ 1 ][ Nullen ][ ursprüngliche Länge ]

Dabei passiert Folgendes:

  • Direkt hinter deiner Nachricht wird ein einzelnes 1-Bit angehängt.
  • Danach folgen so viele 0-Bits, dass am Ende genau 64 Bit frei bleiben.
  • Die letzten 64 Bit enthalten die ursprüngliche Länge deiner Nachricht in Bit.

Für die kurzen Eingaben, die der Explorer unterstützt, entsteht auf diese Weise genau ein Block mit 512 Bit.

Wie viele Nullen es sind, hängt von der Länge deiner Eingabe ab. Der Explorer rechnet die Größen der einzelnen Abschnitte deshalb für deinen Text aus. Klicke auf „Bits anzeigen“, um die einzelnen Bits des Paddings zu sehen.

Schritt 3: Der 512-Bit-Block​

Der gepaddete Block besteht aus 512 Bit. SHA-256 rechnet mit 32-Bit-Wörtern:

512 Bit / 32 Bit = 16 Wörter

Diese 16 Wörter heißen:

W₀ ... W₁₅

Wähle im Explorer W₀ aus. Dort erkennst du vermutlich die ersten Bytes deiner eigenen Eingabe wieder, denn die Bytes werden einfach in Vierergruppen zu Wörtern zusammengefasst.

Direkt hinter den Bytes deiner Eingabe findest du das angehängte 1-Bit als Byte 80. Die kodierte ursprüngliche Bitlänge deiner Eingabe steht in den letzten beiden Wörtern W₁₄ und W₁₅. Bei kurzen Eingaben ist W₁₄ null und die Länge steht vollständig in W₁₅.

Schritt 4: Das Message Schedule​

Die 64 Kompressionsrunden benötigen 64 Wörter, der Block liefert aber nur 16. Deshalb werden die Wörter

W₀ ... W₁₅

zu

W₀ ... W₆₃

erweitert. Jedes neue Wort entsteht aus vier früheren Wörtern. Für W₁₆ lautet die Formel:

W₁₆ =
σ₁(W₁₄)
+ W₉
+ σ₀(W₁)
+ W₀
mod 2³²

Wähle im Explorer W₁₆ aus. Dort siehst du die tatsächlichen Operanden für deine Eingabe und das Ergebnis der Addition. Über „σ₀/σ₁ aufschlüsseln“ kannst du außerdem die zugrunde liegenden ROTR- und SHR-Operationen betrachten.

Wähle danach weitere Wörter ab W₁₇ aus. Im Raster erkennst du am Rahmen, welche Wörter aus der Nachricht stammen und welche berechnet wurden.

Schritt 5: Der Initial State​

Bevor der erste Block verarbeitet wird, besitzt SHA-256 einen festen Anfangszustand aus acht Wörtern:

H₀ = 6a09e667
H₁ = bb67ae85
H₂ = 3c6ef372
H₃ = a54ff53a
H₄ = 510e527f
H₅ = 9b05688c
H₆ = 1f83d9ab
H₇ = 5be0cd19

Diese Werte sind im Standard festgelegt. Sie sind für jede Eingabe gleich und hängen deshalb nicht von deinem Text ab.

Für die Verarbeitung eines Blocks werden sie in die acht Arbeitsvariablen kopiert:

a = H₀
b = H₁
c = H₂
d = H₃
e = H₄
f = H₅
g = H₆
h = H₇

Schritt 6: Die 64 Kompressionsrunden​

Jetzt beginnt der Kern des Algorithmus. Öffne im Explorer Runde 0.

In jeder Runde werden zwei Hilfswerte berechnet:

T₁ =
h + Σ₁(e) + Ch(e,f,g) + K₀ + W₀
mod 2³²

und:

T₂ =
Σ₀(a) + Maj(a,b,c)
mod 2³²

Anschließend entsteht der neue Zustand:

a' = T₁ + T₂
b' = a
c' = b
d' = c
e' = d + T₁
f' = e
g' = f
h' = g

Die meisten Register werden also nur weitergeschoben. Neu berechnet werden nur a' und e'.

Der Explorer zeigt dir alle diese Werte für deine Eingabe. Bewege nun den Regler und gehe die Runden nacheinander durch:

0 → 1 → 2 → ... → 63

Jede Runde verwendet ihr eigenes Wort Wₜ aus dem Message Schedule und ihre eigene Konstante Kₜ und verändert den internen Zustand weiter.

Was bedeutet „Geänderte Bits“?​

Der Explorer zeigt unter dem Rundenzustand außerdem an, in wie vielen von 256 Bit sich der Zustand vor der gewählten Runde vom Startzustand unterscheidet. Dabei werden die Bits der acht Arbeitsvariablen a bis h mit den Bits von H₀ bis H₇ verglichen.

Diese Zahl ist eine Lernhilfe. Sie zeigt, wie stark sich der interne Zustand im Verlauf der Runden vom Anfangszustand entfernt hat. Sie ist weder ein Avalanche-Prozentwert noch eine Sicherheitsmessung.

Den Avalanche Effect selbst behandle ich im Artikel Was ist der Avalanche Effect?. Dort geht es um den Vergleich zweier Eingaben und ihrer fertigen Hashwerte. Ausprobieren kannst du das auch im Avalanche Effect Visualizer.

Schritt 7: Feed-forward und finaler Hash​

Nach Runde 63 werden die Arbeitsvariablen zum bisherigen Hashzustand addiert:

H₀ = H₀ + a
H₁ = H₁ + b
...
H₇ = H₇ + h

Jede Addition erfolgt modulo 2³².

Bei Nachrichten mit mehreren Blöcken wäre dieser neue Zustand der Startzustand für den nächsten Block. Der Explorer zeigt nur einen Block, deshalb ist er hier bereits das Endergebnis.

Zuletzt werden die acht Wörter hintereinander gesetzt:

H₀ || H₁ || ... || H₇

Das ergibt:

8 × 32 Bit = 256 Bit

In Schritt 7 des Explorers siehst du die Feed-forward-Addition mit deinen Werten und darunter den vollständigen SHA-256-Hash deiner Eingabe. Wie viel Sicherheit diese 256 Bit bedeuten, erkläre ich in Wie sicher sind 128, 256 und 512 Bit?.

Experiment: Ändere ein einziges Zeichen​

  1. Kopiere deinen Hash oder merke dir die ersten Zeichen.
  2. Ändere im Explorer ein einzelnes Zeichen deiner Eingabe.
  3. Starte die Untersuchung erneut.
  4. Vergleiche den neuen Hash mit dem alten.

Beobachte dabei, wo die Änderung beginnt: Ein verändertes Byte verändert ein Wort des Blocks. Dieses Wort fließt in mehrere Wörter des Message Schedules ein, und diese verändern wiederum die Kompressionsrunden. Deshalb unterscheidet sich am Ende ein großer Teil des Hashes.

Diesen Effekt und seine Grenzen erkläre ich in Was ist der Avalanche Effect?. Direkt vergleichen kannst du zwei Eingaben im Avalanche Effect Visualizer.

Warum nur kurze Eingaben?​

Der Explorer akzeptiert Eingaben bis zu 55 UTF-8-Bytes. Das ist eine Einschränkung der Darstellung und keine Einschränkung von SHA-256.

SHA-256 selbst verarbeitet Nachrichten mit sehr großer Länge. Auch die Lernimplementierung hinter dem Explorer kann bereits mehrere Blöcke berechnen. Die Oberfläche zeigt aber bewusst nur Nachrichten, die nach dem Padding in einen einzigen 512-Bit-Block passen: 55 Bytes, ein 1-Bit und das 64-Bit-Längenfeld ergeben genau 512 Bit.

Das hält die Darstellung übersichtlich. Bei mehreren Blöcken würde sich dieselbe Berechnung wiederholen, wobei der Hashzustand von Block zu Block weitergegeben wird.

Beachte, dass das Limit in Bytes gilt, nicht in Zeichen. Mit Zeichen wie ä oder Emoji erreichst du es früher.

Ist das wirklich SHA-256?​

Ja. Der Explorer führt die echten SHA-256-Operationen aus. Er basiert auf dem Secure Hash Standard von NIST (FIPS 180-4) und berechnet Padding, Message Schedule und alle 64 Runden selbst, statt nur ein fertiges Ergebnis anzuzeigen.

Ich habe die Implementierung mit offiziellen Testwerten und mit unabhängigen Implementierungen der Plattform verglichen. Trotzdem bleibt sie eine Lernimplementierung: Sie ist auf Verständlichkeit ausgelegt, nicht auf Geschwindigkeit oder Sicherheit gegen Seitenkanalangriffe. Für produktive Anwendungen solltest du die Kryptografie-Funktionen deiner Plattform oder eine etablierte Bibliothek verwenden.

Das Wichtigste in Kürze​

Du hast SHA-256 mit deiner eigenen Eingabe von Anfang bis Ende verfolgt:

Text
↓
UTF-8
↓
Padding
↓
512-Bit-Block
↓
W₀ ... W₁₅
↓
W₀ ... W₆₃
↓
Initial State
↓
64 Kompressionsrunden
↓
Feed-forward
↓
256-Bit-Hash
  • SHA-256 verarbeitet Bytes, nicht sichtbare Zeichen.
  • Zeichenanzahl und Byteanzahl können sich unterscheiden.
  • Das Padding ergänzt ein 1-Bit, Nullen und die ursprüngliche Länge.
  • Ein Block besteht aus 16 Wörtern zu je 32 Bit.
  • Das Message Schedule erweitert sie zu 64 Wörtern.
  • Der Initial State ist für jede Eingabe gleich.
  • Die 64 Runden verändern den Zustand mit Wₜ, Kₜ, T₁ und T₂.
  • Beim Feed-forward werden Zustand und Arbeitsvariablen addiert.
  • H₀ || ... || H₇ ergibt den 256-Bit-Hash.

Wie geht es weiter?​

Mit diesem Artikel gehören drei Beiträge zusammen:

  • Was ist SHA-256? erklärt Aufbau, Eigenschaften und Security Strength.
  • Wie funktioniert SHA-256? erklärt die Bestandteile des Algorithmus.
  • SHA-256 Schritt für Schritt zeigt die Berechnung für deine eigene Eingabe.

Den Explorer findest du auch als eigenständiges Werkzeug im Tools-Bereich.

Als Nächstes vergleiche ich SHA-256 mit SHA-512, und zwar mit deiner eigenen Eingabe: SHA-256 vs. SHA-512 – was ist der Unterschied?. SHA-512 ist nicht einfach SHA-256 mit einer längeren Ausgabe: Es arbeitet mit 64-Bit-Wörtern, 1024-Bit-Blöcken und 80 statt 64 Runden.

Quellen und weiterführende Standards​

Die folgenden Primär- und Normquellen bilden die Grundlage für die technischen Aussagen dieses Artikels:

  1. National Institute of Standards and Technology (NIST), FIPS 180-4 – Secure Hash Standard (SHS) Primärquelle für SHA-256, Padding, Message Schedule, Funktionen, Konstanten und Kompressionsalgorithmus.

  2. National Institute of Standards and Technology (NIST), Cryptographic Standards and Guidelines: Example Values Offizielle Beispielwerte für SHA-256, mit denen sich Zwischenergebnisse einer Implementierung für bestimmte Nachrichten überprüfen lassen. Für beliebige eigene Eingaben stellt NIST keine Vergleichswerte bereit.

  3. National Institute of Standards and Technology (NIST), CAVP – Secure Hashing Testvektoren und Informationen zur Validierung von Implementierungen der Secure Hash Algorithms.