
ストリーム暗号は、平文の数字と擬似乱数暗号数字ストリーム(キーストリーム)を組み合わせる対称鍵暗号です。ストリーム暗号では、各平文の数字がキーストリームの対応する数字で一度に1つずつ暗号化され、暗号文ストリームの1つの数字が生成されます。各数字の暗号化は暗号の現在の状態に依存するため、状態暗号とも呼ばれます。実際には、数字は通常1ビットであり、組み合わせ演算は排他的論理和(XOR)です。
擬似乱数キーストリームは通常、デジタルシフトレジスタを使用して乱数シード値からシリアルに生成されます。シード値は、暗号文ストリームを復号するための暗号鍵として機能します。ストリーム暗号は、ブロック暗号とは異なる対称暗号化のアプローチです。ブロック暗号は、固定された不変の変換を使用して、大きな数字ブロックに対して動作します。この区別は必ずしも明確ではありません。動作モードによっては、ブロック暗号プリミティブがストリーム暗号として機能させる方法で使用されることがあります。ストリーム暗号は通常、ブロック暗号よりも高速に実行され、ハードウェアの複雑さが低くなります。ただし、ストリーム暗号はセキュリティ侵害を受けやすい場合があります(ストリーム暗号攻撃を参照)。たとえば、同じ開始状態(シード)が2回使用される場合などです。
ストリーム暗号は、証明済みの破られない暗号であるワンタイムパッド(OTP)の動作を近似するものと見なすことができます。ワンタイムパッドは、完全にランダムな数字のキーストリームを使用します。キーストリームは、平文の数字と1つずつ組み合わされて暗号文を形成します。このシステムは、1949年にクロード・E・シャノンによって安全であることが証明されました。 [ 1 ]ただし、キーストリームは、平文と同じ長さ以上で完全にランダムに生成する必要があり、複数回使用することはできません。このため、多くの実用的なアプリケーションでこのシステムを実装するのは面倒になり、結果として、最も重要なアプリケーションを除いて、ワンタイムパッドは広く使用されていません。鍵の生成、配布、管理は、これらのアプリケーションにとって重要です。
ストリーム暗号は、128ビットなどのはるかに小さく便利な鍵を使用します。この鍵に基づいて擬似乱数キーストリームを生成し、ワンタイムパッドと同様の方法で平文の数字と組み合わせることができます。ただし、これには代償が伴います。キーストリームは擬似乱数であるため、真の乱数ではありません。ワンタイムパッドに関連付けられたセキュリティ証明はもはや有効ではありません。ストリーム暗号が完全に安全でない可能性は十分にあります。[ 2 ]
ストリーム暗号は、内部状態に基づいてキーストリームの要素を順次生成します。この状態は基本的に2つの方法で更新されます。状態が平文や暗号文メッセージとは独立して変化する場合、その暗号は同期ストリーム暗号に分類されます。一方、自己同期ストリーム暗号は、以前の平文または暗号文の数字に基づいて状態を更新します。平文を鍵に組み込むシステムは、オートキー暗号またはオートクレーブ暗号とも呼ばれます。

