ストリーム暗号とは:定義・仕組み・ブロック暗号との違いと安全性
暗号分野でいうストリーム暗号は、平文ビットと擬似ランダムな暗号ビット列(鍵ストリーム)を排他的論理和(xor)で結合してデータを暗号化する対称鍵暗号です。ストリーム暗号では、平文の桁が一般に一度に一つずつ(多くはビットまたはバイト単位で)暗号化され、暗号化の挙動は内部の「状態」に依存して時間とともに変化します。このため別名で状態暗号と呼ばれることもあります。
仕組み
基本構成は次の通りです。
- 鍵(例:暗号鍵、多くの場合128ビットなど)と初期化ベクトル(IV/nonce)から内部状態を初期化する。
- 状態遷移により疑似ランダムなビット列(キーストリーム)を生成する。
- 生成したキーストリームと平文をxorして暗号文を得る(復号は同じ操作で平文を再生する)。
ストリーム暗号には大きく二つの方式があります。
- 同期型ストリーム暗号:送信側と受信側が同じキーストリーム位置を共有する想定で動作する。IV(nonce)を同期すれば同期が取れるが、パケットの欠落や再配列は別途対処が必要。
- 自己同期型(自動同期)ストリーム暗号:直近の暗号文ビット列の一部から状態を再構築するため、ある程度の誤り回復・再同期が可能。ただし設計が複雑になる。
ブロック暗号との違い
ブロック暗号は一定長のブロックを単位に処理するのに対して、ストリーム暗号は逐次的にデータを処理します。主な違いは以下の通りです。
- 処理単位:ブロック単位 vs ビット/バイト単位
- レイテンシ:ストリーム暗号は低遅延でリアルタイム処理に向く
- 性能と実装規模:ストリーム暗号は一般に軽量で高速、組み込み向けに適する
- 運用上の注意:ストリーム暗号は使用方法を誤るとブロック暗号以上に致命的な脆弱性を招く場合がある(特にキーストリームの再利用)
- なお、ブロック暗号を特定の動作モード(例:CTRモード)で使うと、実質的にストリーム暗号と同様の動作をする
例と実装
- 古典的な実装例:RC4(現在は脆弱性のため非推奨)
- 近年の代表例:Salsa20 / ChaCha20(高速で安全性が高く、ChaCha20-Poly1305はAEADとして広く使われる)
- ブロック暗号のストリーム化:AES-CTR や AES-CTR + MAC(ただしCTRのみでは整合性は保証されない)
安全性と代表的な攻撃
ストリーム暗号の主なリスクと攻撃手法:
- キーストリームの再利用(二重使用):同じ鍵とIVで生じた2つの暗号文をxorすると平文のxorが得られ、既知平文があれば他方の平文を復元できる(ワンタイムパッドの二重使用の致命的欠陥)。
- IV/nonceの管理不備:IVが再利用されるとキーストリーム再利用につながる。IVは鍵ごとに一意でなければならない。
- ビット反転攻撃(bit-flipping):xor特性により、暗号文のビットを反転させると復号時に対応する平文ビットが反転する。これを利用した改ざんが可能なので、整合性検査(MACやAE)を併用する必要がある。
- 初期出力バイアスや統計的弱点:一部の古いストリーム暗号(例:RC4)は初期出力に偏りがあり、統計解析で鍵が漏れる恐れがある。
- 状態漏洩・継続的侵害:内部状態が漏れると大量の過去・将来のデータが復号され得る。キー管理と再鍵化の方針が重要。
- 関連鍵攻撃、既知平文攻撃、区別攻撃:設計やパラメータ管理に問題があるとこうした高度な攻撃に弱くなる。
対策とベストプラクティス
- IV(nonce)は鍵ごとに必ず一意にする。可能ならランダムではなくカウンタや組み合わせで衝突を避ける。
- キーストリームの使用量に制限を設け、一定量を超えたら再鍵化する(長時間・大量データの同一鍵使用を避ける)。
- 整合性保護を必ず行う。単純なストリーム暗号だけでは改ざん検出が不能なため、MACを併用するか、AEAD(例:ChaCha20-Poly1305、AES-GCM)を使用する。
- 古いアルゴリズム(RC4等)は避け、現在推奨されている設計を採用する。
- 実装上の注意:初期出力の破棄(ドロップ)やサイドチャネル対策、乱数源の確保などを行う。
- プロトコル設計での明確な鍵/nonce管理と再同期手段の設計を行う。
用途
ストリーム暗号は以下のような場面で特に有用です。
- リアルタイム通信用(VoIP、ライブストリーミング)— 低遅延が要求される通信
- 組み込み機器やIoTデバイス— 計算資源やメモリが限られる環境
- 大規模なデータストリームの暗号化— ハードウェア実装で高スループットが得やすい
まとめ(要点)
- ストリーム暗号はキーストリームをxorで結合するシンプルで高速な方式だが、キーストリーム再利用や整合性欠如といった運用面のリスクに注意が必要。
- 安全に使うには「一意なIV管理」「整合性保護(AEAD)」および「推奨アルゴリズムの採用」が不可欠である。
- 近年はChaCha20-Poly1305のようなAEAD構成が実運用で広く採用されており、ストリーム処理の利点を享受しつつ安全性を確保できる。


