使用以下代码,我正在进行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]
可能是什么原因?
答案 0 :(得分:1)
CBC模式需要IV,init
方法可能会生成随机IV(如果没有指定)(来自the documentation):
如果此密码需要任何无法从给定密钥派生的算法参数,则底层密码实现应自行生成所需参数(使用特定于提供程序的默认值或随机值),如果它正在初始化以进行加密或密钥包装,如果正在初始化以进行解密或密钥解包,则引发InvalidKeyException。可以使用getParameters或getIV(如果参数是IV)检索生成的参数。
为避免明确指定IV。