ストリーム暗号

ストリーム暗号は、平文ビット単位またはバイト単位で逐次的に暗号化する方式です。これは、平文を固定長のブロックに分割して暗号化するブロック暗号とは対照的です。ストリーム暗号の主な特徴は、入力データが逐次的に追加される場合でも、ブロックサイズに達するまで待つ必要がないため、リアルタイムでの暗号化処理に適している点です。

ストリーム暗号の構造


ストリーム暗号は、主に以下の二つの部分から構成されます。

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モードで使用する場合、ブロック暗号が擬似ランダム関数とみなせれば、計算量的な安全性が保証されます。

歴史


ストリーム暗号の基本的な構造は、バーナム暗号に類似していますが、バーナム暗号は乱数列の生成方法を明確に定義していませんでした。自己同期式のストリーム暗号は、ブレーズ・ド・ヴィジュネルによって考案されています。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。