3

192ビットの鍵を使用してデータを暗号化したい。

SecretKeySpec key = new SecretKeySpec(new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, "AES/CBC/NoPadding");
byte[] data = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
byte[] encrypted = null;
try {
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    encrypted = cipher.doFinal(data);
} catch (Exception e) {
    System.out.println(e.getMessage());
}

しかし、暗号化は真実ではありません。さらに、毎回配列の内容が異なります。なんで?

4

1 に答える 1

1

初期化ベクトル(IV)を必要とするCBCモードを使用しています。明示的に設定しないため、暗号化するたびにランダムに生成されます。次のいずれかを行う必要があります。

  • 静的IVを使用する(非推奨)、または
  • IVを暗号文と一緒にC++プログラムに送信します

JavaでIVを設定する方法は次のとおりです。C++の場合は、使用しているライブラリのドキュメントを参照してください。

 byte[] iv = generateIv(cipher.getBlockSize());
 IvParameterSpec ivParams = new IvParameterSpec(iv);
 cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
于 2012-10-10T03:13:18.093 に答える