CTRモードでナンスを使用すると、実際にセキュリティが向上しますか(1、2、3などを使用するのと比べて、基本的には一定のナンスは0)?
私の知る限り、セキュリティ面での最良のシナリオは、ナンスが一種の2番目のキーとして機能し、通信相手間で安全に共有されることです。しかし、基礎となるブロック暗号が安全である場合(AES-128としましょう)、それは不必要で役に立たないはずです...そうですか?
Nonceを指定すると、セキュリティが強化されたという誤った感覚しか得られないように思えます。何か不足していますか?
"ノンス"は 初期化ベクトル -としてよく知られています。 "IV"はその概念のユニバーサルショートネームです。 CTRモードは、カウンターの連続する値を暗号化することで機能します(CTRは "CounTeR"を表します)。CTRモードのIVは、カウンターが開始する値にすぎません。
CTRは基本的に、長いキー依存の疑似ランダムストリームを生成し、暗号化は、そのストリームと暗号化するデータとのXORを実行することによって行われます。その意味では、キーストリームがAESで(一種のPRNGとして)生成されることを除いて、 One-Time Pad に非常に似ています。これは、OTPの数学的偉大さ、つまりその絶対的なセキュリティを無効にします、しかしそれは実際にスキームを使用可能にします。
値がゼロのIVを使用しても問題ありません...一度だけ実行する限り。別の実行で(同じキーを持つ)カウンター値を再利用すると、「パッド」が「1回限り」ではないOTPと同じ結果になります。これは古典的な休憩です。アイデアは、特定のキーの場合、使用するたびに各カウンター値を「焼き尽くした」と見なす必要があるということです。カウンター値0で始まる最初の暗号化実行を行う場合、カウンター値0から、たとえば12782を使用します(たとえば、暗号化されたデータの長さが276525バイトである場合)。キーを変更しない場合は、0〜12782のカウンター値を再利用しないでください。そのキーで実行される次の暗号化は、IV = 12783で始まる必要があります。
逆に、AESキーを1回だけ使用する限り、常に値0のIVに固執しても安全です。これは、SSLのようなプロトコルでは意味があります。SSLのようなプロトコルでは、接続固有の暗号化キーは、最初のハンドシェイク中にネゴシエートされ、その接続に使用された後、永久にドロップされます。
より一般的には、ブロック暗号のほとんどの 動作モード はIVを使用し(どこかに開始する必要がある「実行状態」があるため)、これらのIVの要件はモードによって異なります。キーを別の実行に再利用しない場合、CTRは固定IVを許容できます。予測可能なIVを選択された平文攻撃に利用できるため、CBCはそれを許容しません。
私は専門家ではないので、これはランダムな推測です...
タイトルの「CTRモードのnonceのポイントは何ですか?」という質問に答えるために、私はプロトコルをステートレスにすることですと言います。つまり、キーを除いて、複数の実行を暗号化/復号化するために、両方の側で情報を保存する必要はありません。
上記のステートメントを理解するために、ブロック暗号とSSLなどのプロトコルを見てみましょう。
ブロック暗号は、キーと入力の2つの引数を持つ関数に似ています。同じ2つの引数(キー+入力)を2回指定すると、常に同じ出力が生成されます。
SSLでは、最初に対称鍵を生成し、それを使用してさまざまなメッセージの暗号化/復号化を行います。したがって、ブロック暗号の引数の1つは、変換全体に対してすでに固定されています。これは、2番目のものを決して繰り返さないこと、またはブロック暗号から同じ出力を2回生成することを意味します。
ブロック暗号から同じ出力を2回生成するのはなぜ悪いのですか?
それはあなたが攻撃をリプレイしやすくするので悪いです。ブロック暗号から同じ出力を2回生成しても問題がない場合、攻撃者が会話中に古いメッセージの1つを再送信しても問題なく、サーバーはそれを喜んで受け入れます。
それで、これがナンスを必要とする理由ですか?
はい、いいえ。
ナンスを修正した場合、多くのメッセージを含む可能性のある会話全体で、同じカウンターで同じキーを再利用しない限り問題ありません。したがって、クライアントとサーバーの両方がカウンターの最後の値を知る必要があるため、状態を維持する必要があります。
ナンスを使用することにより、ナンスとカウンターの組み合わせによって形成される同じ入力は決してないことを想定しています。したがって、状態を維持する必要はありません。