ChaCha20 ちゃちゃにじゅう
ChaCha20とは
ChaCha20は、Googleのエンジニアであるダニエル・バーンスタイン(Daniel J. Bernstein)が設計したストリーム暗号(stream cipher)アルゴリズムです。2008年に発表された「Salsa20」を改良したもので、暗号強度を高めながら処理速度も維持したのが特徴です。名前の「ChaCha」はSalsa20のダンス的なイメージを引き継いだもの、「20」は内部で行う処理の回数(ラウンド数)を意味します。
現代のウェブ通信を守るTLS 1.3(Transport Layer Security)において、AESと並ぶ主要な暗号アルゴリズムとして採用されています。特に「ChaCha20-Poly1305」という組み合わせ(暗号化+認証を一緒に行うAEAD方式)が広く使われており、AndroidやiOSのアプリ、Googleのサービス、CloudflareのCDNなど、日常的に触れるサービスの裏側で活躍しています。
AESはハードウェア支援(AES-NI命令)がある環境では非常に高速ですが、その支援がないCPUでは遅くなります。ChaCha20はソフトウェアだけで高速に動作するよう設計されているため、IoT機器・スマートフォン・組み込みシステムなどハードウェア支援が使えない環境でも安全性と速度を両立できます。
ChaCha20の仕組みと特徴
ChaCha20は「擬似乱数ストリーム(鍵と初期値から生成した乱数列)」を使って平文に XOR演算を行うことでデータを暗号化します。鍵の長さは256ビット固定です。
| 項目 | 内容 |
|---|---|
| 種別 | ストリーム暗号 |
| 鍵長 | 256ビット(固定) |
| ノンス(Nonce)長 | 96ビット(RFC 8439準拠) |
| ブロックサイズ | 512ビット(64バイト)単位で擬似乱数を生成 |
| ラウンド数 | 20ラウンド |
| 設計者 | Daniel J. Bernstein |
| 標準化 | RFC 8439(2018年) |
動作のイメージ
[ 256bit 秘密鍵 ] + [ 96bit Nonce ] + [ 32bit カウンター ]
↓
ChaCha20 コア関数(20ラウンドの攪拌処理)
↓
512bit の擬似乱数ブロック(キーストリーム)
↓
平文データと XOR → 暗号文
ポイントは「同じ鍵でもNonce(一度だけ使う値)が違えば毎回異なる乱数列が生成される」こと。Nonceを使い回すと安全性が崩壊するため、実装上の注意点として覚えておきましょう。
覚え方:「チャチャっと20回かき混ぜる!」
ChaCha20の名前の覚え方は「チャチャっと(素早く)20回かき混ぜる暗号」!鍵と乱数を20回グルグルかき混ぜて、誰にも解読できない乱数を作るイメージです。
ChaCha20とAESの比較
| 比較項目 | ChaCha20 | AES(-GCM) |
|---|---|---|
| 種別 | ストリーム暗号 | ブロック暗号 |
| 鍵長 | 256bit固定 | 128/192/256bit |
| HW支援なし環境での速度 | ⭕ 高速 | △ 遅い |
| HW支援あり環境での速度 | △ AESより遅い場合も | ⭕ 非常に高速 |
| サイドチャネル攻撃への耐性 | ⭕ 強い | △ 実装依存 |
| 標準化状況 | RFC 8439 / TLS 1.3 | FIPS 197 / TLS 1.3 |
| 主な用途 | モバイル・IoT・TLS | 企業系・HW対応環境 |
歴史と背景
- 2005年 — Daniel J. Bernstein が Salsa20 を発表。高速なストリーム暗号として注目される
- 2008年 — Salsa20 をベースに改良した ChaCha シリーズを公開。ChaCha8 / ChaCha12 / ChaCha20 の3種を提案
- 2013年 — Googleが TLSにおいて ChaCha20-Poly1305 の採用を開始。モバイル向けに AES より高速であることを実証
- 2015年 — IETF が標準化に着手。RFC 7539 として標準化される
- 2016年 — Android や Chrome での採用が拡大。エドワード・スノーデン事件後の「より安全な暗号」需要に応える形で普及が加速
- 2018年 — RFC 7539 を更新した RFC 8439 が公開。TLS 1.3 の必須対応暗号スイートのひとつに採用される
- 現在 — Cloudflare、Google、Apple、Signal など主要プラットフォームで広く利用される業界標準のひとつに
ChaCha20-Poly1305:セットで使われる理由
ChaCha20 は単体では「暗号化(Confidentiality)」のみを担います。実際の通信では「データが改ざんされていないか」も確認する必要があるため、メッセージ認証コード(MAC)を生成する Poly1305 と組み合わせて使われます。この組み合わせは AEAD(Authenticated Encryption with Associated Data) と呼ばれる方式で、暗号化と認証を一度に行います。
このフローにより、ChaCha20-Poly1305 は以下の3つを同時に保証します。
| 保証内容 | 担当 | 意味 |
|---|---|---|
| 機密性(Confidentiality) | ChaCha20 | 第三者には内容がわからない |
| 完全性(Integrity) | Poly1305 | 通信途中でデータが改ざんされていない |
| 認証(Authentication) | Poly1305 | 正しい送信者からのデータか確認できる |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 8439 | ChaCha20-Poly1305 の IETF 標準仕様(2018年) |
| RFC 7539 | RFC 8439 の前身(2015年)。内容はほぼ同じ |
| RFC 8446 | TLS 1.3 の仕様。ChaCha20-Poly1305 を暗号スイートとして規定 |
| FIPS 197 | AES の標準仕様(比較参照) |
関連用語
- AES(Advanced Encryption Standard) — ChaCha20 と並ぶ主要対称鍵暗号。ハードウェア支援環境で特に高速
- TLS(Transport Layer Security) — HTTPS通信を守るプロトコル。ChaCha20-Poly1305 を暗号スイートとして採用
- ストリーム暗号 — データを1ビット〜1バイト単位で逐次暗号化する方式。ChaCha20の種別
- Poly1305 — ChaCha20 と組み合わせて使われるメッセージ認証コード(MAC)
- AEAD — 暗号化と認証を同時に行う方式の総称。ChaCha20-Poly1305 はその代表例
- Nonce(ノンス) — 一度しか使わない乱数値。ChaCha20 の安全性維持に不可欠