ChaCha20 暗号化
認証オプション付きの最新ストリーム暗号
クライアントサイドセキュリティ
ChaCha20-Poly1305(RFC 8439)が推奨AEAD。平ChaCha20は認証なし—常にPoly1305と組み合わせること。96ビットIETF nonceでは厳格なnonce一意性を保証。XChaCha20-Poly1305(192ビットnonce)でランダムnonce生成が安全に。
初期カウンター値(デフォルト:0)
ChaCha20 について
ChaCha20はDaniel J. BernsteinがSalsa20の改良変体として2008年に設計したARXストリーム暗号。4×4行列(512ビット)は同じだがクォーターラウンドと状態初期化レイアウトを再設計。回転定数(16-12-8-7)によりビット拡散がSalsa20の4ラウンドに対し2ラウンドで全16ワードに伝播。IETF variant (RFC 8439): 96ビットnonce (3×32) + 32ビットカウンタ(最大256GB/nonce)。Bernstein原版: 64ビットnonce + 64ビットカウンタ。
ChaCha20-Poly1305 (RFC 7539→RFC 8439) はChaCha20+Poly1305のIETF標準AEAD。Poly1305用一回限りキーをカウンタ=0のChaCha20出力先頭32バイトから導出、カウンタ=1からChaCha20で本文暗号化。128ビット認証タグ。2014年Google ChromeとAndroidがモバイルTLSに採用(Langley+Borsini)。TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256として必須。
アルゴリズム比較
| アルゴリズム | 認証 | 鍵長 | ノンスサイズ | 適用シナリオ |
|---|---|---|---|---|
| ChaCha20 | ストリーム暗号 | 256 bits | 96 bits (12 bytes) | プロトコル実装研究・テスト; 上位レイヤー認証付きストリーミング; AEADオーバーヘッドなしベンチマーク |
| ChaCha20-Poly1305 | AEAD | 256 bits | 96 bits (12 bytes) | TLS 1.3, WireGuard, SSH, QUIC, Signal; AES-NI非搭載モバイル・組み込み; タイミング攻撃耐性AEAD |
| XChaCha20 | ストリーム暗号 | 256 bits | 192 bits (24 bytes) | カウンタによるnonce一意性保証困難なファイル・DBフィールド暗号化; libsodium secretstream分割ファイル暗号化; 独立nonce生成バックアップ暗号化 |
| XChaCha20-Poly1305 | AEAD | 256 bits | 192 bits (24 bytes) | ランダムnonce生成+認証必要な静態データ暗号化; libsodiumアプリストレージ; nonce管理を中央集権できない場合の推奨デフォルトAEAD |
ChaCha20 の仕組み
ChaCha20初期化: 行0=定数“expa nd 32-byte k”、行1-2=256ビット鍵(8×32)、行3=[カウンタ₀|nonce₀|nonce₁|nonce₂](IETF: 32ビットカウンタ+96ビットnonce)。クォーターラウンド(a,b,c,d): a+=b; d^=a; d‹‹‹16; c+=d; b^=c; b‹‹‹12; a+=b; d^=a; d‹‹‹8; c+=d; b^=c; b‹‹‹7。
ダブルラウンド=列クォーターラウンド+対角クォーターラウンド。回転定数16-12-8-7によりSalsa20(7-9-13-18)比で2ラウンドで完全拡散。10ダブルラウンド後、出力ブロック=20ラウンド変換状態と元状態のXOR。
AEAD:認証付き暗号化
ChaCha20-Poly1305 AEAD (RFC 8439): カウンタ=0でChaCha20を実行し先頭32バイトをPoly1305一回限りキーとして導出。カウンタ=1から平文をChaCha20で暗号化。Poly1305 MACを[パディングAAD||パディング暗号文||len(AAD)||len(暗号文)]で計算。16バイトタグを添付。
XChaCha20-Poly1305: HChaCha20(HSalsa20対応)で192ビットnonceの先128ビット+元鍵から256ビット部分鍵を導出。部分鍵+残64ビットnonceでChaCha20-Poly1305を実行。2³²メッセージでも衝突確率2^(-128)。libsodium: crypto_aead_xchacha20poly1305_ietf_encrypt。
主な特徴
- Salsa20比の優れた拡散:回転定数16-12-8-7で2ラウンドで全16ワードに完全拡散(Salsa20は4ラウンド)。ChaCha20/8がSalsa20/16相当の安全性。
- IETF標準化 (RFC 8439, 2018): TLS 1.3, WireGuard, SSH OpenSSH, QUIC, Signal, Noise Protocol Framework, Android TLS で採用。
- AES非依存性能: AES-NI非搭載のARM Cortex-A53/A55, RISC-V, MIPSで高速。AES-NI非搭載ハードでAES-GCM比25〜40%高速。IoT・モバイル・組み込みに最適。
- 96ビットIETF nonce: 32ビットカウンタ(最大256GB/nonce)+XChaCha20の192ビット拡張でランダムnonce生成安全。
- ChaCha20/20への既知攻撃なし(2025年現在)。最良の短縮ラウンド解析: Shi et al. (2012) ChaCha20/6の確率的中性ビット差分。
セキュリティ上の考慮事項
- ChaCha20-Poly1305でのnonce再利用: 2つの(鍵,nonce)同一暗号でXOR平文露出+Poly1305鍵漏洩→完全破壊。TLS 1.3ではシーケンス番号XORによる一意性保証。
- 32ビットカウンタ制限: 96ビットIETFでは最大256GB/nonce。超過時nonce増分またはrekey。TLS 1.3はkey_update前に自動rekeying。
- Poly1305一回限りキー要件: 同nonce再利用でPoly1305キー再利用→認証破壊(Bernstein 2005偽造攻撃)。RFC 8439 §2.8の一nonce一キー構成が防止策。
- 認証タグ切り捨て禁止: RFC 8439が16バイト完全タグを要求。64ビット切り捨てで偽造抵抗が2^(-64)に低下、TLS 1.3非準拠。常に16バイト使用。
実際の使用例
- TLS 1.3 (RFC 8446): TLS_CHACHA20_POLY1305_SHA256が必須暗号スイート。OpenSSL, BoringSSL, NSS, WolfSSL, mbedTLSで実装。AES-NI非搭載クライアントの優先暗号。
- WireGuard VPN: ChaCha20-Poly1305がWireGuardの唯一の対称暗号(Donenfeld 2017, Linux 5.6)。Curve25519+Poly1305+BLAKE2+SipHashと組み合わせ。
- Signal Protocol/Double Ratchet: X3DH後のDouble Ratchetメッセージ暗号化にChaCha20-Poly1305を使用。WhatsApp, Facebook Messenger秘密会話, Matrix, Keybaseも採用。
- OpenSSH chacha20-poly1305@openssh.com: OpenSSH 6.5 (2014)が最初の主要SSH実装。2つのChaCha20インスタンス(パケット長用+ペイロード用)でタイミングリーク排除。
- Google TLS (2014): Langley+DuongがAndroid TLSに採用。Nexus 5 Cortex-A15でAES-128-GCM比3倍高速。IETF標準化に影響。