ParallelHash
NIST SP 800-185 https://csrc.nist.gov/pubs/sp/800/185/final
ParallelHash128
ParallelHash256
データを複数ブロックに分割し、個別にSHAKEハッシュをとる。
結果をまとめて再度cSHAKEハッシュをとるかたち。
XOF版のParallelHashXOFもある
ParallelHashXOF128
ParallelHashXOF256
1 概要
ParallelHash の目的は、最新のプロセッサで利用可能な並列処理を活用して、非常に長い文字列の効率的なハッシュ化をサポートすることです。ParallelHash は 128 ビットおよび 256 ビットのセキュリティ強度をサポートし、可変長の出力も提供します。ParallelHash への入力パラメータを変更すると、たとえ要求された出力長であっても、無関係な出力が生成されます。このドキュメントで定義されている他の関数と同様に、ParallelHash はユーザーが選択したカスタマイズ文字列もサポートします。
2 パラメータ
ParallelHash は以下のパラメータを取ります。
X はメインの入力ビット文字列です。任意の長さ(0 を含む)を指定できます。
B は並列ハッシュのブロックサイズ(バイト単位)です。0 < B < 22040 となる任意の整数を指定できます。
L は要求された出力長をビット単位で表す整数です。
S は任意の長さ(0 を含む)のオプションのカスタマイズビット文字列です。カスタマイズが不要な場合は、S は空文字列に設定されます。
3 定義
ParallelHashは、入力ビット文字列Xを、それぞれ長さBバイトの連続した重複のないブロックの列に分割し、各ブロックのハッシュ値を個別に計算します。
最後に、これらのハッシュ値は結合され、関数名("ParallelHash"のN = 00001010 10000110 01001110 10000110 00110110
00110110 10100110 00110110 00010010 10000110 11001110 00010110、オプションのカスタマイズ文字列S、およびエンコードされた整数値(以下の擬似コードを参照)とともにcSHAKEに渡され、関数の最終的なハッシュ値を生成します。
ParallelHash関数は擬似コードで次のように定義されます。
code:ParallelHash128(X, B, L, S):
Validity Conditions: 0 < B < 22040 and ⌈ len(X)/B ⌉ < 22040 and
0 ≤ L < 22040 and len(S) < 22040
1. n = ⌈ (len(X)/8) / B ⌉
2. z = left_encode(B).
3. for i = 0 to n−1:
z = z || cSHAKE128(substring(X, i*B*8, (i+1)*B*8), 256, "", "").
4. z = z || right_encode(n) || right_encode(L).
5. newX = z.
6. return cSHAKE128(newX, L, “ParallelHash”, S).
code:ParallelHash256(X, B, L, S):
Validity Conditions: 0 < B < 22040 and ⌈ len(X)/B ⌉ < 22040 and
0 ≤ L < 22040 and len(S) < 22040
1. n = ⌈ (len(X)/8) / B ⌉.
2. z = left_encode(B).
3. for i = 0 to n−1:
z = z || cSHAKE256(substring(X, i*B*8, (i+1)*B*8), 512, "", "").
4. z = z || right_encode(n) || right_encode(L).
5. newX = z.
6. return cSHAKE256(newX, L, “ParallelHash”, S).
3.1 任意長出力のParallelHash
ParallelHashのアプリケーションによっては、出力が生成され始めるまで、必要な出力ビット数がわからない場合があります。このようなアプリケーションでは、ParallelHashをXOF(つまり、出力を任意の長さに拡張できる)として使用することもできます。これはcSHAKEの動作を模倣します。
XOFとして使用する場合、ParallelHashは、以下のParallelHashXOF128(X, B, L, S)およびParallelHashXOF256(X, B, L, S)疑似コードのステップ1のright_encode(0)に示すように、エンコードされた出力長を0に設定して計算されます。概念的には、XOFモードのParallelHashは無限長の出力文字列を生成し、呼び出し元は出力文字列の必要なビット数を使用するだけです。 XOFモードのParallelHashの切り捨て出力は、次の疑似コードで示される関数ParallelHashXOF128(X, B, L, S)またはParallelHashXOF256(X, B, L, S)によって計算できます。
code:ParallelHashXOF128(X, B, L, S):
Validity Conditions: 0 < B < 22040 and ⌈ len(X)/B ⌉ < 22040 and
0 ≤ L and len(S) < 22040
1. n = ⌈ (len(X)/8) / B ⌉.
2. z = left_encode(B).
3. for i = 0 to n−1:
z = z || cSHAKE128(substring(X, i*B*8, (i+1)*B*8), 256, "", "").
4. z = z || right_encode(n) || right_encode(0).
5. newX = z.
6. return cSHAKE128(newX, L, “ParallelHash”, S).
code:ParallelHashXOF256(X, B, L, S):
Validity Conditions: 0 < B < 22040 and ⌈ len(X)/B ⌉ < 22040 and
0 ≤ L and len(S) < 22040
1. n = ⌈ (len(X)/8) / B ⌉.
2. z = left_encode(B).
3. for i = 0 to n−1:
z = z || cSHAKE256(substring(X, i*B*8, (i+1)*B*8), 512, "", "").
4. z = z || right_encode(n) || right_encode(0).
5. newX = z.
6. return cSHAKE256(newX, L, “ParallelHash”, S).
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/ParallelHash.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/ParallelHash128.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/ParallelHash256.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/ParallelHashXOF128.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/ParallelHashXOF256.java