我正在尝试用 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)
我如何将这个固定的 IV 与这个 AES 实现一起使用?有什么办法吗?
原文由 Shahed 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先,
创建大小为 1 的字节数组而不是大小为 32 的字节数组(如果这是您的意图)。
其次,AES 的 IV 大小应为 16 字节或 128 位(这是 AES-128 的块大小)。如果您使用 AES-256,则 IV 大小应为 128 位大,因为 AES 标准仅允许 128 位块大小。原始的 Rijndael 算法允许其他块大小,包括 256 位长的块大小。
第三,如果您打算使用 AES-256,这不是开箱即用的。您需要下载并安装 JCE Unlimited Strength Jurisdiction Policy Files (滚动到页面底部);我还建议阅读随附的许可证。
这将导致对您的代码进行以下更改:
最后,初始化向量应该是唯一的和不可预测的。一个 16 字节的序列,每个字节由值 0 表示,不是 IV 的合适候选者。如果这是生产代码,请考虑寻求帮助。