メッセージを送ったり、オンライン決済をしたり、安全なサービスにログインしたりするたびに、暗号化が裏側で働いてデータを非公開に保っています。今日この役割を担っているアルゴリズムのひとつがChaCha20です。高速で安全、かつ軽量な暗号であり、大手テクノロジー企業とセキュリティの専門家の双方から信頼されています。その概要と、データがどのように守られるかを解説します。

ChaCha20

ChaCha20アルゴリズムを理解する

ChaCha20アルゴリズムを理解するには、核となる要素に分解するとわかりやすくなります。すなわち、その起源、暗号化データを生成する処理、そして鍵、ノンス、カウンタの役割です。これらの各部分が連携して速度、効率、セキュリティを実現しており、ChaCha20は多くの現代的な暗号化プロトコルにおいて有力な選択肢となっています。

ChaCha20は誰が、なぜ開発したのか?

ChaChaは 2008年にDaniel J. Bernsteinによって開発されました、アメリカ系ドイツ人の数学者、コンピュータ科学者、暗号研究者です。これは彼の以前の設計であるSalsa20に基づいています。

ChaCha20を開発した主な理由のひとつは、Advanced Encryption Standard(AES)など広く使われている暗号に対する強力な代替手段を提供することでした。AESは非常に安全ですが、最も高速に動作するのはハードウェアアクセラレーションに対応したデバイス上です。つまり、IntelのAdvanced Encryption Standard New Instructions(AES-NI)のように、処理を高速化する専用のCPU命令がある場合です。多くの旧型デバイス、モバイルデバイス、低消費電力デバイスにはこのハードウェアサポートがなく、ソフトウェアのみで実装するとAESは遅くなり、バッテリー消費も大きくなります。

ChaCha20はこの問題を避けるために設計されました。事実上あらゆるプロセッサで高速に動作する単純な演算のみを使用します。この軽量な設計により、スマートフォン、組み込みシステム、その他の制約の多い環境に特に適しています。現在、ChaCha20はTransport Layer Security(TLS)1.3などの最新プロトコルにおいて、AESと並ぶ信頼性の高い選択肢として推奨されています。

ChaCha20の仕組み

ChaCha20を使って、このメッセージを暗号化したいとしましょう:「ExpressVPN protects my online privacy and helps keep my data safe.」手順は次のとおりです。

1. メッセージをバイトに変換する。

コンピュータはバイトで処理します。バイトは0から255までの数値を格納できる8ビットの単位です。今回の文のようなテキストは、各文字(「E」、「x」、スペース、「.」など)を1バイトに対応させて格納されます。この文は66バイトなので、暗号化には64バイトのチャンク(ブロック)が1つより少し多く必要です。

2. 次に、秘密鍵が必要です。

ChaCha20は対称暗号です。つまり、暗号化と復号に同じ秘密を使います。その秘密は256ビットの鍵(32バイト)です。送信者と受信者だけが知る、長くてランダムなパスワードと考えるとよいでしょう。なぜ256ビットなのか。総当たりで推測することは事実上不可能なほど大きいからです。

3. さらにnonce(一度だけ使う数)も必要です。

nonceとは、ある鍵で暗号化するメッセージごとに選ぶ、公開された一意の数値です。

の中で Internet Engineering Task Force(IETF)版のChaCha20では、nonceは96ビット(12バイト)です。秘密である必要はありませんが、同じ鍵と組み合わせて繰り返してはなりません。鍵とnonceのペアを再利用すると、メッセージが漏れてしまいます。

4. ChaCha20がキーストリームを生成する。

ChaCha20は「ストリーム暗号」の一種です。メッセージを直接かき混ぜるのではなく、まずキーストリームと呼ばれる疑似乱数バイトの列を生成します。その後、排他的論理和(XOR)という単純な演算で、キーストリームとメッセージのバイトを組み合わせます。

ChaCha20はどのようにキーストリームを作るのでしょうか?

内部状態を構築する

ChaCha20は状態と呼ばれる小さな作業領域を保持し、数値の4×4グリッドとして配置されます。グリッド内の各数値はワードであり、ここでは32ビット(4バイト)の符号なし整数を意味します。例えば、00000000 00000000 00000111 01001001のようなものです。

