ChaCha20
概要

暗号化には256ビットの鍵と使い捨てのランダム値である96ビットのノンス(nonce:number used once)、32ビットのカウンタを用いる。これらを基に生成した疑似乱数列と平文の排他的論理和(XOR)を取ることで暗号文を作成し、復号時も同じ疑似乱数列を用いて元の平文を復元する。鍵が同じでもノンスが異なれば暗号ストリームも変わる。
内部では4×4の行列データに対し、加算、排他的論理和、ビット回転という3種類の演算のみを組み合わせた変換処理を繰り返す。この変換を20回行うことが名称の「20」という数字の由来である。演算が単純なため、専用の暗号処理機構を持たない一般的なCPUでも効率よく処理できる。
ChaCha20は2008年、暗号研究者のダニエル・バーンスタイン(Daniel J. Bernstein)氏によって開発された。同氏が開発した「Salsa20」という既存のストリーム暗号を改良したものである。データの混合効率を高めたことで、安全性と処理性能の両面が向上している。長年にわたり暗号解析が行われているが、適切に運用されたChaCha20に対する実用的な攻撃方法は現在まで知られていない。
実際の通信では暗号化と同時に改竄検出を行うことが一般的であるため、ChaCha20はメッセージ認証符号の一種である「Poly1305」と組み合わせた「ChaCha20-Poly1305」として使われることが多い。これは暗号化と完全性検証を同時に行う認証付き暗号(AEAD)の一種であり、TLSやWireGuard、SSHなどの通信プロトコルで採用されている。専用の暗号化支援機構を持たないスマートフォンや組み込み機器でも高速に動作するため、AndroidやChromeなどでも優先的に利用されている。