即使输入相同,AES / CBC / NoPadding是否会生成两个不同的密文?

时间:2016-03-25 11:54:14

标签: java encryption cryptography aes cbc-mode

使用以下代码,我正在进行AES加密操作,我在不同的实例传递相同的输入,但我得到的是不同的Cipher。为什么会这样?

 public static byte[] encrypt(byte[] plainText, byte[] key) 
    {
  byte[] passwordKey128 = Arrays.copyOfRange(key, 0, 16);
  SecretKeySpec secretKey = new SecretKeySpec(passwordKey128, "AES");
  Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
  cipher.init(Cipher.ENCRYPT_MODE, secretKey);
  byte[] cipherText = cipher.doFinal(plainText);
  return cipherText;
 }

输入

 encrypt(new byte[]{-17, -60, -70, 24, 80, 35, 2, -62, -79, 19, -55, -50, -62, -69, -80, -96} ,new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} );

在一个实例中,密码为 - [0,91,-96,80,-44,-93,107,62,4,-10,103,119,109,4,25,68]

在另一个实例中,密码为 - [87,109,20,69,18,6,103,92,-57,62,-41,-103,-18,-19,74,87]

可能是什么原因?

1 个答案:

答案 0 :(得分:1)

CBC模式需要IV,init方法可能会生成随机IV(如果没有指定)(来自the documentation):

  

如果此密码需要任何无法从给定密钥派生的算法参数,则底层密码实现应自行生成所需参数(使用特定于提供程序的默认值或随机值),如果它正在初始化以进行加密或密钥包装,如果正在初始化以进行解密或密钥解包,则引发InvalidKeyException。可以使用getParameters或getIV(如果参数是IV)检索生成的参数。

为避免明确指定IV。