グリッド内の16個のワードは次のもので埋められます:

  • 4つの固定定数(アルゴリズムを識別するだけです)、
  • 256ビット鍵からの8ワード(8 × 4バイト = 32バイトのため)、
  • 1つのブロックカウンタ(次に説明します)、
  • ノンスからの3ワード(3 × 4バイト = 12バイト)。

ChaCha internal state

ブロックカウンタ

キーストリームは一度に64バイトのブロック単位で生成されます。

各64バイトブロックを異なるものにするため、ChaCha20は状態内部の32ビットカウンタを使用し、最初のブロックでは0から始まり、次のブロックでは1、というように続きます。

状態を混合する(ARXコア)

ChaCha20は、加算(2³²を法とする)、回転(32ビットワードのビット単位の回転)、XOR(2つのビットを比較し、異なれば1、同じなら0を出力する)という3つの演算のみを使って、グリッドの16ワードを繰り返し混合します。

この混合は、加算、回転、XOR(ARX)演算に基づき、ラウンド単位で行われます(ChaCha20 は 20 ラウンド実行します)。重要な点は、これらの単純で高速な演算が、鍵なしでは元に戻すのが難しい形で状態を徹底的にかき混ぜることです。

64 バイトのキーストリームを生成する

混合の後、ChaCha20 は元の状態を混合後の状態に(ワードごとに)加算し、その結果を 64 バイトのキーストリームとして出力します。これが 1 つのキーストリームブロックです。

5. 必要な数だけキーストリームブロックを作る

メッセージの長さは任意です。ChaCha20 は、counter = 0 で最初の 64 バイトのキーストリームを作り、counter = 1 で次の 64 バイト、counter = 2 でその次の 64 バイト、というように続けます。カウンタが変わるため、各キーストリームブロックは一意です(同じ鍵と nonce でも同様です)。

6. キーストリームをメッセージに揃える

例のメッセージは 67 バイトなので、ブロック 0 はメッセージのバイト 0–63(64 バイト)を担当し、ブロック 1 はメッセージのバイト 64–66(最後の 3 バイト)を担当します。2 つ目のキーストリームブロックからは最初の 3 バイトだけを使い、残りは無視します。

7. XOR でメッセージとキーストリームを結合する

XOR はバイト単位の演算で、同じ XOR を 2 回行うと元に戻るという便利な性質があります:

暗号化(バイトごと):平文 XOR キーストリーム = 暗号文

復号(バイトごと、同じキーストリーム):暗号文 XOR キーストリーム = 平文

ChaCha20 と他の暗号の比較

今日、ChaCha20は広く使われていますが、利用されている暗号化アルゴリズムはこれだけではありません。AESやRivest–Shamir–Adleman(RSA)などの他の暗号も一般的ですが、それぞれ動作の仕組みが異なり、適した用途も異なります。これらを比較することで、ChaCha20の位置づけや、一部のプロトコルが代替手段ではなくChaCha20を選ぶ理由がわかります。

ChaCha20とAESの比較

ChaCha20とAESはどちらも共通鍵暗号アルゴリズムであり、暗号化と復号に同じ鍵を使用します。暗号化とハッシュ化の違いを含むさまざまな暗号技術をより深く理解するには、こちらの ハッシュ化と暗号化の比較.

ChaCha20とAESの主な違いは、データの処理方法にあります。AESはブロック暗号であり、固定長のブロック単位でデータを暗号化します。一方、ChaCha20はストリーム暗号であり、連続したキーストリームを生成してデータと組み合わせます。

AESは、最新のプロセッサにおけるハードウェアアクセラレーションの恩恵を受けることが多く、そのような環境では非常に高速です。一方、ChaCha20は専用ハードウェアがなくても安定して高い性能を発揮できるよう設計されており、モバイル端末や低消費電力システムに適した選択肢となります。そのため、 ExpressVPN はLightwayプロトコルでAES-256とChaCha20の両方を使用し、お使いのデバイスに最適な方へ自動的に切り替えます(手動でどちらかを選ぶこともできます)。

