需要解决AES中IV长度错误的问题

我正在尝试用Java实现AES,这是我使用的代码:

 byte[] sessionKey = {00000000000000000000000000000000};

byte[] iv = {00000000000000000000000000000000};

byte[] plaintext = "6a84867cd77e12ad07ea1be895c53fa3".getBytes();

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));

byte[] ciphertext = cipher.doFinal(plaintext);

cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));

byte[] deciphertext = cipher.doFinal(ciphertext);

我需要此固定密钥和IV进行测试,但出现以下异常:

Exception in thread "main"

java.security.InvalidAlgorithmParameterException:

Wrong IV length: must be 16 bytes long at

com.sun.crypto.provider.SunJCE_h.a(DashoA12275) at

com.sun.crypto.provider.AESCipher.engineInit(DashoA12275) at

javax.crypto.Cipher.a(DashoA12275) at

javax.crypto.Cipher.a(DashoA12275) at

javax.crypto.Cipher.init(DashoA12275) at

javax.crypto.Cipher.init(DashoA12275)

如何在此AES实现中使用固定的IV?有什么办法吗?

回答:

首先,

byte[] iv = {00000000000000000000000000000000};

创建一个大小为1的字节数组,而不是大小为32的字节数组(如果您打算这样做)。

其次,AES的IV大小应为16字节或128位(这是AES-128的块大小)。如果使用AES-256,则IV大小应为128位大,因为AES标准仅允许128位块大小。原始的Rijndael算法允许其他块大小,包括256位长的块大小。

第三,如果您打算使用AES-256,则不要开箱即用。您需要下载并安装JCE无限强度管辖权策略文件(滚动到页面底部);我还建议您阅读随附的许可证。

这将对您的代码进行以下更改:

byte[] iv = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

最后,初始化向量是唯一且不可预测的。一个16字节的序列(每个字节由0表示)不适合用于IV。如果这是生产代码,请考虑寻求帮助。

以上是 需要解决AES中IV长度错误的问题 的全部内容, 来源链接: utcz.com/qa/407015.html

回到顶部