同期ストリーム暗号では、擬似乱数列が平文と暗号文とは独立して生成され、その後、平文(暗号化の場合)または暗号文(復号の場合)と組み合わされます。最も一般的な形式では、バイナリ数字(ビット)が使用され、キーストリームは排他的論理和(XOR)演算を使用して平文と組み合わされます。これはバイナリ加算ストリーム暗号と呼ばれます。
同期ストリーム暗号では、復号を成功させるには送信者と受信者の同期が完全に取れている必要があります。送信中にメッセージに数字が追加または削除されると、同期が失われます。同期を回復するには、さまざまなオフセットを系統的に試行して正しい復号結果を得ることができます。別の方法としては、出力の一定箇所にマーカーを付加して暗号文にタグ付けする方法があります。
しかし、伝送中に数字が追加されたり失われたりするのではなく、破損した場合、平文の1桁だけが影響を受け、エラーはメッセージの他の部分には伝播しません。この特性は、伝送エラー率が高い場合に有効ですが、追加のメカニズムなしではエラーが検出されにくくなります。さらに、この特性のため、同期ストリーム暗号はアクティブ攻撃に対して非常に脆弱です。攻撃者が暗号文の数字を変更できる場合、対応する平文のビットに予測可能な変更を加えることができる可能性があります。たとえば、暗号文のビットを反転すると、平文の同じビットも反転します。
別のアプローチでは、前のN桁の暗号文のいくつかの桁を使用してキーストリームを計算します。このような方式は、自己同期ストリーム暗号、非同期ストリーム暗号、または暗号文自動鍵( CTAK ) として知られています。自己同期のアイデアは 1946 年に特許を取得しており、受信側がN桁の暗号文を受信した後にキーストリーム生成器と自動的に同期するという利点があります。これにより、メッセージ ストリームに桁が欠落したり追加されたりした場合でも、復元が容易になります。1 桁のエラーの影響は限定的で、最大でN桁の平文にしか影響しません。
バイナリストリーム暗号は、ハードウェアでの実装が容易で、数学的な解析も容易であることから、線形フィードバックシフトレジスタ(LFSR)を用いて構築されることが多い。しかし、LFSRのみを使用するだけでは、十分なセキュリティを確保するには不十分である。LFSRのセキュリティを向上させるために、様々な方式が提案されている。

LFSRは本質的に線形であるため、線形性を除去する手法の一つとして、複数の並列LFSRの出力を非線形ブール関数に入力して組み合わせ生成器を形成する方法がある。このような組み合わせ関数の様々な特性は、例えば相関攻撃を回避するなど、結果として得られるスキームのセキュリティを確保する上で非常に重要となる。
通常、LFSRは規則的にステップ状に動作します。非線形性を導入する一つの方法は、別のLFSRの出力によって制御される不規則なクロックをLFSRに与えることです。このようなジェネレータには、ストップアンドゴージェネレータ、交互ステップジェネレータ、シュリンキングジェネレータなどがあります。
交互ステップジェネレータは、便宜上LFSR0、LFSR1、LFSR2と呼ぶ3つのLFSRで構成されます。いずれかのレジスタの出力によって、他の2つのレジスタのうちどちらを使用するかが決まります。例えば、LFSR2が0を出力した場合、LFSR0がクロックされ、1を出力した場合、代わりにLFSR1がクロックされます。出力は、LFSR0とLFSR1によって生成された最後のビットの排他的論理和です。3つのLFSRの初期状態が鍵となります。
ストップアンドゴージェネレータ(BethとPiper、1984)は、2つのLFSRで構成されています。一方のLFSRの出力が1の場合、もう一方のLFSRがクロックされ、そうでない場合は前の出力を繰り返します。この出力は(一部のバージョンでは)一定のクロックレートでクロックされる3番目のLFSRの出力と合成されます。
縮小ジェネレータは異なるアプローチを採用しています。2つのLFSRが使用され、両方とも定期的にクロックされます。最初のLFSRの出力が1の場合、2番目のLFSRの出力がジェネレータの出力になります。しかし、最初のLFSRの出力が0の場合、2番目のLFSRの出力は破棄され、ジェネレータからはビットが出力されません。このメカニズムは、出力速度が2番目のジェネレータの状態に応じて変化するため、2番目のジェネレータに対するタイミング攻撃の影響を受けやすいという問題があります。これは、出力をバッファリングすることで軽減できます。
LFSRのセキュリティを向上させるもう1つの方法は、単一のLFSRの全状態を非線形フィルタリング関数に渡すことです。

