Salsa20 暗号化
拡張ノンス変種対応の高速ストリーム暗号
クライアントサイドセキュリティ
Salsa20は参照テーブルなしのARXストリーム暗号で、本質的に恒常時間でキャッシュタイミング攻撃に免疫。同一鍵でのnonce再利用は絶対禁止。XSalsa20(192ビットnonce)でランダムnonce生成を安全に。
初期ブロックカウンター値(暗号化は通常0、復号化は同じ値を使用)
Salsa20について
Salsa20はDaniel J. Bernsteinが設計した ARXストリーム暗号で、2005年のeSTREAM競争に提出。4×4の32ビットワード行列(512ビット状態)を加算(mod 2³²)・ビット回転・XORのみで操作。Sボックスなし・テーブルルックアップなしで実行時間は鍵・データ値に無関係。64ビットストリームカウンタで鍵ストリームの任意位置にランダムアクセス可能。
Salsa20は2008年のeSTREAMポートフォリオProfile 1(ソフトウェア)に選出。Bernsteinが2011年にXSalsa20を定義:HSalsa20で192ビットnonceの前128ビット+元鍵から256ビット部分鍵を導出し、Salsa20/20に入力。これにより誕生日境界なしでランダム192ビットnonce生成が可能となりNaCl secretbox(XSalsa20-Poly1305)の基盤に。
アルゴリズム比較
| アルゴリズム | ラウンド | Nonce長 | 速度 | 最適用途 |
|---|---|---|---|---|
| Salsa20/20 | 20 | 64 bits (8 bytes) | 標準 | 厳格な連番nonce管理での長命セッション暗号化;高スループットデータ暗号化;eSTREAM認定デプロイ |
| Salsa20/12 | 12 | 64 bits (8 bytes) | 高速 | フル20ラウンドマージン不要の高性能ユースケース;Bernsteinの推奨バランス |
| Salsa20/8 | 8 | 64 bits (8 bytes) | 最速 | ストリーム暗号実装ベンチマーク;暗号研究・性能計測のみ |
| XSalsa20 | 20 | 192 bits (24 bytes) | 標準 | ランダムnonce生成アプリ;NaCl/libsodium secretbox互換;nonce同期困難なマルチパーティ鍵共有 |
Salsa20の仕組み
Salsa20は4×4の32ビットワード行列を初期化:“expand 32-byte k”をエンコードする4定数ワード、256ビット鍵から8×32ビットワード、64ビットストリームカウンタから2×32ビットワード、64ビットnonceから2×32ビットワード。
コアはクォーターラウンド(a,b,c,d):b⊕=(a+d)‹‹7; c⊕=(b+a)‹‹9; d⊕=(c+b)‹‹13; a⊕=(d+c)‹‹18。ダブルラウンド=列ラウンド+対角ラウンド。Salsa20/20は10ダブルラウンド(20ラウンド合計)。最終出力=20ラウンド変換状態と元入力状態のXOR。
64ビットカウンタが64バイトブロックごとに+1で2⁷²バイト鍵ストリーム/(鍵,nonce)。ストリームXORで暗号化・復号の同位置は同バイト。カウンタ設定で任意位置へシーク・並列処理が可能。
ラウンド変種
- Salsa20/20(20ラウンド、標準):最大セキュリティマージン、eSTREAM候補、既知全ラウンド攻撃なし。全セキュリティ重要アプリに推奨。
- Salsa20/12(12ラウンド):eSTREAM主力候補;Salsa20/20より約35%高速;12ラウンドへの既知攻撃なし;Bernsteinの性能・安全バランス推奨。
- Salsa20/8(8ラウンド):最速。8ラウンド識別子攻撃あり(Aumasson 2008, 2²⁴⁹)。セキュリティ要件がある新規デプロイには非推奨。ベンチマーク・研究専用。
主な特徴
- ARX設計:Sボックス・テーブルルックアップなし。32ビット加算・回転・XORのみ。実行時間は鍵・データ値に無関係でキャッシュタイミング攻撃に本質的に免疫。
- 大規模鍵ストリーム:64ビットカウンタで2⁶⁴ブロック×64バイト=2⁷²バイト/(鍵,nonce)。先行ブロック処理なしで任意位置にランダムアクセス可能。
- 64ビットnonce(Salsa20基本):厳格なnonce一意管理が必要。同鍵での2³²メッセージでnonce誕生日衝突確率が無視不可能に。長命/共有鍵ではXSalsa20(192ビット)を使用。
- XSalsa20(192ビットnonce、2011):HSalsa20で(鍵,nonce[0:128])から256ビット部分鍵を導出し、nonce[128:192]とともにSalsa20/20に入力。ランダムnonce生成が安全。NaCl secretbox標準。
- eSTREAMポートフォリオProfile 1(ソフトウェア、2008):独立パネルによる4年間の多年公開評価後に選出。12ラウンド・20ラウンド変体への既知攻撃なし。
セキュリティに関する注意事項
- nonce再利用は致命的:同一(鍵,nonce,カウンタ)で2文を暗号化すると平文XORが漏洩。グローバル一意nonce(カウンタベースまたはXSalsa20ランダムnonce)を強制。
- 短nonce誕生日境界:64ビットnonceでは同鍵の約2³²メッセージで衝突確率50%。XSalsa20(192ビット)に切り替えれば実務上不問。
- 短縮ラウンド攻撃:Salsa20/20・/12への攻撃なし。Salsa20/8は識別子攻撃あり。セキュリティ重要用途はSalsa20/20のみ。
- 認証なし:Salsa20は機密性のみ。改ざん不検出。XSalsa20-Poly1305またはChaCha20-Poly1305でAEADを。
実際の使用例
- NaCl secretbox (XSalsa20-Poly1305):NaClライブラリ元のAEAD原語。192ビットnonce+Poly1305認証。libsodiumで現在も広く利用。
- eSTREAMポートフォリオProfile 1(2008):ECRYPT主導の4年間の公開競争でSalsa20/12が主力ソフトウェア暗号に選出。
- ChaCha20への影響:BernsteinはSalsa20の変体として2008年にChaCha20を設計。行列配置とクォーターラウンド回転定数を変更し1ラウンドあたりの拡散を改善。全ChaCha20の安全特性はSalsa20 ARXフレームワーク由来。
- レガシー暗号システム:多くの初期libsodiumベースVPN・ファイル暗号化・メッセージアプリはRFC 7539(2015)/RFC 8439(2018)以前にXSalsa20-Poly1305を使用。後方互換として引き続きサポート。