携帯電話の会話の暗号化に用いられるLFSRベースのストリーム暗号A5/1における鍵ストリーム生成器の動作について説明する。
ストリーム暗号の種類
ストリーム暗号は、内部状態に基づいて鍵ストリームの連続した要素を生成します。この状態は 2 つの方法で更新されます。
- 平文や暗号文のメッセージとは独立して状態が変化する場合は、同期ストリーム暗号に分類される。
- 暗号文の桁数の前回の変化に基づいて状態が更新された場合、自己同期ストリーム暗号に分類される。
同期ストリーム暗号
同期ストリーム暗号では、平文と暗号文のメッセージから独立して擬似乱数桁のストリームを生成し、平文と組み合わせて(暗号化して)、または暗号文と組み合わせて(復号化して)暗号化します。最も一般的な形式では、2進数(ビット)が使用され、鍵ストリームは排他的または演算(XOR)を使用して平文と結合されます。これは二進加法ストリーム暗号と呼ばれています。
同期ストリーム暗号では、復号を成功させるためには送信者と受信者が同期していなければなりません。送信中にメッセージに桁が追加されたり削除されたりすると、同期が失われます。同期を回復するには、正しい復号を得るために様々なオフセットを系統的に試すことができます。もう一つの方法は、出力の規則的なポイントで暗号文にマーカーを付けることです。
しかし、送信中に桁が破損した場合は、追加や紛失ではなく、平文中の 1 桁だけが影響を受け、エラーはメッセージの他の部分に伝搬しません。この特性は、送信エラー率が高い場合に役立ちますが、さらなるメカニズムがなければエラーが検出される可能性が低くなります。さらに、この特性のため、同期ストリーム暗号は能動的な攻撃に非常に弱いです。攻撃者が暗号文中の桁を変更できれば、対応する平文のビットに予測可能な変更を加えることができるかもしれません。
自己同期ストリーム暗号
自己同期ストリーム暗号は、鍵ストリームを計算するために前の N 個の暗号文の桁数の一部を使用する別の技術です。このような方式は、非同期ストリーム暗号または暗号文オートキー(CTAK)としても知られています。自己同期のアイデアは1946年に特許を取得しており、N個の暗号文桁を受信した後に受信者が自動的に鍵ストリーム生成器と同期することで、桁が落ちたりメッセージストリームに追加されたりした場合に復旧が容易になるという利点があります。1 桁のエラーの影響は限定的で、N 個の平文桁までしか影響しません。自己同期ストリーム暗号に対して能動的な攻撃を実行するのは、同期暗号よりもやや困難である。
自己同期型ストリーム暗号の例として、暗号フィードバックモード(CFB)のブロック暗号がある。
リニアフィードバックシフトレジスタベースストリーム暗号
バイナリストリーム暗号は、ハードウェアに容易に実装でき、数学的に迅速に解析できるため、線形フィードバックシフトレジスタ(LFSR)を使用して構築されることが多い。しかし、LFSR を使用するだけでは、安全性を確保するには不十分です。LFSR の安全性を高めるために、さまざまなスキームが設計されてきました。
非線形結合関数
LFSR は本質的に線形であるため、線形性を除去するための 1 つの手法として、並列 LFSR のグループの出力を非線形ブール関数に入力して、組み合わせ生成器を形成することがあります。このような結合関数の様々な特性は、例えば相関攻撃を回避するためなど、結果として得られるスキームのセキュリティを確保するために重要です。
時計制御発電機
通常、LFSR は定期的にステッピングされます。非線形性を導入するための1つの手法は、第2のLFSRの出力によって制御されるLFSRを不規則にクロックさせることです。こ の よ う な発電機には、 ストップアンドゴー発電機、 交互ステップ発電機、 およびシュリンキング発電機があります。
ストップアンドゴージェネレーター(Beth and Piper, 1984)は、2つのLFSRで構成されています。1つのLFSRは、第2の出力が「1」の場合にクロックされ、そうでない場合には前の出力を繰り返します。この出力は、通常のレートでクロックされた第3のLFSRの出力と結合されます(一部のバージョンでは)。
シュリンキングジェネレーターは別の技術を使用します。2つのLFSRが使用され、両方とも以下の方法で定期的にクロックされます。
- 第1のLFSRの出力が「1」の場合、第2のLFSRの出力は発電機の出力となる。
- 第1のLFSRの出力が"0"の場合、第2のLFSRの出力は破棄され、ジェネレータからは何ビットも出力されない。
この手法は、出力の速度が第2のジェネレータの状態に依存して可変であるため、第2のジェネレータのタイミング攻撃に悩まされます。これは、出力をバッファリングすることで改善できます。
フィルタージェネレーター
LFSR のセキュリティを向上させる別のアプローチは、単一の LFSR の全状態を非線形フィルタリング関数に渡すことです。
その他のデザイン
線形駆動装置の代わりに、非線形更新関数を使用してもよい。例えば、KlimovとShamirは、nビットのワード上の1サイクルを有する三角関数(T関数)を提案した。
セキュリティ
安全であるためには、キーストリームの周期(ストリームがそれ自体を繰り返す前に出力される桁数)が十分に大きくなければならない。シーケンスが繰り返される場合、重なり合う暗号文を「深さ方向」で互いに整列させることができ、これらの方法で生成された平文形式の暗号文を抽出することができる技術がある。
使用方法
ストリーム暗号は、安全な無線接続のように平文が未知の長さで来るアプリケーションでよく使用されます。ブロック暗号がこの種のアプリケーションで使用される場合、ブロック暗号はブロックサイズよりも短いブロックでは直接動作しないため、設計者は伝送効率と実装の複雑さのどちらかを選択する必要があります。例えば、128 ビットのブロック暗号が 32 ビットの平文バーストを別々に受信した場合、送信データの 4 分の 3 をパディングする必要があります。ブロック暗号はパディングを避けるために暗号文盗用モードまたは残余ブロック終端モードで使用する必要がありますが、ストリーム暗号は最小の送信単位(通常はバイト)で動作することでこの問題を排除します。
軍事暗号におけるストリーム暗号のもう一つの利点は、暗号ストリームが、厳格なセキュリティ対策の対象となる暗号化装置によって生成され、その後、他の装置、例えば、無線セットに供給され、その機能の一部としてxor操作を実行することができることである。他のデバイスは、あまり安全ではない環境で使用するために設計することができます。
RC4 はソフトウェアで最も広く使われているストリーム暗号です。他には、A5/1、A5/2、カメレオン、FISH、Helix、ISAAC、MUGI、パナマ、Phelix、Pike、SEAL、SOBER、SOBER-128、WAKEなどがあります。


