SHAKE
SHAKE128 / SHAKE256
Secure Hash Algorithm with Keccack (SHAKE)
FIPS PUB 202 https://doi.org/10.6028/NIST.FIPS.202
https://csrc.nist.gov/pubs/fips/202/final
シャケではないかも SHA-3 XOF とか呼ばれることもある。
SHA-3と同じKeccak系のアルゴリズムで出力長を可変サイズにしたもの。
SHA-2の後継としてはこちらが主流でSHA-3は互換性目的のようだ。
可変長なハッシュ関数? XOF, MGF
出力が1回のKeccak-fより長い場合は入力が空でくり返すKeccakのスポンジ構造を使う。
1600bitを攪拌し、入力も出力も1600 - 暗号強度bit ぐらいの長さを使う。
出力長に関わる値は入力値に含まれないため出力長を変えても基本的な出力は同じ。ハッシュ値がかぶった場合は隠れている部分が違ってくるので後の結果も変わるが、SHAのように出力長が違うと値も変わるものを想定したところでは使えない。
RawSHAKE にビットを付加したもの。付加することで同じ出力にならない。
SHAKE128(M,d) = RawSHAKE128(M || 11,d) = Keccak[256](M || 1111,d)
SHAKE256(M,d) = RawSHAKE256(M || 11,d) = Keccak[512](M || 1111,d)
Mはメッセージ(ビット単位) dは出力長 1はビット
ブロック長など
table:仕様?
名 ブロック長 デフォルト?ハッシュ長
SHAKE128 1600-128*2 1344 256
SHAKE256 1600-256*2 1088 512
ECDSAなどで使われるときのハッシュ長、HMACで使われるブロック長など SHA-3より長い
ラベルを付けたりできるcSHAKE128 / cSHAKE256もある
Keccak
RawSHAKE
SHAKE
SHA3
cSHAKE
KMAC
TupleHash
ParallelHash
ECDSAでハッシュ関数の代わりに使われたりするらしい
EdDSAではEd448で使われる
こんな感じにしてみる
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/SHAKE.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/SHAKE128.java
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/SHAKE256.java
RFC 8702 CMS RSASSA-PSS でMGFとして利用可能