【问题标题】:'BadPaddingException: pad block corrupted' while decrypting using AES/ECB使用 AES/ECB 解密时出现“BadPaddingException:垫块损坏”
【发布时间】:2018-06-26 16:46:17
【问题描述】:

在 Android/java 应用中,

byte[] data = ":ʺ$jhk¨ë‹òºÃ"; // fetched from php server..
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, mKeyspec);
return new String(cipher.doFinal(data));

上面的代码总是抛出 BadPaddingException: pad block corrupted 用于以下 16 字节加密数据

data = ":ʺ$jhk¨ë‹òºÃ"(数据为 16 个字符)

密钥长度为 16 个字节。

当数据已经是块大小时为什么会抛出这个异常。?并且不需要填充。

注意:加密数据是从 php 服务器获取的。

编辑:

改成后
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
来自
Cipher cipher = Cipher.getInstance("AES");

解密方法成功,但给出了这个输出

【问题讨论】:

  • Cipher.doFinal 采用字节数组而不是字符串作为参数。
  • 是的..它是字节数组..
  • 给我们一些关于你收到的数据的更多信息,如果这就是你要解密的一切吗?
  • @Android-Developer 这是可用于加密的数据。我把它作为一个 base 64 字符串,在将它传递给这个解密方法之前对其进行解码。上面的代码就是整个解密方法。密钥为 16 个字节。
  • @userSeven7s:您在示例中使用的字符串和代码长度为 13 个字符。您尝试解密的实际数据是什么?

标签: java android aes badpaddingexception


【解决方案1】:

在我处理BadPaddingException 的大多数情况下,当我试图解密在服务器端使用不同填充加密的东西时,或者在某些情况下它甚至没有被解密。因此,首先我建议您查看方式并确保服务器不仅返回您的字符串 Base64 编码,而且还使用 AES 加密。另一件要小心的是,如果服务器端的加密使用某种填充,例如:AES/CBC/NoPaddingAES/CBC/PKCS5PaddingAES/CBC/PKCS7Padding。在这种情况下,您必须在 Android 中使用相同的填充,以便解密字符串。

【讨论】:

  • 在从 byte[] 转换为 String 时尝试使用 UTF-8 字符集。
  • 我认为您看到此输出是因为字符串未正确转换并且仍然是 byte[]。
【解决方案2】:

要加密固定长度只有16字节的数据,使用不需要初始化向量的方法,将AES改为AES/ECB/NoPadding

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2016-11-28
    相关资源
    最近更新 更多