【问题标题】:how to work java cipher aes-cbc如何工作 java cipher aes-cbc
【发布时间】:2025-11-28 08:15:01
【问题描述】:

我使用密码AES-cbc。我有一个加密的第三部分字符串和一个密钥。

我想问一些问题,

当我解密时出现异常

javax.crypto.BadPaddingException: Given final block not properly padded
  at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
  at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
  at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)

我在论坛中读到,这可能是因为加密密钥和解密密钥不同。我的问题会发生这种情况吗?

还有我如何使用 cbc 我需要一个 iv 向量。但我不知道加密的 iv 向量。我需要这个向量吗?我怎样才能得到我?

【问题讨论】:

  • 考虑接受有帮助的答案。要接受答案,请单击最佳答案旁边的空心复选标记,这样做会提高您的声誉并提供更多功能,请参阅reputation faq 更多详细信息,请参阅this page。另外请考虑返回并接受过去的答案,这样做会增加您的声誉并允许更多功能,请参阅reputation faq

标签: java encryption aes


【解决方案1】:

CBC 代表密码块链接,这意味着加密一个数据块的输出与下一个输入块进行异或。对于第一个块,随机数据块(称为 IV)与输入进行异或。 IV 应该只是随机数据,并在执行加密时生成。你肯定需要静脉注射,而且没有办法恢复它。您只能从生成它的人那里获得它。几乎可以肯定,没有正确的 IV 是填充异常的原因。

【讨论】:

  • 如果消息只有一个块长,IV 只是异常的原因。错误的 IV 只影响第一个区块。
  • 是的。我在考虑加密,但对于解密,你当然是对的。
【解决方案2】:

填充错误通常意味着解密失败但不能依赖于确定正确的解密,如果报告给调用者可以创建一个填充预言,该预言可用于在没有密钥的情况下恢复原始文本。这可能是因为加密和解密的填充方法、模式、密钥或iv不一样。

最好key和iv完全符合要求,iv长度与AES的16字节块相同。密钥可以是 128 位(16 字节)、192 位(24 字节)或 256 位(32 字节)。

对于 CBC 模式,需要一个 iv,最佳做法是生成一个随机 iv 并将其添加到加密数据中,这样可以在解密时使用相同的 iv。 iv 不需要保密。

【讨论】: