6. Computing the Message Digest (Calcul du condensé de message)
La sortie de chacune des fonctions de hachage sécurisées, après avoir été appliquée à un message de N blocs, est la quantité de hachage H(N). Pour SHA-224 et SHA-256, H(i) peut être considéré comme huit mots de 32 bits, H(i)0, H(i)1, ... H(i)7. Pour SHA-384 et SHA-512, il peut être considéré comme huit mots de 64 bits, H(i)0, H(i)1, ..., H(i)7.
Comme décrit ci-dessous, les mots de hachage sont initialisés, modifiés au fur et à mesure que chaque bloc de message est traité, et finalement concaténés après le traitement du dernier bloc pour produire la sortie. Pour SHA-256 et SHA-512, toutes les variables H(N) sont concaténées, tandis que les hachages SHA-224 et SHA-384 sont produits en omettant certains de la concaténation finale.
6.1. Initialisation de SHA-224 et SHA-256 (SHA-224 and SHA-256 Initialization)
Pour SHA-224, la valeur de hachage initiale, H(0), se compose des mots de 32 bits suivants en hexadécimal :
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
Pour SHA-256, la valeur de hachage initiale, H(0), se compose des huit mots de 32 bits suivants, en hexadécimal. Ces mots ont été obtenus en prenant les 32 premiers bits des parties fractionnaires des racines carrées des huit premiers nombres premiers.
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. Traitement de SHA-224 et SHA-256 (SHA-224 and SHA-256 Processing)
SHA-224 et SHA-256 effectuent un traitement identique sur les blocs de message et ne diffèrent que dans la manière dont H(0) est initialisé et dont ils produisent leur sortie finale. Ils peuvent être utilisés pour hacher un message, M, ayant une longueur de L bits, où 0 <= L < 2^64. L'algorithme utilise (1) un ordonnancement de message de soixante-quatre mots de 32 bits, (2) huit variables de travail de 32 bits chacune, et (3) une valeur de hachage de huit mots de 32 bits.
Les mots de l'ordonnancement de message sont étiquetés W0, W1, ..., W63. Les huit variables de travail sont étiquetées a, b, c, d, e, f, g et h. Les mots de la valeur de hachage sont étiquetés H(i)0, H(i)1, ..., H(i)7, qui contiendront la valeur de hachage initiale, H(0), remplacée par chaque valeur de hachage intermédiaire successive (après le traitement de chaque bloc de message), H(i), et se terminant par la valeur de hachage finale, H(N), après le traitement de tous les N blocs. Ils utilisent également deux mots temporaires, T1 et T2.
Le message d'entrée est complété comme décrit dans la section 4.1 ci-dessus, puis analysé en blocs de 512 bits qui sont considérés comme étant composés de seize mots de 32 bits M(i)0, M(i)1, ..., M(i)15. Les calculs suivants sont ensuite effectués pour chacun des N blocs de message. Toute addition est effectuée modulo 2^32.
Pour i = 1 à N
- Préparer l'ordonnancement de message W (Prepare the message schedule W) :
Pour t = 0 à 15
Wt = M(i)t
Pour t = 16 à 63
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
- Initialiser les variables de travail (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
- Effectuer le calcul de hachage principal (Perform the main hash computation) :
Pour t = 0 à 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
- Calculer la valeur de hachage intermédiaire 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
Après que les calculs ci-dessus ont été effectués séquentiellement pour tous les blocs du message, la sortie finale est calculée. Pour SHA-256, il s'agit de la concaténation de tous les H(N)0, H(N)1, jusqu'à H(N)7. Pour SHA-224, il s'agit de la concaténation de H(N)0, H(N)1, jusqu'à H(N)6.
6.3. Initialisation de SHA-384 et SHA-512 (SHA-384 and SHA-512 Initialization)
Pour SHA-384, la valeur de hachage initiale, H(0), se compose des huit mots de 64 bits suivants, en hexadécimal. Ces mots ont été obtenus en prenant les 64 premiers bits des parties fractionnaires des racines carrées du neuvième au seizième nombre premier.
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
Pour SHA-512, la valeur de hachage initiale, H(0), se compose des huit mots de 64 bits suivants, en hexadécimal. Ces mots ont été obtenus en prenant les 64 premiers bits des parties fractionnaires des racines carrées des huit premiers nombres premiers.
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. Traitement de SHA-384 et SHA-512 (SHA-384 and SHA-512 Processing)
SHA-384 et SHA-512 effectuent un traitement identique sur les blocs de message et ne diffèrent que dans la manière dont H(0) est initialisé et dont ils produisent leur sortie finale. Ils peuvent être utilisés pour hacher un message, M, ayant une longueur de L bits, où 0 <= L < 2^128. L'algorithme utilise (1) un ordonnancement de message de quatre-vingts mots de 64 bits, (2) huit variables de travail de 64 bits chacune, et (3) une valeur de hachage de huit mots de 64 bits.
Les mots de l'ordonnancement de message sont étiquetés W0, W1, ..., W79. Les huit variables de travail sont étiquetées a, b, c, d, e, f, g et h. Les mots de la valeur de hachage sont étiquetés H(i)0, H(i)1, ..., H(i)7, qui contiendront la valeur de hachage initiale, H(0), remplacée par chaque valeur de hachage intermédiaire successive (après le traitement de chaque bloc de message), H(i), et se terminant par la valeur de hachage finale, H(N) après le traitement de tous les N blocs.
Le message d'entrée est complété comme décrit dans la section 4.2 ci-dessus, puis analysé en blocs de 1024 bits qui sont considérés comme étant composés de seize mots de 64 bits M(i)0, M(i)1, ..., M(i)15. Les calculs suivants sont ensuite effectués pour chacun des N blocs de message. Toute addition est effectuée modulo 2^64.
Pour i = 1 à N
- Préparer l'ordonnancement de message W (Prepare the message schedule W) :
Pour t = 0 à 15
Wt = M(i)t
Pour t = 16 à 79
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
- Initialiser les variables de travail (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
- Effectuer le calcul de hachage principal (Perform the main hash computation) :
Pour t = 0 à 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
- Calculer la valeur de hachage intermédiaire 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
Après que les calculs ci-dessus ont été effectués séquentiellement pour tous les blocs du message, la sortie finale est calculée. Pour SHA-512, il s'agit de la concaténation de tous les H(N)0, H(N)1, jusqu'à H(N)7. Pour SHA-384, il s'agit de la concaténation de H(N)0, H(N)1, jusqu'à H(N)5.