【问题标题】:javax.crypto.IllegalBlockSizeException in AES encryptionAES 加密中的 javax.crypto.IllegalBlockSizeException
【发布时间】:2010-10-24 18:19:54
【问题描述】:

我在 java 中使用 AES/CBC/PKCS5Padding 填充标准,而我的朋友在 c#.NET 中使用 PKCS7 标准 如果我的朋友使用 AES 加密数据并将密钥发送给我,那么我可以解密它。

但是,如果我的数据长度增加超过 2920 字节,那么如果我在 c#.NET 中加密数据并在 java 中解密数据,那么我的解密将无法正常工作。 它给了我以下错误。

"javax.crypto.IllegalBlockSizeException: 使用填充密码解密时输入长度必须是 16 的倍数"

谢谢 粑粑

【问题讨论】:

  • 谷歌搜索“使用填充密码解密时输入长度必须是 16 的倍数”给出了很多答案。
  • 添加了 C# 标记——这听起来像是在 C# 中不刷新缓冲区的问题,而您随后在 Java 中看到了这种问题。您还可以通过使用(通常更安全)CTR 模式来解决整个填充问题。

标签: c# java encryption


【解决方案1】:

只需使用cipher.dofinal("Your byte array","offset...put 0","block size...16");

eg : c.dofinal(ByteArray,0,16);

【讨论】:

    【解决方案2】:

    你又忘了刷新缓冲区,这意味着数据流不完整。

    [编辑] 我不了解 C#,但在 Java 中,您必须在所有数据到达后调用一次 doFinal()。 (见the docs)。

    问题的根源在于加密 API 需要知道您何时完成。它不能从数据中分辨出来,你必须调用一个方法说“把它包装起来,创建最终的校验和,无论如何,这样接收者就可以解码它”。

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多