6. Computing the Message Digest (Berechnung des Nachrichtendigests)
Die Ausgabe jeder der sicheren Hash-Funktionen nach Anwendung auf eine Nachricht mit N Blöcken ist die Hash-Größe H(N). Für SHA-224 und SHA-256 kann H(i) als acht 32-Bit-Wörter betrachtet werden, H(i)0, H(i)1, ... H(i)7. Für SHA-384 und SHA-512 kann es als acht 64-Bit-Wörter betrachtet werden, H(i)0, H(i)1, ..., H(i)7.
Wie unten beschrieben, werden die Hash-Wörter initialisiert, bei der Verarbeitung jedes Nachrichtenblocks modifiziert und schließlich nach der Verarbeitung des letzten Blocks verkettet, um die Ausgabe zu erzeugen. Für SHA-256 und SHA-512 werden alle H(N)-Variablen verkettet, während die SHA-224- und SHA-384-Hashes durch Weglassen einiger aus der endgültigen Verkettung erzeugt werden.
6.1. SHA-224- und SHA-256-Initialisierung (SHA-224 and SHA-256 Initialization)
Für SHA-224 besteht der anfängliche Hash-Wert H(0) aus den folgenden 32-Bit-Wörtern in Hexadezimal:
H(0)0 = c1059ed8
H(0)1 = 367cd507
H(0)2 = 3070dd17
H(0)3 = f70e5939
H(0)4 = ffc00b31
H(0)5 = 68581511
H(0)6 = 64f98fa7
H(0)7 = befa4fa4
Für SHA-256 besteht der anfängliche Hash-Wert H(0) aus den folgenden acht 32-Bit-Wörtern in Hexadezimal. Diese Wörter wurden durch Nehmen der ersten 32 Bits der Bruchteile der Quadratwurzeln der ersten acht Primzahlen erhalten.
H(0)0 = 6a09e667
H(0)1 = bb67ae85
H(0)2 = 3c6ef372
H(0)3 = a54ff53a
H(0)4 = 510e527f
H(0)5 = 9b05688c
H(0)6 = 1f83d9ab
H(0)7 = 5be0cd19
6.2. SHA-224- und SHA-256-Verarbeitung (SHA-224 and SHA-256 Processing)
SHA-224 und SHA-256 führen identische Verarbeitung auf Nachrichtenblöcken durch und unterscheiden sich nur darin, wie H(0) initialisiert wird und wie sie ihre endgültige Ausgabe erzeugen. Sie können zum Hashen einer Nachricht M mit einer Länge von L Bits verwendet werden, wobei 0 <= L < 2^64. Der Algorithmus verwendet (1) einen Nachrichtenplan von vierundsechzig 32-Bit-Wörtern, (2) acht Arbeitsvariablen von je 32 Bits und (3) einen Hash-Wert von acht 32-Bit-Wörtern.
Die Wörter des Nachrichtenplans sind mit W0, W1, ..., W63 gekennzeichnet. Die acht Arbeitsvariablen sind mit a, b, c, d, e, f, g und h gekennzeichnet. Die Wörter des Hash-Werts sind mit H(i)0, H(i)1, ..., H(i)7 gekennzeichnet, die den anfänglichen Hash-Wert H(0) halten, der durch jeden aufeinanderfolgenden Zwischen-Hash-Wert (nach Verarbeitung jedes Nachrichtenblocks) H(i) ersetzt wird und mit dem endgültigen Hash-Wert H(N) endet, nachdem alle N Blöcke verarbeitet wurden. Sie verwenden auch zwei temporäre Wörter, T1 und T2.
Die Eingabenachricht wird wie in Abschnitt 4.1 oben beschrieben gepolstert und dann in 512-Bit-Blöcke geparst, die als aus sechzehn 32-Bit-Wörtern M(i)0, M(i)1, ..., M(i)15 bestehend betrachtet werden. Die folgenden Berechnungen werden dann für jeden der N Nachrichtenblöcke durchgeführt. Alle Additionen werden modulo 2^32 durchgeführt.
Für i = 1 bis N
- Vorbereiten des Nachrichtenplans W (Prepare the message schedule W):
Für t = 0 bis 15
Wt = M(i)t
Für t = 16 bis 63
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
- Initialisieren der Arbeitsvariablen (Initialize the working variables):
a = H(i-1)0
b = H(i-1)1
c = H(i-1)2
d = H(i-1)3
e = H(i-1)4
f = H(i-1)5
g = H(i-1)6
h = H(i-1)7
- Durchführen der Haupt-Hash-Berechnung (Perform the main hash computation):
Für t = 0 bis 63
T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt
T2 = BSIG0(a) + MAJ(a,b,c)
h = g
g = f
f = e
e = d + T1
d = c
c = b
b = a
a = T1 + T2
- Berechnen des Zwischen-Hash-Werts H(i) (Compute the intermediate hash value H(i)):
H(i)0 = a + H(i-1)0
H(i)1 = b + H(i-1)1
H(i)2 = c + H(i-1)2
H(i)3 = d + H(i-1)3
H(i)4 = e + H(i-1)4
H(i)5 = f + H(i-1)5
H(i)6 = g + H(i-1)6
H(i)7 = h + H(i-1)7
Nachdem die obigen Berechnungen sequenziell für alle Blöcke in der Nachricht durchgeführt wurden, wird die endgültige Ausgabe berechnet. Für SHA-256 ist dies die Verkettung aller H(N)0, H(N)1 bis H(N)7. Für SHA-224 ist dies die Verkettung von H(N)0, H(N)1 bis H(N)6.
6.3. SHA-384- und SHA-512-Initialisierung (SHA-384 and SHA-512 Initialization)
Für SHA-384 besteht der anfängliche Hash-Wert H(0) aus den folgenden acht 64-Bit-Wörtern in Hexadezimal. Diese Wörter wurden durch Nehmen der ersten 64 Bits der Bruchteile der Quadratwurzeln der neunten bis sechzehnten Primzahl erhalten.
H(0)0 = cbbb9d5dc1059ed8
H(0)1 = 629a292a367cd507
H(0)2 = 9159015a3070dd17
H(0)3 = 152fecd8f70e5939
H(0)4 = 67332667ffc00b31
H(0)5 = 8eb44a8768581511
H(0)6 = db0c2e0d64f98fa7
H(0)7 = 47b5481dbefa4fa4
Für SHA-512 besteht der anfängliche Hash-Wert H(0) aus den folgenden acht 64-Bit-Wörtern in Hexadezimal. Diese Wörter wurden durch Nehmen der ersten 64 Bits der Bruchteile der Quadratwurzeln der ersten acht Primzahlen erhalten.
H(0)0 = 6a09e667f3bcc908
H(0)1 = bb67ae8584caa73b
H(0)2 = 3c6ef372fe94f82b
H(0)3 = a54ff53a5f1d36f1
H(0)4 = 510e527fade682d1
H(0)5 = 9b05688c2b3e6c1f
H(0)6 = 1f83d9abfb41bd6b
H(0)7 = 5be0cd19137e2179
6.4. SHA-384- und SHA-512-Verarbeitung (SHA-384 and SHA-512 Processing)
SHA-384 und SHA-512 führen identische Verarbeitung auf Nachrichtenblöcken durch und unterscheiden sich nur darin, wie H(0) initialisiert wird und wie sie ihre endgültige Ausgabe erzeugen. Sie können zum Hashen einer Nachricht M mit einer Länge von L Bits verwendet werden, wobei 0 <= L < 2^128. Der Algorithmus verwendet (1) einen Nachrichtenplan von achtzig 64-Bit-Wörtern, (2) acht Arbeitsvariablen von je 64 Bits und (3) einen Hash-Wert von acht 64-Bit-Wörtern.
Die Wörter des Nachrichtenplans sind mit W0, W1, ..., W79 gekennzeichnet. Die acht Arbeitsvariablen sind mit a, b, c, d, e, f, g und h gekennzeichnet. Die Wörter des Hash-Werts sind mit H(i)0, H(i)1, ..., H(i)7 gekennzeichnet, die den anfänglichen Hash-Wert H(0) halten, der durch jeden aufeinanderfolgenden Zwischen-Hash-Wert (nach Verarbeitung jedes Nachrichtenblocks) H(i) ersetzt wird und mit dem endgültigen Hash-Wert H(N) endet, nachdem alle N Blöcke verarbeitet wurden.
Die Eingabenachricht wird wie in Abschnitt 4.2 oben beschrieben gepolstert und dann in 1024-Bit-Blöcke geparst, die als aus sechzehn 64-Bit-Wörtern M(i)0, M(i)1, ..., M(i)15 bestehend betrachtet werden. Die folgenden Berechnungen werden dann für jeden der N Nachrichtenblöcke durchgeführt. Alle Additionen werden modulo 2^64 durchgeführt.
Für i = 1 bis N
- Vorbereiten des Nachrichtenplans W (Prepare the message schedule W):
Für t = 0 bis 15
Wt = M(i)t
Für t = 16 bis 79
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
- Initialisieren der Arbeitsvariablen (Initialize the working variables):
a = H(i-1)0
b = H(i-1)1
c = H(i-1)2
d = H(i-1)3
e = H(i-1)4
f = H(i-1)5
g = H(i-1)6
h = H(i-1)7
- Durchführen der Haupt-Hash-Berechnung (Perform the main hash computation):
Für t = 0 bis 79
T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt
T2 = BSIG0(a) + MAJ(a,b,c)
h = g
g = f
f = e
e = d + T1
d = c
c = b
b = a
a = T1 + T2
- Berechnen des Zwischen-Hash-Werts H(i) (Compute the intermediate hash value H(i)):
H(i)0 = a + H(i-1)0
H(i)1 = b + H(i-1)1
H(i)2 = c + H(i-1)2
H(i)3 = d + H(i-1)3
H(i)4 = e + H(i-1)4
H(i)5 = f + H(i-1)5
H(i)6 = g + H(i-1)6
H(i)7 = h + H(i-1)7
Nachdem die obigen Berechnungen sequenziell für alle Blöcke in der Nachricht durchgeführt wurden, wird die endgültige Ausgabe berechnet. Für SHA-512 ist dies die Verkettung aller H(N)0, H(N)1 bis H(N)7. Für SHA-384 ist dies die Verkettung von H(N)0, H(N)1 bis H(N)5.