ChaCha20
ChaCha20 とは何ですか?
ChaCha20Daniel J. Bernstein が設計した現代的ストリーム暗号で、256 ビット鍵と 96 ビットナンスを用いる。Poly1305 と組み合わせた AEAD「ChaCha20-Poly1305」として広く使われる。
ChaCha20 は、Daniel J. Bernstein が 2008 年に自身の Salsa20 設計を改良して発表した 20 ラウンドのストリーム暗号です。256 ビット鍵、96 ビットナンス、32 ビットブロックカウンタから、32 ビット語に対する加算・回転・XOR(ARX)演算のみを用いて鍵ストリームを生成します。中核となるのは、状態語を 4 つずつ混合する「クォーターラウンド」です。ルックアップテーブルを必要としないため高速で、AES ハードウェアを持たない CPU でも自然に定数時間で動作します。これが、Google が 2014 年に Android と Chrome のトラフィック保護のために最初に展開した理由です。Poly1305 MAC と組み合わせた AEAD 方式 ChaCha20-Poly1305 は RFC 8439(RFC 7539 を廃止)で標準化され、TLS 1.3 では AES-GCM と並ぶ 2 つの必須暗号スイートの 1 つとなっています。また QUIC、WireGuard、OpenSSH、Signal プロトコル、Linux カーネルの乱数生成器などの基盤にもなっています。
運用上の重大な落とし穴が ナンスの再利用 です。同じ鍵とナンスで 2 つのメッセージを暗号化すると、それらの平文の XOR が露出し、さらにワンタイムの Poly1305 鍵が明らかになるため、機密性と完全性の両方が破られます。96 ビットのナンスは接続ごとのカウンタとしては十分ですが、大規模にランダム生成する用途では危険です。そこで XChaCha20(draft-irtf-cfrg-xchacha)は、HChaCha20 によるサブ鍵導出を介してナンスを 192 ビットに拡張し、ランダムなナンスを安全に使えるようにしています。10 年以上にわたる暗号解析を経ても、フル 20 ラウンド版を破る攻撃は見つかっていません。
flowchart LR K[256 ビット鍵] --> S[状態を初期化: 定数・鍵・カウンタ・ナンス] N[96 ビットナンス] --> S CTR[ブロックカウンタ] --> S S --> R[ARX クォーターラウンドを 20 回] R --> KS[鍵ストリームブロック] PT[平文] --> X((XOR)) KS --> X X --> CT[暗号文] CT --> P[Poly1305 MAC] P --> TAG[認証タグ]
● 例
- 01
TLS 1.3 と QUIC ではモバイル端末で TLS_CHACHA20_POLY1305_SHA256 が使われる。
- 02
WireGuard はすべてのデータパケットを ChaCha20-Poly1305 で暗号化する。
● よくある質問
ChaCha20 とは何ですか?
Daniel J. Bernstein が設計した現代的ストリーム暗号で、256 ビット鍵と 96 ビットナンスを用いる。Poly1305 と組み合わせた AEAD「ChaCha20-Poly1305」として広く使われる。 サイバーセキュリティの 暗号 カテゴリに属します。
ChaCha20 とはどういう意味ですか?
Daniel J. Bernstein が設計した現代的ストリーム暗号で、256 ビット鍵と 96 ビットナンスを用いる。Poly1305 と組み合わせた AEAD「ChaCha20-Poly1305」として広く使われる。
ChaCha20 からどのように防御しますか?
ChaCha20 に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。