需要解决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