ChaCha20 ストリーム暗号でデータを暗号化する
ChaCha20 は Daniel J. Bernstein が設計した高速な ARX ベースのストリーム暗号で、TLS で採用され、AES のモバイル向け代替としても使われます。
- 1
ChaCha20 は 256 ビット鍵・96 ビット nonce のストリーム暗号で、加算・回転・XOR(ARX)演算で構成されます。ハードウェアアクセラレーションなしで高速性を達成するため、モバイルデバイスに理想的です。ここでは、同じ運用パターンを示すため、ストリーム暗号のワークフローを RC4(レガシーなストリーム暗号)でデモします。
- 2 RC4 暗号化ツール →
RC4 でデータを暗号化すると、ストリーム暗号のインターフェースがわかります。鍵と平文を与え、同じ長さの暗号文を受け取ります。ChaCha20 は同じ API を使いますが、RC4 のステートフルな初期化の代わりに 96 ビットの nonce を使います。
- 3 RC4 復号ツール →
同じ鍵で復号して平文を復元します。ストリーム暗号は対称です。暗号化と復号は同じ操作(キーストリームとの XOR)を使います。
- 4
決定的な違い:RC4 は破られており、本番環境で使ってはなりません。ChaCha20-Poly1305(認証付きの変種)が現代の選択です。上のワークフローはストリーム暗号の API パターンを示すものであり、RC4 の安全性を示すものではありません。
よくある質問
- なぜ AES の代わりに ChaCha20 を使うのですか?
- AES ハードウェアアクセラレーション(AES-NI)のないデバイスでは、ChaCha20 の方が高速で、設計上定数時間であり、タイミングサイドチャネルを回避します。ARM Android 上の Google Chrome TLS のデフォルトです。
- ChaCha20-Poly1305 とは何ですか?
- ChaCha20(機密性)と Poly1305(整合性)を組み合わせた認証付き暗号です。RFC 8439 として標準化され、TLS 1.3 で使われています。認証なしの ChaCha20 単体は決して使わないでください。