もう一つの実務上の違いは実装面にあります。AESは慎重に実装しないとタイミング攻撃に対して脆弱になる可能性があり、安全にコーディングするのがより複雑になり得ます。ChaCha20は、本質的に定数時間で実行される単純なARX演算を使用するため、このリスクを抑えやすくなります。

どちらの暗号も適切に実装されていれば安全とされており、TLS 1.3などの最新プロトコルはそれぞれに対応しています。どちらを選ぶかは、セキュリティ上の懸念ではなく、デバイスのハードウェアと性能要件によって決まります。

機能 ChaCha20 AES
暗号の種類 ストリーム暗号 ブロック暗号
ハードウェアアクセラレーション すべてのデバイスで高速 AES‑NI(専用ハードウェア命令)との相性が最良
実装の容易さ より単純な定数時間演算 より複雑で、慎重なコーディングが必要
AES‑NI(専用ハードウェア命令)なしでの速度 非常に高速 より遅い

ChaCha20 vs. RSA

ChaCha20とRSAは直接の競合関係にはありません。セキュア通信においてそれぞれ異なる機能を担っています。

RSAは非対称暗号アルゴリズムであり、公開鍵と秘密鍵の鍵ペアを使用します。通常、セキュア接続の開始時に暗号化鍵の交換や身元確認に用いられます。TLSでは、対称鍵アルゴリズムとしてAESがよく使われ、鍵交換はRSAによって保護されます。

RSAはより複雑な数学演算を伴い、より大きな鍵サイズで動作するため、継続的なデータ暗号化には速度が遅く、効率が劣ります。

一方、ChaCha20は対称ストリーム暗号です。暗号化と復号の両方に単一の共有鍵を使うため、より高速で、継続的なデータ転送に適しています。

実際には、多くの安全なプロトコルが両方の手法を組み合わせています。初期ハンドシェイクにはRSA(または別の非対称アルゴリズム)を使い、セッションの残りの部分にはChaCha20または別の対称暗号を使います。

ChaCha20の利点

ChaCha20が人気なのは、安全であるだけでなく、実運用でもよく機能するからです。あらゆる種類のデバイスで高速に動作し、電力の少ないスマートフォンや機器でも同様です。設計がわかりやすいため、暗号化を弱めてしまうよくあるミスを避けやすくなります。

モバイルおよび低消費電力デバイスでの速度と性能

ChaCha20は、ハイエンドプロセッサだけでなく、あらゆる種類のハードウェアで効率よく動作するよう設計されています。多くのスマートフォン、タブレット、IoTデバイスのようにAESハードウェアアクセラレーションがない機器では、明らかに高速に動作することがあります。

シンプルさとタイミング攻撃への耐性

ChaCha20は、単純なARX演算を中心に構築されています。これらは定数時間で実行されるため、処理するデータによって実行速度が変わることはなく、すべての演算がまったく同じ時間で完了します。

この設計により、安全に実装しやすくなり、暗号化ステップにかかる時間を測定して情報を抜き出そうとするタイミング攻撃からの防御にも役立ちます。

ChaCha20の既知の制限は何か?

ChaCha20は長年研究されてきており、フルの20ラウンド版に対する実運用上の解読は公表されていません。全体として、今日存在するAESの代替案の中で最も徹底的に検証されたものです。ただし、開発者が念頭に置くべき明確な制限もあります。これらの範囲外で使うと、保護が弱まる可能性があります。

  • Nonceの再利用は重大なリスクです: 同じ鍵で同じノンスを使うと、機密性が即座に失われます。各ノンスと鍵の組み合わせは一意でなければなりません。
  • 組み込みの認証機能がない: ChaCha20はデータを暗号化するだけです。データが改ざんされていないことを確認するには、Poly1305と併用する必要があります。
  • 鍵/ノンスごとの暗号化データ上限: ChaCha20は、同じ鍵とノンスで最大2³²個の64バイトブロック(約256 GB)を処理できます。この上限を超えるとキーストリームが再利用され、暗号化の安全性が完全に損なわれます。

ChaCha20-Poly1305の解説

