KMAC
KECCAK 認証コード
KMACXOF128 出力サイズに関わらず内容が変化しない
KMACXOF256
RFC 8702 の謎仕様
KmacWithSHAKE128
KmacWithSHAKE256
訳がわからないので対応は控えた方がいいのかcSHAKE使え
出力サイズは128bit, 256bit でもいいが可変にもできる。
KMAC128, KMAC256 は出力サイズにあわせて全体の出力も変わる。
XOFがつくものは出力長が入力値に含まれないため出力長に関わらず内容が同じものを適度な長さに切っただけとなる NIST SP 800-108 KDFとして利用可能 SはKDFまたはKDF4X table:KMACと以前に標準化されたMACアルゴリズムと同等のセキュリティ設定
既存のMACアルゴリズム KMAC相当
AES-CMAC(K, text) KMAC128(K, text, 128, S)
HMAC-SHA256(K, text) KMAC256(K, text, 256, S)
HMAC-SHA512(K, text) KMAC256(K, text, 512, S)
K 鍵
X text 本文
L 出力長 bit
S カスタム文字 KDFの場合は "KDF" だったり "KDF4X" だったり
Java標準のMACを継承していないので注意
4 KMAC
4.1 概要
KECCAK メッセージ認証コード (KMAC) アルゴリズムは、KECCAK に基づく PRF および鍵付きハッシュ関数です。可変長出力を提供しますが、SHAKE や cSHAKE とは異なり、要求された出力長を変更すると、新しい無関係な出力が生成されます。KMAC には、それぞれ cSHAKE128 と cSHAKE256 から構築された KMAC128 と KMAC256 の 2 つのバリアント(亜種)があります。2 つのバリアントは、技術的なセキュリティ特性が多少異なります。ただし、ほとんどのアプリケーションでは、セクション 8.4.1 で説明されているように、十分に長いキーが使用されている限り、両方のバリアントで最大 256 ビットのセキュリティ強度をサポートできます。 4.2 Parameters
両方の KMAC 関数は、次のパラメータを取ります:
K は、ゼロを含む任意の長さの鍵 ビット文字列です。
X は、メインの入力ビット文字列です。ゼロを含む任意の長さにすることができます。
L は、要求された出力の長さを表す整数$ ^8です。
S は、ゼロを含む任意の長さのオプションのカスタマイズ ビット文字列です。カスタマイズが不要な場合は、S は空の文字列に設定されます。
$ ^8 セクション4.3.1で説明されているように、関数がXOFとして使用されていない限り、この関数からの出力には$ 2^{ 2040}−1ビットの制限があることに注意してください。
4.3 Definition
KMAC は、キー K のパディングされたバージョンを入力 X および要求された出力長 L のエンコードと連結します。結果は、要求された出力長 L、名前 N ="KMAC" = 11010010 10110010 10000010 11000010$ ^9、およびオプションのカスタマイズ文字列 S とともに cSHAKE に渡されます。
$ ^9このドキュメントでは、セクション 2 で指定されているように、バイナリ表現ではバイトは下位ビットから先に書き込まれることに注意してください。
KMAC128(K, X, L, S):
有効条件 Validity Coditions: $ len(K) < 2^{2040} and $ 0 <= L < 2^{2040} and $ len(S) < 2^{2040}
1. newX = bytepad(encode_string(K), 168) || X || right_sncoding(L).
2. T = bytepad(encode_string("KMAC") || encode_string(S), 168).
3. return $ K_{ECCAK}[256] (T || newX || 00, L).
または
1. newX = bytepad(encode_string(K), 168) || X || right_sncoding(L).
2. return cSHAKE128(newX, L, "KMAC", S).
KMAC256(K, X, L, S):
有効条件 Validity Coditions: $ len(K) < 2^{2040} and $ 0 <= L < 2^{2040} and $ len(S) < 2^{2040}
1. newX = bytepad(encode_string(K), 136) || X || right_sncoding(L).
2. T = bytepad(encode_string("KMAC") || encode_string(S), 136).
3. return $ K_{ECCAK}[512] (T || newX || 00, L).
または
1. newX = bytepad(encode_string(K), 136) || X || right_sncoding(L).
2. return cSHAKE256(newX, L, "KMAC", S).
4.3.1. 任意長出力の KMAC
KMAC の一部のアプリケーションでは、出力の生成が開始されるまで必要な出力ビット数がわからない場合があります。 これらのアプリケーションでは、KMAC を XOF として使用することもできます (つまり、出力を任意の長さに拡張できます)。これは cSHAKE の動作を模倣します。 XOF として使用される場合、KMACXOF128(K, X, L, S) および KMACXOF256(K, X, L, S) のステップ 1 の right_encode(0) に示すように、エンコードされた出力の長さを 0 に設定することによって KMAC が計算されます。 ) 以下の疑似コード。 概念的には、XOF モードの KMAC は無限長の出力文字列を生成し、呼び出し元は必要なだけ出力文字列のビットを使用するだけです。 XOF モードでの KMAC の切り捨てられた出力は、次の疑似コードで与えられる関数 KMACXOF128(K, X, L, S) または KMACXOF256(K, X, L, S) によって計算できます。 KMACXOF128(K, X, L, S):
有効条件 Validity Coditions: $ len(K) < 2^{2040} and $ 0 <= L and $ len(S) < 2^{2040}
1. newX = bytepad(encode_string(K), 168) || X || right_sncoding(0).
2. T = bytepad(encode_string("KMAC") || encode_string(S), 168).
3. return $ K_{ECCAK}[256] (T || newX || 00, L).
または
1. newX = bytepad(encode_string(K), 168) || X || right_sncoding(0).
2. return cSHAKE128(newX, L, "KMAC", S).
KMACXOF256(K, X, L, S):
有効条件 Validity Coditions: $ len(K) < 2^{2040} and $ 0 <= L and $ len(S) < 2^{2040}
1. newX = bytepad(encode_string(K), 136) || X || right_sncoding(0).
2. T = bytepad(encode_string("KMAC") || encode_string(S), 136).
3. return $ K_{ECCAK}[512] (T || newX || 00, L).
または
1. newX = bytepad(encode_string(K), 136) || X || right_sncoding(0).
2. return cSHAKE256(newX, L, "KMAC", S).