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のスポンジ構造を使う。
Keccakではいくつかサイズがあるが、SHA-3, SHAKEでは内部1600bit固定
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はビット
出力長dはビット単位で指定可能 下位ビット優先
ブロック長など
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でSHAKE256が使われる
こんな感じにしてみる
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/digest/Keccak.java
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
OBJECT IDENTIFIERの割当
table:あるごりずむ
OBJECTIDENTIFIER RFC
shake128 2.16.840.1.101.3.4.2.11 8692,8702
shake256 2.16.840.1.101.3.4.2.12 8692,8702
shake128-len 2.16.840.1.101.3.4.2.17 RFCには無い
shake256-len 2.16.840.1.101.3.4.2.18 RFCには無い
len付きはRFCのdraftに存在していたが削除されている
NIST
https://csrc.nist.gov/Projects/Computer-Security-Objects-Register/Algorithm-Registration
IANA
https://www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xhtml
NIST FIPS , RFC 8702
code:id-shake
id-shake128 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2)
country(16) us(840) organization(1) gov(101) csor(3)
nistAlgorithm(4) 2 11 }
id-shake256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2)
country(16) us(840) organization(1) gov(101) csor(3)
nistAlgorithm(4) 2 12 }
RFC 8692 8702 CMS RSASSA-PSS でMGFとして利用可能
code:id-RSASSA-PSS
id-RSASSA-PSS-SHAKE128 OBJECT IDENTIFIER ::= { iso(1)
identified-organization(3) dod(6) internet(1)
security(5) mechanisms(5) pkix(7) algorithms(6) 30 }
id-RSASSA-PSS-SHAKE256 OBJECT IDENTIFIER ::= { iso(1)
identified-organization(3) dod(6) internet(1)
security(5) mechanisms(5) pkix(7) algorithms(6) 31 }
パラメータではなくRSASSA-PSSのOIDとして振られている (MGF用OIDがないから?)
他のハッシュはバラメータで指定する
RFC 8692 8702 ECDSAとの組み合わせ
code:id-ecdsa
id-ecdsa-with-shake128 OBJECT IDENTIFIER ::= { iso(1)
identified-organization(3) dod(6) internet(1)
security(5) mechanisms(5) pkix(7) algorithms(6) 32 }
id-ecdsa-with-shake256 OBJECT IDENTIFIER ::= { iso(1)
identified-organization(3) dod(6) internet(1)
security(5) mechanisms(5) pkix(7) algorithms(6) 33 }
RFC 9380
Hashing to Elliptic Curves
https://tex2e.github.io/rfc-translater/html/rfc9380.html
FIPS PUB 202
1 はじめに
本規格は、FIPS 180-4 で規定されているSHA-1およびSHA-2ハッシュ関数ファミリを補完する新しい関数ファミリを規定する。SHA-3(Secure Hash Algorithm-3)と呼ばれるこのファミリは、NISTが公開SHA-3暗号ハッシュアルゴリズムコンペティション 3 で優勝したアルゴリズム1であるKECCAKに基づいている。SHA-3ファミリは、4つの暗号ハッシュ関数と2つの拡張可能出力関数から構成される。これら6つの関数は、4 で説明されている構造、すなわちスポンジ構造を共有しており、この構造を持つ関数はスポンジ関数と呼ばれる。
ハッシュ関数は、出力の長さが固定されたバイナリデータ(すなわちビット列)に対する関数である。ハッシュ関数への入力はメッセージと呼ばれ、出力は(メッセージ)ダイジェストまたはハッシュ値と呼ばれる。ダイジェストは、多くの場合、メッセージの凝縮表現として機能する。 SHA-3 ハッシュ関数は 4 つあり、それぞれ SHA3-224、SHA3-256、SHA3-384、SHA3-512 と名付けられています。それぞれ、ダッシュの後の接尾辞はダイジェストの固定長を示します。たとえば、SHA3-256 は 256 ビットのダイジェストを生成します。SHA-2 ハッシュ関数 (SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256) は、同じダイジェスト長のセットを提供します。したがって、SHA-3 ハッシュ関数は SHA-2 関数の代替として実装でき、その逆も可能です。
拡張可能出力関数 (XOF) は、ビット文字列 (メッセージとも呼ばれる) に対する関数で、出力を任意の長さに拡張できます。 2つのSHA-3 XOFは、SHAKE128とSHAKE256と名付けられています。3 接尾辞「128」と「256」は、これら2つの関数が一般的にサポートできるセキュリティ強度4を示します。これは、ハッシュ関数の接尾辞がダイジェスト長を示すのとは対照的です。SHAKE128とSHAKE256は、NISTが標準化した最初のXOFです。
6つのSHA-3関数は、衝突攻撃、原像攻撃、第二原像攻撃への耐性など、特殊な特性を提供するように設計されています。これら3種類の攻撃に対する耐性レベルは、セクションA.1にまとめられています。暗号ハッシュ関数は、デジタル署名の生成と検証、鍵導出、疑似乱数ビット生成など、さまざまな情報セキュリティアプリケーションの基本的な構成要素です。
FIPS承認ハッシュ関数のダイジェスト長は、160、224、256、384、および512ビットです。アプリケーションが非標準のダイジェスト長を持つ暗号ハッシュ関数を必要とする場合、ハッシュ関数の複数回の呼び出しや出力ビットの切り捨てを伴う構成に代わる自然な代替手段としてXOFが挙げられます。ただし、XOFはセクションA.2で説明されている追加のセキュリティ上の考慮事項の対象となります。
6つのSHA-3関数はそれぞれ、スポンジ構造の主要構成要素と同じ基礎的な順列を採用しています。実質的に、SHA-3関数は順列の動作モードです。本標準では、順列はKECCAK-pと呼ばれる順列ファミリのインスタンスとして規定されており、将来の文書で追加モードが開発される際に、そのサイズとセキュリティパラメータを変更できる柔軟性を提供しています。
4つのSHA-3ハッシュ関数は、SHA-3コンペティション3で提案されたKECCAKのインスタンスとは若干異なります。特に、SHA-3ハッシュ関数をSHA-3 XOFと区別し、個々のアプリケーションドメイン専用のSHA-3関数の新しいバリアントの開発を容易にするために、メッセージに2ビットのサフィックスが付加されています。
2つのSHA-3 XOFも、専用のバリアントの開発を可能にする方法で規定されています。さらに、SHA-3 XOFは、別の文書で規定される予定のXOFの並列化可能な変種の開発をサポートするために、木構造ハッシュ7用のSakura符号化方式6と互換性があります。
この標準の表記法と用語のほとんどは、8のKECCAKの仕様と一致しています。