注:この回答は、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();
上記のコードは完全性保護を提供しないことに注意してください。