Passa al contenuto principale

6. Computing the Message Digest (Calcolo del digest del messaggio)

L'output di ciascuna delle funzioni hash sicure, dopo essere state applicate a un messaggio di N blocchi, è la quantità hash H(N). Per SHA-224 e SHA-256, H(i) può essere considerato come otto parole a 32 bit, H(i)0, H(i)1, ... H(i)7. Per SHA-384 e SHA-512, può essere considerato come otto parole a 64 bit, H(i)0, H(i)1, ..., H(i)7.

Come descritto di seguito, le parole hash vengono inizializzate, modificate man mano che ogni blocco di messaggio viene elaborato e infine concatenate dopo l'elaborazione dell'ultimo blocco per produrre l'output. Per SHA-256 e SHA-512, tutte le variabili H(N) vengono concatenate, mentre gli hash SHA-224 e SHA-384 vengono prodotti omettendone alcuni dalla concatenazione finale.

6.1. Inizializzazione di SHA-224 e SHA-256 (SHA-224 and SHA-256 Initialization)

Per SHA-224, il valore hash iniziale, H(0), è costituito dalle seguenti parole a 32 bit in esadecimale:

``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

Per SHA-256, il valore hash iniziale, H(0), è costituito dalle seguenti otto parole a 32 bit, in esadecimale. Queste parole sono state ottenute prendendo i primi 32 bit delle parti frazionarie delle radici quadrate dei primi otto numeri primi.

``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. Elaborazione di SHA-224 e SHA-256 (SHA-224 and SHA-256 Processing)

SHA-224 e SHA-256 eseguono un'elaborazione identica sui blocchi di messaggi e differiscono solo nel modo in cui H(0) viene inizializzato e nel modo in cui producono il loro output finale. Possono essere utilizzati per hash un messaggio, M, avente una lunghezza di L bit, dove 0 <= L < 2^64. L'algoritmo utilizza (1) una schedulazione di messaggi di sessantaquattro parole a 32 bit, (2) otto variabili di lavoro di 32 bit ciascuna, e (3) un valore hash di otto parole a 32 bit.

Le parole della schedulazione di messaggi sono etichettate W0, W1, ..., W63. Le otto variabili di lavoro sono etichettate a, b, c, d, e, f, g e h. Le parole del valore hash sono etichettate H(i)0, H(i)1, ..., H(i)7, che conterranno il valore hash iniziale, H(0), sostituito da ogni successivo valore hash intermedio (dopo che ogni blocco di messaggio è stato elaborato), H(i), e terminando con il valore hash finale, H(N), dopo che tutti gli N blocchi sono stati elaborati. Utilizzano anche due parole temporanee, T1 e T2.

Il messaggio di input viene riempito come descritto nella Sezione 4.1 sopra, quindi analizzato in blocchi di 512 bit che sono considerati composti da sedici parole a 32 bit M(i)0, M(i)1, ..., M(i)15. I seguenti calcoli vengono quindi eseguiti per ciascuno degli N blocchi di messaggio. Tutte le addizioni vengono eseguite modulo 2^32.

Per i = 1 a N

  1. Preparare la schedulazione di messaggi W (Prepare the message schedule W):
Per t = 0 a 15
Wt = M(i)t
Per t = 16 a 63
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
  1. Inizializzare le variabili di lavoro (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
  1. Eseguire il calcolo hash principale (Perform the main hash computation):
Per t = 0 a 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
  1. Calcolare il valore hash intermedio 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

Dopo che i calcoli sopra sono stati eseguiti in sequenza per tutti i blocchi nel messaggio, viene calcolato l'output finale. Per SHA-256, questa è la concatenazione di tutti H(N)0, H(N)1, fino a H(N)7. Per SHA-224, questa è la concatenazione di H(N)0, H(N)1, fino a H(N)6.

6.3. Inizializzazione di SHA-384 e SHA-512 (SHA-384 and SHA-512 Initialization)

Per SHA-384, il valore hash iniziale, H(0), è costituito dalle seguenti otto parole a 64 bit, in esadecimale. Queste parole sono state ottenute prendendo i primi 64 bit delle parti frazionarie delle radici quadrate dal nono al sedicesimo numero primo.

``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

Per SHA-512, il valore hash iniziale, H(0), è costituito dalle seguenti otto parole a 64 bit, in esadecimale. Queste parole sono state ottenute prendendo i primi 64 bit delle parti frazionarie delle radici quadrate dei primi otto numeri primi.

``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. Elaborazione di SHA-384 e SHA-512 (SHA-384 and SHA-512 Processing)

SHA-384 e SHA-512 eseguono un'elaborazione identica sui blocchi di messaggi e differiscono solo nel modo in cui H(0) viene inizializzato e nel modo in cui producono il loro output finale. Possono essere utilizzati per hash un messaggio, M, avente una lunghezza di L bit, dove 0 <= L < 2^128. L'algoritmo utilizza (1) una schedulazione di messaggi di ottanta parole a 64 bit, (2) otto variabili di lavoro di 64 bit ciascuna, e (3) un valore hash di otto parole a 64 bit.

Le parole della schedulazione di messaggi sono etichettate W0, W1, ..., W79. Le otto variabili di lavoro sono etichettate a, b, c, d, e, f, g e h. Le parole del valore hash sono etichettate H(i)0, H(i)1, ..., H(i)7, che conterranno il valore hash iniziale, H(0), sostituito da ogni successivo valore hash intermedio (dopo che ogni blocco di messaggio è stato elaborato), H(i), e terminando con il valore hash finale, H(N) dopo che tutti gli N blocchi sono stati elaborati.

Il messaggio di input viene riempito come descritto nella Sezione 4.2 sopra, quindi analizzato in blocchi di 1024 bit che sono considerati composti da sedici parole a 64 bit M(i)0, M(i)1, ..., M(i)15. I seguenti calcoli vengono quindi eseguiti per ciascuno degli N blocchi di messaggio. Tutte le addizioni vengono eseguite modulo 2^64.

Per i = 1 a N

  1. Preparare la schedulazione di messaggi W (Prepare the message schedule W):
Per t = 0 a 15
Wt = M(i)t
Per t = 16 a 79
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
  1. Inizializzare le variabili di lavoro (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
  1. Eseguire il calcolo hash principale (Perform the main hash computation):
Per t = 0 a 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
  1. Calcolare il valore hash intermedio 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

Dopo che i calcoli sopra sono stati eseguiti in sequenza per tutti i blocchi nel messaggio, viene calcolato l'output finale. Per SHA-512, questa è la concatenazione di tutti H(N)0, H(N)1, fino a H(N)7. Per SHA-384, questa è la concatenazione di H(N)0, H(N)1, fino a H(N)5.