対称暗号における操作モードの動機#
対称暗号アルゴリズム(例えば AES)は、暗号化と復号化のプロセスで同じ鍵 key を使用します。本自体は固定サイズのデータブロックを安全に暗号化することしかできません。任意の長さのメッセージを暗号化するためには、これらの基本アルゴリズムを特定の操作モードで適用する必要があります。
- ブロック暗号は N ビットの情報を暗号化できます。N の整数倍でない場合、固定長でない場合、または TCP ストリームのような場合はどうでしょうか?
- 操作モードは、ブロック暗号を使用して柔軟なデータ量を暗号化するための異なる方法を提供します。
! CBC と CTR は IND-CPA に適合します
決定性と完全性?#
Deterministic 決定性:同じ平文ブロックは同じ暗号文ブロックを生成します。
Integrity 完全性:データが転送または保存中に改ざんされていないことを保証する特性。CTR はそうではありません。なぜなら、CTR モードは暗号化機能しか提供せず、データが変更されていないことを検証するメカニズムを含まないため、完全性チェックを提供しません。
ECB(電子暗号本 Electronic Code Book)モード:#
長い情報を暗号化するための最も単純なモードで、メッセージをブロックに分割して独立して暗号化します。その主な欠点は、同じ方法で暗号化されるため(Key k は変わらず)、同じ平文ブロックは同じ暗号文ブロックを生成し(これが決定性です)、情報が漏洩しやすいことです。使用は推奨されません。
- 最後のブロックにパディングが必要な場合があります。
- パディングはエラーが発生しやすく、慎重に扱う必要があります。ブロック内に少しでもエラーがあれば、全体のブロックの復号が間違ってしまいます。
- 暗号化は並行して行うことができます。
- 暗号化は決定的であり、完全性はありません。
- 使用は非常に少なく、高エントロピー平文空間に対する検索可能な暗号化の特例があります。
破壊?#
- パスワードリストを作成し、弱いパスワードは簡単に破られます。
- パスワードが変わらず、再度現れると認識されます(置換のように)。
CBC(暗号ブロック連鎖 Cipher Block Chaining)モード#
各ブロックを暗号化する前に、前の暗号文ブロックと XOR 操作を行います(完全なブロックでなければならず、パディングを考慮する必要があります)。これにはプロセスを開始するための初期ベクトル(IV)が必要です。これによりセキュリティが強化されますが、予測可能な IV などの潜在的な問題が依然として存在します。
- IV は均等にランダムでなければならず、そうでないと攻撃を引き起こす可能性があります。
- 決定性はなく、完全性もありません。
- 完全なブロック N の倍数でなければならず、パディングを考慮する必要がありますが、N が小さすぎると問題が発生します。
- 異なる鍵を使用する必要があります。同じ鍵で複数回暗号化された暗号文ブロックは衝突を引き起こし、Pj が知られていれば Pi を復元できることになります。以下のように推論できます。
CTR(カウンター Counter)モード#
暗号化アルゴリズムをストリーム暗号器に変換します。メッセージを直接暗号化するのではなく、カウンター(異なる値を割り当てる)を暗号化し、出力を平文と XOR 操作します。これにより、高い柔軟性と並行処理能力が提供されます。
- 増加するカウンター ctr を使用して擬似ランダム出力ブロックを生成します(ビット列 ctr を整数として扱い、加算 mod 2^n)。
- 並行して実行できます。
- 平文を知らない状態で暗号化マスク Ri を事前に計算できます。
- 速い:ブロック暗号は通常、専用のストリーム暗号設計よりも遅いです。
- 完全性はありません、すべてのストリーム暗号がそうです。
- 決定的です。
- パディングは不要です。最後の出力ブロック rN は正確な長さ pN に切り詰めることができます。
- 通常、ctr を暗号文の一部として送信します。復号プロセスが他の方法で ctr を復元できる場合、ctr を省略できます。
- 暗号化には Enc を使用し、復号にも Enc を使用します:
- したがって、Dec を実装する必要はありません - 実際、Enc は可逆である必要はありません!
- 技術的には、CTR モードは擬似ランダム関数メソッドを使用でき、擬似ランダム排列ではありません。
キー要件#
鍵の安全要件:固定の鍵 k に対して、すべての使用されるカウンター値(すべての暗号化で)は異なる必要があります。
- カウンターが重複すると、暗号文ブロックの XOR が平文ブロックの XOR を生成します。
- ストリーム暗号のワンタイムパッド / キー流の再利用問題に似ています。
エラー伝播#
- 暗号文ビットの反転は、平文ビットの反転を引き起こす可能性があります。
ステップ#
異なるカウンター(ctr)値を使用して暗号化のユニーク性を確保する方法は以下の通りです:
- 毎回暗号化する際に ctr を 0 から開始し、鍵を変更します(コストが高い)。
- 毎回ランダムな ctr から開始します(衝突を防ぐために鍵の使用を制御する必要があります)。
- 最後に使用した ctr 値を記録し、次回は 1 加算して使用します(状態を維持する必要があります)。
- ctr はアプリケーションが提供する固定サイズのランダム数(nonce N)と内部カウンターで構成され、毎回暗号化する際に 0 からカウントを開始します(nonce の重複を防ぎ、内部カウンターのオーバーフローを防ぐために平文のサイズを制限します)。
この方法は GCM モードに使用されます(以下のように)。
GCM(ガロア / カウンターモード)#
CTR の変種で、データの完全性検証機能が追加されています。これは、TLS プロトコルなどのネットワークデータを保護するために広く使用されています。
- GCM は、各暗号化および検証データブロックに対して 1 回のブロック暗号運算と 1 回の 128 ビットの乗算運算を要求します。
- 決定的です。
- 各ブロック暗号操作は並行化可能です。
- 暗号化と検証が無関係であるため、ソフトウェア実装は重複した検証と暗号化を通じて速度を向上させることができます。
対称暗号の IND-CPA 安全性#
IND-CPA は、対称暗号アルゴリズムの安全性を考える上での重要な基準であり、通常はランダム性を導入することで実現されます(例えば、毎回異なる初期化ベクトル IV を使用するなど)。
四要素:KeyGen,Enc,Dec,Correctness#
- KeyGen: 均等にランダム
- Enc: key K + plaintext M → output C
- 一般的にはランダムです(CBC、CTR のように)。
- 後の Enc には追加の入力がある場合がありますが、決定性を持つ必要があります。
- Dec: key K + ciphertext C → output M or error
- 決定性があると仮定し、暗号化可能な最大平文長を L とすると、M は {0,1}≤L に属します。
- Correctness: すべての k に対して求めます。
- K は鍵空間、M はメッセージ空間、C は暗号文空間です。
- 暗号文は通常平文よりも長いですが、できるだけ短くし、拡張を減らします。
IND 不可区別性 Indistinguishable#
これは安全属性であり、2 つの異なる平文が与えられた場合、暗号化アルゴリズムが生成する暗号文は攻撃者がどの暗号文がどの平文に対応するかを判断できないことを指します(セマンティックセキュリティ)。理想的には、攻撃者が平文を知っているか選択できる場合でも、暗号文から有用な情報を取得できないはずです。
CPA 選択平文攻撃 Chosen Plaintext Attack#
これは攻撃モデルであり、攻撃者は任意の数の平文を選択し、それらの暗号文を取得できます。攻撃者の目標は、これらの情報を利用して暗号化アルゴリズムを破り、鍵を取得するか、他の暗号文を復号することです。
属性#
- IND-CPA 安全性は情報回復攻撃を捉えることができます:c から m を復元できる攻撃者は、IND-CPA 安全性を破る攻撃者に変換できます。
- IND-CPA 安全性は鍵回復攻撃を捉えることができます:いくつかの鍵対(m, c)が与えられれば、鍵 k を復元できる攻撃者は IND-CPA 安全性を破る攻撃者に変換できます。
- IND-CPA 安全性は平文の各ビットが隠されることを保証します。
- CBC モードや CTR モードなどのスキームを使用する場合、良好なブロック暗号を使用すれば、IND-CPA 安全性の定義に適合することが証明できます。
どうやって推測する?#
パディングとパディングオラクル攻撃#
なぜパディング?#
平文の長さが暗号化アルゴリズムに必要な固定ブロックサイズに合致するようにし、ブロック暗号化中に平文の長さが不足する問題を防ぐためです。
- CBC モードの場合、パディング - 暗号化 - パディングの削除。
- しかし、攻撃を受けやすく、MAC を通じて完全性を実現して変更された暗号文を検出することができます。MAC は暗号化スキームと組み合わせる必要があります。
- ランダムであっても、決定的であっても構いません。
- N の倍数のビット列である必要があります。
- 拡張可能です。
AES のパディングに関する簡単な例#
AES アルゴリズムの場合、N = 128 ビット、つまり N/8 = 16 バイトです。したがって、メッセージに追加される可能性のあるパディング文字列(バイト形式)は 0x01 から 0x0F までで、必要なパディングバイト数に応じて異なります。例えば、次の 128 ビット境界に達するために 5 バイトのパディングが必要な場合、各パディングバイトの値は 0x04 になります。なぜなら、0x04 は 16 進数で 5 から 1 を引いた値だからです。
パディング要件#
少なくとも 1 バイトのパディングを追加する: パディングメカニズムが復号時に識別され、削除されるようにするために、メッセージの長さが暗号化アルゴリズムに必要なブロックサイズの倍数であっても、少なくとも 1 バイトのパディングを追加する必要があります。
メッセージの長さは N ビットの整数倍である必要があります:パディングのみを含む新しい完全なブロックが追加されます。
安全性の結果:パディングは、パディング予測攻撃(Padding Oracle Attack)などの安全リスクを引き起こす可能性があります。
エラー伝播#
対称暗号において、1 つのエラーのある暗号文ブロックは、復号時にそのブロックが完全に間違ってしまい、次のブロックの一部にも影響を与えます。なぜなら、エラーが復号操作の中で伝播するからです。
全平文復元攻撃 full plaintext recovery attack#
全平文復元の目標は、暗号文から平文情報を復元することであり、必ずしも鍵を復元する必要はありません。単に 1 つまたは複数の暗号文を復号することかもしれません。
パディングオラクル攻撃 Padding Oracle Attack は選択暗号文攻撃です#
これはセキュリティの脆弱性です。
- 予期しない値のパディングがある場合、例外がスローされ、有用なエラーメッセージが表示されます。
- これは、暗号システムがパディングエラーを処理する方法を利用して攻撃を行います。例えば、エラーメッセージがネットワーク上またはログを通じて可視化される場合や、タイミングの行動が露呈する場合があります。
- エラーはセッションの終了を引き起こす可能性があります。
- 暗号文には追加の制限があるかもしれません(最小 / 最大長)。
- 選択暗号文攻撃 CCA に属します(攻撃者が情報を復号する必要があるため)、したがって IND-CPA 安全モデルには含まれません。
- 全平文復元攻撃を引き起こします。
- 各バイトは 8 ビットであり、8*16 = 128 回の試行が必要です。
- ブロック内の右から左のターゲットバイトに向かって、効果的なパディングパターンの長さを徐々に増やします(前のスライドを参照)。
例では 0x01 を使用しています。これは、パディングが 1 ビット不足している場合を示します。欠けているビット数に応じて変更する必要があります。
予測可能な IV を持つ CBC モードへの攻撃#
- 全平文復元に拡張可能です。
- SSL/TLS 記録プロトコルに対する初の重大な攻撃です。
BEAST 攻撃#
-
JavaScript は、SSL/TLS 記録プロトコルの情報の最初に選択した平文ブロックを注入できる必要があります。
-
JavaScript は MITM 攻撃者と通信する必要があります。
-
同一生成元ポリシーに関連する問題があります。
BEAST 攻撃の成功は以下の条件に依存します:
- 攻撃者が被害者のブラウザ上で自分のコードを実行できること。
- 攻撃に脆弱なプロトコルバージョン(SSL 3.0 または TLS 1.0)が使用されていること。
- 予測可能な IV が使用されていること(TLS 1.0 では、IV は前の暗号文ブロックであるため、予測可能です)。
BEAST の結果は何ですか?#
- BEAST は TLS にとって非常に頭痛の種です。
- ほとんどのクライアント実装は TLS 1.0 に「留まっています」。
- 最良の解決策:TLS 1.1 または 1.2 にアップグレードします。
- ランダム IV を使用することで、攻撃を防ぐことができます。
- しかし、サーバー側のサポートも必要です。
- TLS 1.0 には、複数の回避策があります:
- クライアントは 1/n-1 記録分割を使用して攻撃を阻止できます。- 各実際の記録の前に長さ 0 の仮想記録を送信します。- または RC4 に切り替えますか?