情報セキュリティの分野で広く使われている暗号技術のひとつが「ストリーム暗号」です。
ストリーム暗号は、データを1ビット・1バイト単位でリアルタイムに暗号化できる方式で、音声通信や動画ストリーミングなど、遅延を極力抑えたい用途に適した暗号化技術です。
ブロック暗号と並んで対称鍵暗号の代表的な方式として位置づけられており、RC4やChaCha20といった具体的なアルゴリズムがよく知られています。
本記事では、ストリーム暗号の仕組みや特徴、ブロック暗号との違い、疑似乱数生成の役割などをわかりやすく解説します。
ストリーム暗号とは?基本的な仕組みと定義
それではまず、ストリーム暗号の基本的な仕組みと定義について解説していきます。
ストリーム暗号とは、平文を1ビットまたは1バイトずつ連続的に暗号化する対称鍵暗号方式のことです。
暗号化には「キーストリーム」と呼ばれる疑似乱数列が使用され、平文の各ビットとキーストリームのビットをXOR演算することで暗号文が生成されます。
XOR演算は同じ値を2回適用すると元に戻る性質があるため、復号の際も同じキーストリームを使ってXOR演算するだけで平文が復元できます。
暗号化:平文ビット XOR キーストリームビット = 暗号文ビット
復号:暗号文ビット XOR キーストリームビット = 平文ビット
この仕組みがシンプルであるため、実装が比較的容易で処理速度が速い点がストリーム暗号の大きな特徴です。
ただし、キーストリームの品質(ランダム性・予測困難性)が暗号の安全性に直結するため、疑似乱数生成器の設計が非常に重要です。
疑似乱数生成(PRNG)の役割
ストリーム暗号の中核をなすのが「疑似乱数生成器(PRNG:Pseudo Random Number Generator)」です。
PRNGは、秘密鍵と初期化ベクトル(IV)を入力として受け取り、統計的にランダムに見えるビット列(キーストリーム)を生成します。
真の乱数ではなく疑似乱数であるため、同じ秘密鍵とIVを使えば常に同じキーストリームが再現できる性質を持ちます。
この再現性が復号を可能にしている一方、PRNGの設計に脆弱性があると暗号解読に利用される危険性があります。
暗号論的に安全な疑似乱数生成器(CSPRNG)の使用が、ストリーム暗号のセキュリティを担保する上で不可欠です。
初期化ベクトル(IV)の重要性
初期化ベクトル(IV:Initialization Vector)は、同じ秘密鍵を使っても異なる暗号文が生成されるようにするためのランダムな値です。
IVが固定されている場合、同じ鍵で複数のメッセージを暗号化すると、同じキーストリームが使い回されてしまいます。
2つの暗号文のXORを取ると2つの平文のXORが得られてしまうため、キーストリームの再利用は致命的なセキュリティ上の欠陥となります。
このため、IVは毎回必ずランダムな値を使用することが、ストリーム暗号の安全な運用における鉄則です。
同期型と自己同期型の違い
ストリーム暗号には、キーストリームの生成方法によって「同期型」と「自己同期型」の2種類があります。
同期型は、送信側と受信側が同じ内部状態を保ちながらキーストリームを生成する方式で、通信エラーが発生すると以降のデータがすべて復号不能になるリスクがあります。
自己同期型は、過去の暗号文ビットを内部状態に組み込んでキーストリームを生成するため、エラーが発生しても一定のビット数が経過すれば自動的に同期が回復します。
それぞれ用途に応じた使い分けが求められます。
代表的なストリーム暗号アルゴリズム:RC4とChaCha20
続いては、代表的なストリーム暗号アルゴリズムであるRC4とChaCha20について確認していきます。
歴史的な経緯と現在の安全性評価を合わせて理解することが重要です。
RC4の仕組みと脆弱性
RC4(Rivest Cipher 4)は、1987年にRon Rivestによって設計されたストリーム暗号で、かつてSSL/TLSやWEPなど多くのプロトコルで使用されていました。
RC4の特徴は、実装がシンプルで非常に高速な点にあり、ソフトウェア実装において広く採用されました。
しかし、後に複数の深刻な脆弱性が発見され、現在ではRC4の使用は推奨されていません。
RC4の主な脆弱性:初期キーストリームの先頭バイトに偏りがあり、統計的攻撃に弱いことが判明しています。TLS 1.0/1.1でのRC4使用は廃止されており、現在のセキュリティ基準には適合しません。
MicrosoftやIETFもRC4の使用廃止を推奨しており、現代のシステムではRC4を使用すべきではありません。
過去のシステムとの互換性のためにRC4を理解することは重要ですが、新規開発への採用は避けることが鉄則です。
ChaCha20の特徴と安全性
ChaCha20は、Daniel Bernsteinが2008年に設計したストリーム暗号で、RC4に代わる安全なストリーム暗号として現在広く採用されています。
ChaCha20は256ビットの鍵を使用し、ARX(Add-Rotate-XOR)構造を基盤とした設計により、高い安全性と優れたソフトウェア実装効率を両立しています。
TLS 1.3においては、ChaCha20とPolyモードのMAC(メッセージ認証コード)を組み合わせた「ChaCha20-Poly1305」が標準的な暗号スイートとして採用されています。
AES専用のハードウェア命令が使えない環境(モバイルデバイスなど)でも高速に動作することから、GoogleはHTTPS通信にChaCha20を積極的に採用しています。
その他のストリーム暗号アルゴリズム
RC4とChaCha20以外にも、さまざまなストリーム暗号アルゴリズムが存在します。
| アルゴリズム | 特徴 | 現在の評価 |
|---|---|---|
| Salsa20 | ChaCha20の前身。256ビット鍵使用 | 安全(現役) |
| A5/1 | GSM携帯通信向けに設計 | 脆弱性あり(非推奨) |
| SEAL | 高速なソフトウェア実装向け設計 | 限定的に使用 |
| Grain | ハードウェア実装に特化 | 研究・特定用途向け |
暗号技術は継続的に研究・更新されており、使用するアルゴリズムは常に最新のセキュリティ評価を確認することが重要です。
ストリーム暗号とブロック暗号の違い
続いては、ストリーム暗号とブロック暗号の違いを確認していきます。
両者の特性を理解することで、適切な暗号化方式の選択が可能になります。
ブロック暗号の基本的な仕組み
ブロック暗号は、平文を固定長のブロック(例:AESは128ビット)に分割し、ブロック単位で暗号化する方式です。
平文の長さがブロック長の整数倍でない場合は、パディング(詰め物)を追加して調整します。
AES(Advanced Encryption Standard)が現在の標準的なブロック暗号であり、128・192・256ビットの鍵長をサポートしています。
ブロック暗号はさらに「動作モード」(CBC、ECB、CTRなど)を組み合わせて使用することが一般的です。
ストリーム暗号とブロック暗号の比較
ストリーム暗号の特徴:1ビット・1バイト単位で処理。遅延が少なくリアルタイム処理に適している。パディング不要。実装がシンプルで高速。主な用途は音声・動画通信など。
ブロック暗号の特徴:固定ブロック単位で処理。パディングが必要な場合あり。動作モードとの組み合わせで多様な用途に対応。ファイル暗号化・データベース暗号化に広く使用される。
どちらが優れているというわけではなく、用途に応じた適切な選択が重要です。
たとえばVoIP通話やライブストリーミングでは低遅延が求められるためストリーム暗号が有利ですが、ファイルの保存暗号化ではブロック暗号が一般的に使用されます。
CTRモードによるブロック暗号のストリーム化
興味深い点として、ブロック暗号をCTR(カウンターモード)で動作させると、実質的にストリーム暗号と同様の動作を実現できます。
CTRモードでは、カウンター値をブロック暗号で暗号化したものをキーストリームとして使用するため、ブロック暗号とストリーム暗号の境界は実は曖昧です。
このため現代の暗号設計では、AES-CTRやAES-GCMのようにブロック暗号をストリーム暗号的に使用するケースが多く見られます。
まとめ
ストリーム暗号は、データを1ビット・1バイト単位でリアルタイムに暗号化できる対称鍵暗号方式で、遅延を最小限に抑えたい通信用途に適した暗号化技術です。
RC4は過去に広く使用されましたが現在は非推奨であり、ChaCha20が安全で高速な現代的ストリーム暗号として標準的な地位を確立しています。
ブロック暗号との違いを理解し、用途に応じた適切な暗号化方式を選択することがセキュリティ設計の基本です。
疑似乱数生成の品質とIVの管理がストリーム暗号の安全性を左右する重要な要素であることを、常に意識しておきましょう。