線形駆動装置の代わりに、非線形更新関数を用いることもできる。例えば、KlimovとShamirは、nビットワードに対して単一サイクルを持つ三角関数( T関数)を提案した。
ストリーム暗号が安全であるためには、そのキーストリームの周期が長くなければならず、キーストリームから暗号の鍵や内部状態を復元することは不可能でなければなりません。暗号学者はまた、攻撃者がストリームをランダムノイズと区別できるような微妙な偏りさえもキーストリームに存在せず、関連する鍵や関連する暗号的ナンスに対応するキーストリーム間の検出可能な関係も存在しないことを要求します。これは、攻撃者が平文や暗号文の一部を知っているか選択できる場合でも、すべての鍵について当てはまるはずです(弱い鍵があってはなりません)。
暗号における他の攻撃と同様に、ストリーム暗号攻撃は認証攻撃となる可能性があり、必ずしも暗号を破る実用的な方法ではないが、暗号に他の弱点がある可能性を示唆する。
安全な同期ストリーム暗号を安全に利用するには、同じキーストリームを二度と再利用してはなりません。これは一般的に、暗号を呼び出すたびに異なるノンスまたはキーを指定する必要があることを意味します。また、アプリケーション設計者は、ほとんどのストリーム暗号は認証ではなくプライバシーを提供するものであることを認識する必要があります。つまり、暗号化されたメッセージは転送中に改ざんされている可能性があるということです。
ストリーム暗号の周期が短いことは、実用上の懸念事項でした。例えば、DESのような64ビットブロック暗号は、出力フィードバック(OFB)モードでキーストリームを生成するために使用できます。しかし、完全なフィードバックを使用しない場合、生成されるストリームの周期は平均して約2 32ブロックになります。多くのアプリケーションにとって、この周期は短すぎます。例えば、暗号化を毎秒8メガバイトの速度で実行する場合、周期2 32ブロックのストリームは約1時間後に繰り返されます。
ストリーム暗号RC4を使用する一部のアプリケーションは、RC4の鍵設定ルーチンの脆弱性のために攻撃を受ける可能性があります。新しいアプリケーションでは、RC4の使用を避けるか、すべての鍵が一意であり、理想的には互いに無関係であること(適切なシードを持つCSPRNGや暗号学的ハッシュ関数によって生成されるなど)を確認し、キーストリームの最初のバイトを破棄する必要があります。
ストリーム暗号の構成要素は、ブロック暗号よりも理解しやすいことが多く、そのため、偶発的または悪意のある脆弱性を隠蔽する可能性が低い。
ストリーム暗号は、その速度とハードウェア実装の容易さから、また、安全な無線接続のように平文の長さが不明なアプリケーションでよく使用されます。ブロック暗号(ストリーム暗号モードで動作しない)をこの種のアプリケーションで使用する場合、ブロック暗号はブロックサイズより短いブロックを直接処理できないため、設計者は伝送効率か実装の複雑さのどちらかを選択する必要があります。たとえば、128ビットのブロック暗号が32ビットの平文のバーストを個別に受信した場合、送信されるデータの4分の3はパディングになります。ブロック暗号は、パディングを回避するために暗号文スティーリングモードまたは残余ブロック終端モードで使用する必要がありますが、ストリーム暗号は送信可能な最小単位(通常はバイト)で自然に動作するため、この問題を解消します。
軍事暗号におけるストリーム暗号のもう一つの利点は、暗号ストリームを厳格なセキュリティ対策が施された別の装置で生成し、無線機などの他の装置に供給できることである。無線機は、その機能の一部としてXOR演算を実行する。後者の装置は、より緩やかなセキュリティ環境で設計・使用できる。
ChaChaはソフトウェアで最も広く使用されているストリーム暗号になりつつあります。[ 3 ]その他には、 RC4、 A5/1、 A5/2、 Chameleon、 FISH、 Helix、 ISAAC、 MUGI、 Panama、 Phelix、 Pike、 Salsa20、 SEAL、 SOBER、 SOBER-128、 WAKEなどがあります。
ストリーム暗号の中には、特定の国で開発されたものや、特定の国または国際規格で義務付けられているものがあります。代表的な例としては、ZUC(中国)、SNOW /SNOW 3G(スウェーデン、5G暗号化用の3GPP規格でZUCと併用)、A5/1およびA5/2アルゴリズム( ETSIがGSM向けに設計)などが挙げられます。eSTREAMポートフォリオの最終候補にも、 Grain(スウェーデン)、Trivium(ベルギー)、Rabbit(デンマーク)など、特定の国で開発されたものがあります。
{{cite book}}: CS1メンテナンス: 場所の発行元が見つかりません (リンク)