6. Computing the Message Digest (メッセージダイジェストの計算)
各セキュアハッシュ関数をNブロックのメッセージに適用した後の出力は、ハッシュ量H(N)です。SHA-224とSHA-256の場合、H(i)は8個の32ビットワード、H(i)0, H(i)1, ... H(i)7と考えることができます。SHA-384とSHA-512の場合、8個の64ビットワード、H(i)0, H(i)1, ..., H(i)7と考えることができます。
以下で説明するように、ハッシュワードは初期化され、各メッセージブロックが処理されると変更され、最後のブロックを処理した後に連結されて出力が生成されます。SHA-256とSHA-512では、すべてのH(N)変数が連結されますが、SHA-224とSHA-384のハッシュは、最終的な連結からいくつかを省略することによって生成されます。
6.1. SHA-224とSHA-256の初期化 (SHA-224 and SHA-256 Initialization)
SHA-224の場合、初期ハッシュ値H(0)は次の32ビットワードで構成されます(16進数):
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
SHA-256の場合、初期ハッシュ値H(0)は次の8個の32ビットワードで構成されます(16進数)。これらのワードは、最初の8個の素数の平方根の小数部分の最初の32ビットを取ることによって得られました。
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とSHA-256の処理 (SHA-224 and SHA-256 Processing)
SHA-224とSHA-256は、メッセージブロックに対して同一の処理を実行し、H(0)の初期化方法と最終出力の生成方法でのみ異なります。これらは、0 <= L < 2^64のLビットの長さを持つメッセージMをハッシュするために使用できます。このアルゴリズムは、(1) 64個の32ビットワードのメッセージスケジュール、(2) それぞれ32ビットの8個の作業変数、(3) 8個の32ビットワードのハッシュ値を使用します。
メッセージスケジュールのワードはW0, W1, ..., W63とラベル付けされます。8個の作業変数は a, b, c, d, e, f, g, h とラベル付けされます。ハッシュ値のワードは H(i)0, H(i)1, ..., H(i)7 とラベル付けされ、初期ハッシュ値H(0)を保持し、各連続する中間ハッシュ値(各メッセージブロックが処理された後)H(i)によって置き換えられ、すべてのNブロックが処理された後に最終ハッシュ値H(N)で終了します。また、2つの一時的なワードT1とT2も使用します。
入力メッセージは上記の第4.1節で説明したようにパディングされ、その後、16個の32ビットワード M(i)0, M(i)1, ..., M(i)15 で構成されると考えられる512ビットブロックに解析されます。次に、N個のメッセージブロックのそれぞれに対して以下の計算が実行されます。すべての加算は2^32を法として実行されます。
i = 1からNまで
- メッセージスケジュールWを準備 (Prepare the message schedule W):
t = 0から15まで
Wt = M(i)t
t = 16から63まで
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
- 作業変数を初期化 (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
- 主要なハッシュ計算を実行 (Perform the main hash computation):
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
- 中間ハッシュ値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
メッセージ内のすべてのブロックに対して上記の計算が順次実行された後、最終出力が計算されます。SHA-256の場合、これはすべてのH(N)0, H(N)1からH(N)7までの連結です。SHA-224の場合、これはH(N)0, H(N)1からH(N)6までの連結です。
6.3. SHA-384とSHA-512の初期化 (SHA-384 and SHA-512 Initialization)
SHA-384の場合、初期ハッシュ値H(0)は次の8個の64ビットワードで構成されます(16進数)。これらのワードは、9番目から16番目の素数の平方根の小数部分の最初の64ビットを取ることによって得られました。
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
SHA-512の場合、初期ハッシュ値H(0)は次の8個の64ビットワードで構成されます(16進数)。これらのワードは、最初の8個の素数の平方根の小数部分の最初の64ビットを取ることによって得られました。
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とSHA-512の処理 (SHA-384 and SHA-512 Processing)
SHA-384とSHA-512は、メッセージブロックに対して同一の処理を実行し、H(0)の初期化方法と最終出力の生成方法でのみ異なります。これらは、0 <= L < 2^128のLビットの長さを持つメッセージMをハッシュするために使用できます。このアルゴリズムは、(1) 80個の64ビットワードのメッセージスケジュール、(2) それぞれ64ビットの8個の作業変数、(3) 8個の64ビットワードのハッシュ値を使用します。
メッセージスケジュールのワードはW0, W1, ..., W79とラベル付けされます。8個の作業変数は a, b, c, d, e, f, g, h とラベル付けされます。ハッシュ値のワードは H(i)0, H(i)1, ..., H(i)7 とラベル付けされ、初期ハッシュ値H(0)を保持し、各連続する中間ハッシュ値(各メッセージブロックが処理された後)H(i)によって置き換えられ、すべてのNブロックが処理された後に最終ハッシュ値H(N)で終了します。
入力メッセージは上記の第4.2節で説明したようにパディングされ、その後、16個の64ビットワード M(i)0, M(i)1, ..., M(i)15 で構成されると考えられる1024ビットブロックに解析されます。次に、N個のメッセージブロックのそれぞれに対して以下の計算が実行されます。すべての加算は2^64を法として実行されます。
i = 1からNまで
- メッセージスケジュールWを準備 (Prepare the message schedule W):
t = 0から15まで
Wt = M(i)t
t = 16から79まで
Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(W(t-15)) + W(t-16)
- 作業変数を初期化 (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
- 主要なハッシュ計算を実行 (Perform the main hash computation):
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
- 中間ハッシュ値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
メッセージ内のすべてのブロックに対して上記の計算が順次実行された後、最終出力が計算されます。SHA-512の場合、これはすべてのH(N)0, H(N)1からH(N)7までの連結です。SHA-384の場合、これはH(N)0, H(N)1からH(N)5までの連結です。