ストリーム
暗号は、
平文を
ビット単位またはバイト単位で逐次的に
暗号化する方式です。これは、
平文を固定長のブロックに分割して
暗号化するブロック
暗号とは対照的です。ストリーム
暗号の主な特徴は、入力データが逐次的に追加される場合でも、ブロックサイズに達するまで待つ必要がないため、リアルタイムでの
暗号化処理に適している点です。
ストリーム暗号の構造
ストリーム
暗号は、主に以下の二つの部分から構成されます。
1.
鍵ストリーム生成部:秘密鍵に基づいて
擬似乱数列(鍵ストリーム)を生成します。
2.
結合部:生成された鍵ストリームと
平文を結合し、
暗号文を生成します。
一般的に、共通鍵方式では、鍵を初期値として
擬似乱数列を生成し、
平文との排他的論理和(XOR)演算によって
暗号文を作成します。復号時には、同じ鍵から生成された
擬似乱数列と
暗号文とのXOR演算を行うことで
平文を得ます。この方式の利点は、高速な処理が可能であり、
平文のサイズと
暗号文のサイズが常に等しくなることです。また、ブロック
暗号のように
平文のサイズをブロックサイズの整数倍にするためのパディング処理が不要です。
ストリーム
暗号は、
擬似乱数を事前に生成できるため、待ち時間が少なく、データの遅延を最小限に抑えられます。しかし、ストリーム
暗号の安全性は、使用する
擬似乱数生成器の安全性に依存します。近年では、AESなどのブロック
暗号をOFB、CFB、CTRモードで使用することで、ストリーム
暗号を構成することも可能です。このため、ストリーム
暗号専用のアルゴリズムは、ブロック
暗号と比較して何らかの点で優位性を示す必要があります。
実装上の注意点
ソフトウェアでのストリーム
暗号の実装においては、1
ビットや1バイト単位で処理すると性能が低下しがちです。そのため、一度に複数
ビットをまとめて処理するよう最適化されることがあります。MUGIのように、一度の処理で64
ビットの鍵ストリームを出力するアルゴリズムは、効率的な
暗号化処理を実現できます。
ストリーム暗号の安全性
ストリーム
暗号の安全性に関する研究は、ブロック
暗号に比べて遅れている側面があります。安全性の評価手法の研究には時間を要するため、ブロック
暗号に基づくストリーム
暗号の使用が推奨されることもあります。ブロック
暗号をCTRモードで使用した場合、そのブロック
暗号が擬似ランダム置換であれば、計算量的に安全であるとされています。
鍵ストリーム生成部
鍵ストリーム生成部は、128
ビット程度の秘密鍵を用いて
擬似乱数を生成します。ストリーム
暗号は通常、共通鍵方式ですが、非対称鍵方式のストリーム
暗号も提案されています。また、
擬似乱数ではなく真の乱数を使用する場合もあります。
鍵ストリームの再利用は危険なため、
平文ごとに異なる初期値(初期化ベクトル、IV)を使用する必要があります。IVは乱数またはカウンタを用いて生成します。
鍵ストリーム生成の方法には、専用のアルゴリズムを使用する方法と、ブロック
暗号を基にした方法があります。専用アルゴリズムは、フィードバック
シフトレジスタに基づくものが一般的です。
同期式と非同期式
ストリーム
暗号には、同期式と非同期式の2つの方式があります。
同期式(外部同期):送信側と受信側で独立して鍵ストリームを生成します。ビット誤りが他のビットに影響を与えないというメリットがありますが、攻撃者が暗号文を操作することで平文を変更できる可能性があります。また、同期がずれた場合には再同期が必要です。
非同期式(自己同期):
暗号文を鍵ストリームにフィードバックします。同期がずれても自動的に再同期できるメリットがありますが、
ビット誤りが拡大する可能性があります。CFBモードがこの方式の例です。
結合部
結合部では、
平文と鍵ストリームを結合しますが、一般的にはXOR演算が用いられます。理論的には、可逆的な関数であればXOR以外でも構いませんが、
暗号強度に大きな変化はないため、XORが広く使用されています。
ストリーム暗号の種類
ストリーム
暗号は、
擬似乱数列生成器の種類によって分類できます。
LFSR(線形帰還シフトレジスタ):ハードウェアでの実装が容易ですが、数学的に解析可能であるため、そのまま暗号に使用することは推奨されません。相関攻撃に弱いです。非線形FSR(NFSR)を使用する場合もあります。
コンバイナ型:複数のLFSRを非線形関数で結合します。
フィルタ型:LFSRの全状態をフィルタに入れます。
クロック制御型:LFSRを非連続的に動作させます。
ストリーム暗号用に設計されたもの:RC4、SEAL、Salsa20、ChaCha20などがあります。
暗号論的擬似乱数生成器:一般的な
暗号論的
擬似乱数列生成器が使用されることもあります。
カオス:カオス理論に基づく擬似乱数生成器も提案されています。
用途
ストリーム暗号は、平文の発生タイミングが不確実なアプリケーションに適しています。例えば、音声暗号化などの秘匿通信で広く利用されています。また、ウェブブラウザで使用される暗号化通信SSLや無線LAN (WEP, WPA) などでも利用されています。
標準
ストリーム暗号は、以下の標準で採用または推奨されています。
OFB, CFB, CTR -
ISO/IEC 18033|ISO_IEC 18033(ブロック
暗号利用モード)
SNOW 2.0 - ISO/IEC 18033|ISO_IEC 18033
MUGI -
ISO/IEC 18033|ISO_IEC 18033, CRYPTREC
MULTI-SO1 - ISO/IEC 18033|ISO_IEC 18033 (MOF), CRYPTREC
RC4 - RFC 2246 (TLS), WEP, WPA, CRYPTREC (128bit-RC4 only)
KCipher-2 - ISO/IEC 18033|ISO_IEC 18033, CRYPTREC
ChaCha20 - RFC 7539
安全性に関する注意点
ストリーム
暗号は、鍵ストリームの重複使用を避けることが非常に重要です。鍵ストリームを重複して使用すると、
暗号文から
平文の一部または全体が漏洩する可能性があります。これは、鍵ストリームが推測不可能な乱数列であることを前提としているためです。初期化ベクトル(IV)が重複した場合、鍵ストリームも重複使用されることになり、セキュリティ上のリスクが高まります。
ストリーム暗号の安全性の条件
ストリーム
暗号の安全性を確保するためには、以下の条件を満たす必要があります。
1.
統計的乱数性:生成される鍵ストリームが統計的に乱数に近いこと。
2.
非線形性:線形解析に対する耐性があること。
3.
無相関性:鍵ストリームの各
ビット間に相関がないこと。
4.
長周期性:鍵ストリームの周期が十分に長いこと。
5.
線形複雑度:鍵ストリームの複雑度が高いこと。
鍵ストリーム生成部のレジスタ長と秘密鍵の長さは、安全性の限界を決定する重要な要素です。
安全性の根拠
ストリーム
暗号の安全性は、以下のような根拠に基づいています。
ワンタイムパッド:真の乱数を使用し、一度使用した乱数列を再利用しない場合、情報理論的に安全です。しかし、乱数列の共有が現実的でないため、広く採用されていません。
ブロック暗号:鍵ストリーム生成部にブロック
暗号を使用し、ブロック
暗号の安全性に帰着させることができます。
*
CTRモード:ブロック
暗号をCTRモードで使用する場合、ブロック
暗号が擬似ランダム関数とみなせれば、計算量的な安全性が保証されます。
歴史
ストリーム
暗号の基本的な構造は、バーナム
暗号に類似していますが、バーナム
暗号は乱数列の生成方法を明確に定義していませんでした。自己同期式のストリーム
暗号は、ブレーズ・ド・ヴィジュネルによって考案されています。