暗号化の基礎

ChaCha20 ちゃちゃにじゅう

ストリーム暗号TLSPoly1305AES乱数生成暗号化
ChaCha20について教えて

簡単に言うとこんな感じ!

ChaCha20は、データをスクランブルして守る「暗号化アルゴリズム」のひとつだよ。AESという有名な暗号の弱点をカバーするために作られた新しい暗号で、スマホや低スペックな機器でも速くて安全に使えるんだ。いまやHTTPS通信の裏側でよく動いてるんだよ!


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のサービス、CloudflareCDNなど、日常的に触れるサービスの裏側で活躍しています。

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の比較

比較項目ChaCha20AES(-GCM)
種別ストリーム暗号ブロック暗号
鍵長256bit固定128/192/256bit
HW支援なし環境での速度⭕ 高速△ 遅い
HW支援あり環境での速度△ AESより遅い場合も⭕ 非常に高速
サイドチャネル攻撃への耐性⭕ 強い△ 実装依存
標準化状況RFC 8439 / TLS 1.3FIPS 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(AEAD)の処理フロー 平文データ 256bit 秘密鍵 + Nonce 付加データ (AAD: ヘッダ等) ChaCha20 キーストリーム生成 → XOR Poly1305 認証タグ(128bit)生成 暗号文(ChaCha20出力) + 認証タグ(Poly1305出力)= 送信データ 受信側は認証タグで改ざん検知 → 正しければ復号

このフローにより、ChaCha20-Poly1305 は以下の3つを同時に保証します。

保証内容担当意味
機密性(Confidentiality)ChaCha20第三者には内容がわからない
完全性(Integrity)Poly1305通信途中でデータが改ざんされていない
認証(Authentication)Poly1305正しい送信者からのデータか確認できる

関連する規格・RFC

規格・RFC番号内容
RFC 8439ChaCha20-Poly1305 の IETF 標準仕様(2018年)
RFC 7539RFC 8439 の前身(2015年)。内容はほぼ同じ
RFC 8446TLS 1.3 の仕様。ChaCha20-Poly1305 を暗号スイートとして規定
FIPS 197AES の標準仕様(比較参照)

関連用語

  • AES(Advanced Encryption Standard) — ChaCha20 と並ぶ主要対称鍵暗号。ハードウェア支援環境で特に高速
  • TLS(Transport Layer Security) — HTTPS通信を守るプロトコル。ChaCha20-Poly1305 を暗号スイートとして採用
  • ストリーム暗号 — データを1ビット〜1バイト単位で逐次暗号化する方式。ChaCha20の種別
  • Poly1305 — ChaCha20 と組み合わせて使われるメッセージ認証コード(MAC)
  • AEAD — 暗号化と認証を同時に行う方式の総称。ChaCha20-Poly1305 はその代表例
  • Nonce(ノンス) — 一度しか使わない乱数値。ChaCha20 の安全性維持に不可欠