TupleHash
NIST SP 800-185 https://csrc.nist.gov/pubs/sp/800/185/final
Keccak系
cSHAKEを利用した可変長出力ハッシュ関数。
ハッシュ関数は1つのデータ(ストリーム?)からハッシュ値を出力するが、TupleHashは複数のデータのセットからハッシュ値を計算する想定のもの。
出力長を指定する(ハッシュ用入力データとして含む) TupleHash128 / TupleHash256 と出力長を指定しない(含まない) XOF版 TupleHashXOF128 / TupleHashXOF256 がある。
TupleHash128
TupleHash256
TupleHashXOF128
TupleHashXOF256
updateとデータ区切りを別にするか、update1回で1つ分にするか
TupleHash
1.概要
TupleHash は、可変長出力を持つ SHA-3 由来のハッシュ関数であり、入力文字列のタプル(一部またはすべてが空文字列である可能性あり)を、一義的にハッシュするように設計されています。このようなタプルは、0 を含む任意の数の文字列で構成でき、このドキュメントでは (“a”, “b”, “c”,...,“z”) のように括弧で囲まれた文字列または変数のシーケンスとして表されます。TupleHash は、ハッシュ用の文字列シーケンスを結合するための、汎用的で誤用されにくい方法を提供するように設計されています。例えば、タプル ("abc", "d") に対して計算された TupleHash は、タプル ("ab", "cd") に対して計算された TupleHash とは異なるハッシュ値を生成します。ただし、残りのすべての入力パラメータは同じであり、結果として得られる 2 つの連結文字列は、文字列エンコードなしでは同一です。 TupleHashは128ビットと256ビットの2つのセキュリティ強度をサポートしています。関数への入力(要求された出力長を含む)を変更すると、最終的な出力はほぼ確実に変更されます。
2.パラメータ
TupleHash は以下のパラメータを取ります。
X は 0 個以上のビット文字列のタプルで、一部またはすべてが空文字列であっても構いません。
L は、要求された出力長をビット単位で表す整数です。
S は、任意の長さ(0 を含む)のオプションのカスタマイズビット文字列です。カスタマイズが不要な場合は、S は空文字列に設定されます。
3 定義
TupleHash は、入力文字列のシーケンスを明確な方法でエンコードし、文字列の末尾に要求された出力長をエンコードして、その結果を関数名 (N)「TupleHash」= 00101010 10101110 00001110 00110110
10100110 00010010 10000110 11001110 00010110 と、オプションのカスタマイズ文字列 S とともに cSHAKE に渡します。
X が n ビット文字列のタプルである場合、Xi を 0 から始まる i 番目のビット文字列とします。TupleHash 関数は、擬似コードで次のように定義されます。
code:TupleHash128(X, L, S):
Validity Conditions: 0 ≤ L < 22040 and len(S) < 22040
1. z = "".
2. n = the number of input strings in the tuple X.
3. for i = 1 to n:
z = z || encode_string(Xi).
4. newX = z || right_encode(L).
5. return cSHAKE128(newX, L, “TupleHash”, S).
code:TupleHash256(X, L, S):
Validity Conditions: 0 ≤ L < 22040 and len(S) < 22040
1. z = "".
2. n = the number of input strings in the tuple X.
3. for i = 1 to n:
z = z || encode_string(Xi).
4. newX = z || right_encode(L).
5. return cSHAKE256(newX, L, “TupleHash”, S).
3.1 任意長出力のTupleHash
TupleHashの適用例の中には、出力が生成され始めるまで、必要な出力ビット数がわからないものがあります。このような適用例では、TupleHashをXOF(つまり、出力を任意の長さに拡張できる)として使用することもできます。これはcSHAKEの動作を模倣します。
XOFとして使用する場合、TupleHashは、以下のTupleHashXOF128(X, L, S)およびTupleHashXOF256(X, L, S)疑似コードのステップ1のright_encode(0)に示すように、エンコードされた出力長を0に設定して計算されます。概念的には、XOFモードのTupleHashは無限長の出力文字列を生成し、呼び出し元は出力文字列の必要なビット数だけを使用します。 XOFモードのTupleHashの切り捨て出力は、次の擬似コードで示される関数TupleHashXOF128(X, L, S)またはTupleHashXOF256(X, L, S)によって計算できます。
code:TupleHashXOF128(X, L, S):
Validity Conditions: 0 ≤ L and len(S) < 22040
1. z = "".
2. n = the number of input strings in the tuple X.
3. for i = 1 to n:
z = z || encode_string(Xi).
4. newX = z || right_encode(0).
5. return cSHAKE128(newX, L, “TupleHash”, S).
code:TupleHashXOF256(X, L, S):
Validity Conditions: 0 ≤ L and len(S) < 22040
1. z = "".
2. n = the number of input strings in the tuple X.
3. for i = 1 to n:
z = z || encode_string(Xi).
4. newX = z || right_encode(0).
5. return cSHAKE256(newX, L, “TupleHash”, S)
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/TupleHash.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/TupleHash128.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/TupleHash256.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/TupleHashXOF128.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/TupleHashXOF256.java