'BadPaddingException:pad block corrupted'在使用AES / ECB解密时

时间:2013-03-01 12:44:13

标签: java android aes badpaddingexception

在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");

decrypt方法成功,但是给出了这个输出 enter image description here

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

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