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

您正在使用 CBC 模式,这需要一个初始化向量 (IV)。由于您没有明确设置一个,因此每次加密时都会生成一个随机值。您必须:

  • 使用静态 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 回答