ChaCha20‑Poly1305は、データを保護するために連携する2つの暗号コンポーネントの組み合わせです:

  • ChaCha20は共有秘密鍵で情報を暗号化し、鍵を持たない人にはランダムなデータのように見える形に変換します。ただし、改ざんは検出できません。
  • Poly1305はメッセージ認証コード(MAC)を生成し、受信者がデータが改ざんされていないこと、および正しい送信元からのものであることを確認できるようにします。

これらを組み合わせることで、追加データを伴う認証付き暗号(AEAD)と呼ばれる方式になります。つまり、暗号化プロセスはメッセージの内容を隠すだけでなく、その完全性も検証します。

Poly1305が唯一の選択肢ではありませんが、現代のプロトコルでChaCha20を使う場合、最も一般的な選択です。これは、ChaCha20‑Poly1305がIETF(RFC 8439)によって標準化され、TLS、SSH、WireGuard、その他のプロトコルで広くサポートされているため、 デファクト 標準。

2025年のChaCha20:現代システムでの利用箇所

ChaCha20は、多くのセキュリティ重視のアプリケーションで標準的な選択肢となっています。インターネットセキュリティでは、TLS接続でPoly1305と組み合わせて使われることが多く、特にAESのハードウェアサポートがないデバイス上でHTTPSトラフィックを保護します。ChromeやFirefoxなどの主要ブラウザ、およびnginxやApacheなどのウェブサーバーが、この暗号スイートをサポートしています。

ChaCha20 used in modern systems

仮想プライベートネットワーク(VPN)でも広く使われています。 WireGuard VPNプロトコルは、例えば、モバイルや組み込みデバイスでも高い性能を維持しながらデータを保護するため、ChaCha20‑Poly1305をデフォルトとして設定しています。Linux、Android、iOS、Windowsを含む主要なオペレーティングシステムにもサポートが組み込まれています。

概要

ChaCha20は、Daniel J. Bernsteinによって、特にハードウェアアクセラレーションのないモバイルや低消費電力デバイス向けに、AESの高速かつ安全な代替として作られた、ソフトウェアに適した現代のストリーム暗号です。256ビットの鍵、一意の96ビットnonce、およびブロックカウンタを用いて擬似ランダムなキーストリームを生成し、平文とXORで結合してデータを暗号化します。ARX(加算・回転・XOR)設計はシンプルで効率的であり、タイミング攻撃に対して本質的に耐性があります。ChaCha20は対称暗号(暗号化と復号に同じ鍵を使用)であり、AESのようなブロック暗号や、通常は鍵交換や認証にのみ用いられるRSAのような非対称アルゴリズムとは異なります。TLS、VPN、主要プラットフォームで広く導入され、高い安全性を持つと見なされていますが、ChaCha20はnonceの一意性を厳守し、鍵/nonceの組み合わせごとにデータ量の上限を守る必要があり、組み込みの認証機能はありません。そのため、機密性と完全性の両方を提供する標準化されたChaCha20‑Poly1305 AEAD構成では、通常Poly1305と組み合わせて使用されます。

FAQ:ChaCha20に関するよくある質問

GoogleはChaCha20を使用していますか?

はい。Googleは2014年に、Transport Layer Security(TLS)/Secure Sockets Layer(SSL)プロトコルの一部として、ChaCha20をPoly1305とともに採用しました。目的は、Advanced Encryption Standard(AES)のハードウェアアクセラレーションを持たないモバイルデバイスやサーバー向けに、性能とセキュリティを向上させ、そうした環境で安全な接続をより速く、より効率的にすることでした。

ChaCha20は耐量子性がありますか?

はい。ChaCha20のような対称暗号は、十分に長い鍵(例:256ビット)を使用すれば、一般に耐量子性があると見なされています。

ChaCha20はファイル暗号化に使用できますか?

はい。ChaCha20は、デバイスに保存された機密データを保護するためのファイル暗号化ツールで使用できます。その速度と効率性により、大容量ファイルにも、処理能力が限られたデバイスにも適しています。

ChaCha20は解読できますか?

フル20ラウンドのChaCha20暗号を破る、公表された実世界の攻撃は存在しません。セキュリティの専門家は引き続き研究を続けており、その制限内で正しく使用すれば、現代の暗号化ニーズに対して安全であると考えられています。