SHA-3とKeccakの全体像:スポンジ構造・パラメータ解説とSHA-2との使い分け
SHA-3 とは — 概要
SHA-3(Secure Hash Algorithm 3)は、ハッシュ関数ファミリのひとつで、NIST(米国標準技術研究所)が主催した公開競技(SHA-3 コンペティション)の結果として採用されたアルゴリズム群です。最終選定アルゴリズムは「Keccak(ケチャック)」と呼ばれる設計に基づき、FIPS 202 として標準化されました。SHA-3 は SHA-2 系列とは内部構造が大きく異なり、スポンジ構造(sponge construction)と呼ばれる新たなパラダイムを採用しているのが特徴です。
背景 — なぜ SHA-3 が必要だったか
従来の SHA-1 は衝突攻撃(collision)が実用的になったことにより事実上廃止され、SHA-2(SHA-224/256/384/512)は現在でも安全とみなされています。しかし、暗号学コミュニティはもしものための代替(保険)を求めており、その結果として NIST は 2007 年に SHA-3 コンペティションを開催しました。目的は、SHA-2 と設計的に異なる新しいハッシュ構造を選定することでした(万一 SHA-2 に未知の深刻な弱点が発見された際のフェールセーフとして)。
Keccak とスポンジ構造の基本
Keccak の中心は「スポンジ関数」と呼ばれる概念です。スポンジ関数は大きな内部状態(state)を持ち、吸収(absorb)と絞り出し(squeeze)の2段階で動作します。入力メッセージはブロック単位で状態に XOR され(吸収)、その都度内部の置換(permutation)関数 f が適用されます。メッセージを全て吸収した後、状態から出力ブロックを取り出し(絞り出し)、必要に応じてさらに f を適用して追加出力を得ます。
- 内部状態サイズ:Keccak-f[1600] では状態は 1600 ビット。
- ラウンド数:Keccak-f[1600] は 24 ラウンドの置換関数。
- 置換のステップ:theta, rho, pi, chi, iota の5つから構成される。
パラメータ:レート(r)とキャパシティ(c)
スポンジ関数は内部状態を r(rate)と c(capacity)の和として扱います(r + c = 状態サイズ)。r は一度に吸収・出力できるビット数で、c はセキュリティに直接影響する量です。一般にセキュリティ強度 s ビットを得るためには c = 2s に設定されます。
代表的な SHA-3 のパラメータは次の通りです(状態サイズ 1600):
- SHA3-256: c = 512, r = 1088 → 出力長 256 ビット(衝突耐性 2^128、原像耐性 2^256)
- SHA3-224: c = 448, r = 1152
- SHA3-384: c = 768, r = 832
- SHA3-512: c = 1024, r = 576
出力可変関数(XOF)と派生関数群
SHA-3 標準には固定長の SHA3-224/256/384/512 のほか、XOF(eXtendable-Output Function)である SHAKE128/256 も定義されています。SHAKE は任意長の出力を生成でき、KDF(鍵導出関数)やストリーム生成などに有用です。また NIST SP 800-185 では cSHAKE(カスタム名付け可能な XOF)、KMAC(Keccak ベースの MAC)、TupleHash など Keccak 派生アルゴリズムを規定しています。
パディングとドメイン分離
スポンジ関数ではパディングが重要です。Keccak 系では一般に「multirate padding(pad10*1)」が使われます。さらに NIST の SHA-3 規格では目的別にドメイン分離のためのサフィックスビット(例えば SHA3 系では 0x06、SHAKE 系では 0x1F 等)を入れる規約が設けられています。これにより同じ内部関数を使っても用途ごとに出力を衝突しにくくできます(ドメイン分離)。
安全性(既知の攻撃と現状)
Keccak / SHA-3 については、提案以降さまざまな暗号解析が行われています。現行の FIPS 202 に定めるフルラウンド(Keccak-f[1600] の 24 ラウンド)に対して、実用的なプレイグラウンド攻撃や衝突・原像攻撃が見つかっているという報告はありません。ただし、ラウンド数を減らした簡略版に対する理論的攻撃や統計的な解析は数多く報告されており、これらは設計の健全性を確認する上で有益です。
また、スポンジ構造は従来の Merkle–Damgård 構造と異なり、長さ拡張攻撃(length-extension attack)に耐性があります。これは多くの用途で有利な特性ですが、同時に従来の HMAC 設計との互換性を考慮する必要がある点でもあります。
利用上の注意点と実装上のポイント
- パラメータ選択:用途に応じた出力長とセキュリティ強度(例:256 ビット出力が欲しいなら SHA3-256)を選ぶ。
- ハードウェア/ソフトウェア性能:Keccak は並列化やハードウェア実装に非常に適している一方で、汎用 CPU 上での最適化は SHA-2 と比べて少し異なるトレードオフがあります。近年はライブラリの最適化により実用的な速度が得られます。
- サイドチャネル対策:差分電力解析(DPA)やタイミング攻撃に対する対策は実装レベルで必要です。特に組み込み機器やスマートカードなどでの実装は注意が必要です。
- 暗号プロトコルとの組み合わせ:HMAC の代替としては KMAC(NIST SP 800-185)など Keccak 系の専用構築が推奨される場合があります。SHAKE を HMAC のように直接使うのは設計上の注意が必要です。
SHA-2 と SHA-3 の関係・使い分け
NIST は SHA-3 を「SHA-2 の単純な置き換え」として位置づけてはいません。SHA-2 は現在も安全であり、広く使われています。SHA-3 は設計が根本的に異なるため、SHA-2 に未知の弱点が生じた場合の代替手段という意味合いが大きいです。実運用では、既存のエコシステム(互換性や速度)や標準に基づいて SHA-2 を使い続けるケースが多く、用途に応じて SHA-3(または SHAKE、KMAC 等)を選択するのが現実的です。
実世界での採用状況
SHA-3 は標準化後、多くの暗号ライブラリ(OpenSSL、BoringSSL、LibreSSL、Cryptopp、libsodium 等)でサポートされ、ハードウェア実装も存在します。ただし、インターネットプロトコル(TLS など)や一般的なファイルハッシュのデファクトスタンダードとしては、依然として SHA-2 系が主流です。理由は互換性・既存ハードウェアの最適化・十分な安全性が確認されていることなどです。
まとめ
SHA-3 は Keccak に基づく新しいハッシュファミリで、スポンジ構造、Keccak-f[1600] の置換、XOF、KMAC など拡張機能を持つ点が特徴です。SHA-2 と設計が異なるため、安全性の多様化という重要な役割を担っています。現時点(FIPS 202 規格化以降)ではフルラウンド版に対する実用的な攻撃は報告されておらず、実装にあたってはパディング、ドメイン分離、サイドチャネル対策、用途に応じた関数選択(SHA3 vs SHAKE vs KMAC)に注意することが重要です。