RC4 は、最も広く使われているストリーム暗号設計の一つです。
ストリーム暗号の比較
ストリーム | 創作 | 速度 | ビット | 攻撃 | |||
効果的な | 初期化ベクトル | 内部 | 最もよく知られている | 計算 | |||
A5/1 | 1989 | 音声(Wフォン | 54 | 114 | 64 | アクティブKPA OR | ~2秒程度 OR239.91 |
A5/2 | 1989 | 音声(Wフォン | 54 | 114 | 64? | アクティブ | 4.6 ミリ秒 |
フィッシュ | 1993 | かなり速い(Wsoft | 巨大な | ? | ? | 既知の平文攻撃 | 211 |
穀物 | 2004年以前 | ファスト | 80 | 64 | 160 | キーディリビジョン | 243 |
HC-256 | 2004年以前 | 4 (WP4) | 256 | 256 | 65536 | ? | ? |
アイザック | 1996 | 2.375 (W64-bit) - | 8-8288 | 該当なし | 8288 | (2006) 一回戦 | 4.67×101240 (2001) |
むぎ | 1998-2002 | ? | 128 | 128 | 1216 | 該当なし (2002年) | ~282 |
パナマ | 1998 | 2 | 256 | 128? | 1216? | ハッシュ・コリジョン (2001) | 282 |
フェリックス | 2004年以前 | 最大8 (Wx86) | 256 + 128ビットNonce | 128? | ? | ディファレンシャル (2006) | 237 |
パイク | 1994 | 0.9 x FISH (Wsoft) | 巨大な | ? | ? | 該当なし (2004年) | 該当なし (2004年) |
パイ | 2004年以前 | 2.6 | 8-2048? | 64 | 8320 | 暗号理論 (2006) | 275 |
うさぎ | 2003年2月 | 3.7(WP3)-9.7(WARM7) | 128 | 64 | 512 | 該当なし (2006年) | 該当なし (2006年) |
1987 | 印象的な | 8-2048 | 8 | 2064 | シャミール イニシャル・バイト・キー・デリベーション OR KPA | 213 OR 233 | |
サルサ20 | 2004年以前 | 4.24 (WG4) - | 128 + 64ビットNonce | 512 | 512 + 384 (キー+IV+インデックス) | ディファレンシャル (2005年) | 該当なし (2005年) |
スクリーム | 2002 | 4 - 5 (Wsoft) | 128 + 128ビットNonce | 32? | 64ビット丸関数 | ? | ? |
シール | 1997 | 非常に高速(W32ビット | ? | 32? | ? | ? | ? |
雪 | 2003年以前 | 非常に良い (W32ビット) | 128 OR 256 | 32 | ? | ? | ? |
ソバー128 | 2003 | ? | 128まで | ? | ? | メッセージフォージ | 2−6 |
ソセマヌク | 2004年以前 | 非常に良い (W32ビット) | 128 | 128 | ? | ? | ? |
トリビウム | 2004年以前 | 4 (Wx86) - 8 (WLG) | 80 | 80 | 288 | ブルートフォースアタック (2006) | 2135 |
チューリング | 2000-2003 | 5.5 (Wx86) | ? | 160 | ? | ? | ? |
ベスト | 2005 | 42 (WASIC) - | 可変的 | 可変的 | 256 - 800 | 該当なし (2006年) | 該当なし (2006年) |
ウェイク | 1993 | ファスト | ? | ? | 8192 | CPA&CCA | 脆弱 |
ストリーム | 創作 | 速度 | ビット | 攻撃 | |||
効果的な | 初期化ベクトル | 内部 | 最もよく知られている | 計算 |
関連ページ
- イーストリーム
質問と回答
Q: ストリーム暗号とは何ですか?
A:ストリーム暗号とは、平文ビットと擬似ランダム暗号ビットストリーム(鍵ストリーム)を排他的論理和(xor)演算で結合する対称鍵暗号です。
Q: ブロック暗号とどう違うのですか?
A:ストリーム暗号は通常、ブロック暗号よりも高速で実行され、ハードウェア要件も低くなります。ブロック暗号は固定長の大きなブロックに対して動作しますが、ストリーム暗号は1桁ずつ暗号化し、連続する桁の変換は暗号化状態の間に変化します。
Q:どのような鍵を使用するのですか?
A: ストリーム暗号は、128ビットの鍵など、より小さく便利な暗号鍵を使用します。
Q: キーストリームはどのように生成されるのですか?
A:キーストリームは、ワンタイムパッド暗号アルゴリズムと同様に、使用される暗号鍵に基づいて生成されます。ただし、キーストリームは擬似ランダムであり、真のランダムではないため、ワンタイムパッドのようなセキュリティは適用できません。
Q:なぜ同じ開始状態を2度使ってはいけないのですか?
A: 同じ開始状態を2回使用すると、攻撃者が暗号鍵を知らずに、あるいは暗号鍵にアクセスすることなくデータを解読することが容易になるため、深刻なセキュリティ問題に発展することがあります。
Q: ストリーム暗号を使用することにリスクはありますか?
A: はい、適切な予防措置をとらずに使用した場合、ストリーム暗号の使用にはリスクが伴います。