需要 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)

我如何将这个固定的 IV 与这个 AES 实现一起使用?有什么办法吗?

原文由 Shahed 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 4.3k
2 个回答

首先,

 byte[] iv = {00000000000000000000000000000000};

创建大小为 1 的字节数组而不是大小为 32 的字节数组(如果这是您的意图)。

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

第三,如果您打算使用 AES-256,这不是开箱即用的。您需要下载并安装 JCE Unlimited Strength Jurisdiction Policy Files (滚动到页面底部);我还建议阅读随附的许可证。

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

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

最后,初始化向量应该是唯一的和不可预测的。一个 16 字节的序列,每个字节由值 0 表示,不是 IV 的合适候选者。如果这是生产代码,请考虑寻求帮助。

原文由 Vineet Reynolds 发布,翻译遵循 CC BY-SA 3.0 许可协议

来自 高级加密标准

该标准包括三个块密码,AES-128、AES-192 和 AES-256,采用了最初作为 Rijndael 发布的更大的集合。 _这些密码中的每一个都有 128 位的块大小_,密钥大小分别为 128、192 和 256 位

(强调)

初始化向量

对于块密码操作模式,IV 通常与密码的块大小一样大

将这两个因素结合在一起,您会发现 AES 的 IV 始终为 128 位,与密钥大小无关。

原文由 Damien_The_Unbeliever 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题