2

これは、CBC と一緒に対称暗号化 (AES など) を使用する場合の初期化ベクトル (IV) に関する非常に簡単な質問です。

私の質問: 新しいプレーンテキストごとに IV を変更する必要がありますか、それとも新しいセッションごとに作成するだけで十分ですか?

現時点では、私の実装と暗号クラスに Java を使用していますが、実際に初めて新しい IV を作成することに気付きましたが、同じ IV が後の平文にも使用されます。

おそらく、このトピックに関するいくつかの読み物がありますか?

ありがとう :)

4

2 に答える 2

4

CBCでは、最大限のセキュリティを確保するために、IVは予測不可能でなければなりません。

Should the IV change for each new plaintext or
does it suffice to create one for each new session?

あなたが「平文」と「セッション」に与える意味は私には完全には明らかではありません。

セッションごとに新しい新しいキーがあり、交換されるデータが細かく分割されてから暗号化されることを意味する場合、CBCは通常、ピースのチェーン全体に適用されます。つまり、ピースPの暗号文ブロックです。n-1は、ピースPnのIVとして使用できます。したがって、セッション全体で必要なIVは1つだけです。

Perhaps there is some reading resources about this topic?

確かに、NIST SP 800-38A、セクション6.2。

于 2012-08-11T10:38:54.700 に答える
3

注:この回答は、CBCモード暗号化のIVに関するものです。

同じキーを使用して、個別の暗号化「セッション」ごとに新しいIVを作成する必要があります。IVが暗号的に安全であるためには、攻撃者にとって乱数と区別がつかない必要があります。JavaはデフォルトでゼロIVを使用します。これは、他の暗号テキストを作成するためにキーを再利用してはならないことを意味します。

したがって、新しいIVを設定せずにセッションを再利用しないでください。基本的に、どのプロトコルでも安全なのは以下のソースだけです。プロトコル内の他の情報を使用して安全なIVを作成する方法はいくつかありますが、それについては説明しません。

Cipher aes = Cipher.getInstance("AES/CBC/PKCS5Padding");

// repeat this for each cipher text
byte[] ivBytes = new byte[aes.getBlockSize()];
SecureRandom rnd = new SecureRandom();
rnd.nextBytes(ivBytes);
aes.init(Cipher.ENCRYPT_MODE, sk, new IvParameterSpec(ivBytes));

// now prepend the ivBytes to the output, e.g. by writing it to a stream first
// remove and use as IV at the receiving side

[編集]:これの省略表記を忘れました:

aes.init(Cipher.ENCRYPT_MODE, sk, new SecureRandom());
byte[] ivBytes = aes.getIV();

上記のコードは完全性保護を提供しないことに注意してください。

于 2012-08-11T10:56:04.983 に答える