CoderTools

ChaCha20 暗号化

認証オプション付きの最新ストリーム暗号

クライアントサイドセキュリティ

ChaCha20-Poly1305(RFC 8439)が推奨AEAD。平ChaCha20は認証なし—常にPoly1305と組み合わせること。96ビットIETF nonceでは厳格なnonce一意性を保証。XChaCha20-Poly1305(192ビットnonce)でランダムnonce生成が安全に。

ChaCha20(ストリームのみ): 256ビット鍵, 96ビットnonce, 32ビットカウンタ(最大256GB), 20ラウンド; 認証なし; 単独使用禁止。

初期カウンター値(デフォルト:0)

フォーマットオプション
🔒 100% ローカル処理入力されたデータはすべてブラウザ内で処理されます。サーバーに送信されることはありません。

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標準化に影響。

参考資料

クイックメニュー

最近のツールはありません