使用AES/ECB解密时出现“BadPaddingException: pad block corrupted”错误

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

上述代码对以下16字节的加密数据总是会抛出“BadPaddingException: pad block corrupted”异常:

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

密钥长度为16字节。
当数据已经是块大小,并且不需要填充时,为什么会抛出此异常呢?
注意:加密数据来自php服务器。
编辑:
更改为 Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding"); 而不是 Cipher cipher = Cipher.getInstance("AES"); 后,解密方法成功,但却给出了这个输出图片:https://istack.dev59.com/cBUOU.webp

Cipher.doFinal 接受字节数组而不是字符串作为参数。 - jarnbjo
是的,它是字节数组。 - Ron
请提供有关您收到的数据的更多信息,以及您是否只是进行解密的所有操作? - hardartcore
@Android-Developer 它被另一个客户端应用程序加密,该应用程序将其存储在此服务器上。当我的应用程序获取数据时,php从数据库中选择加密数据,对其进行base64编码并将其发送给我。 - Ron
请查看类似的问题/答案,链接如下:http://stackoverflow.com/questions/11292413/decrypting-does-not-happen-correctly/11292474#11292474 - David Kroukamp
显示剩余10条评论
2个回答

10

在我处理的大多数情况下,BadPaddingException 是由于我试图解密在服务器端使用不同填充方式加密或未解密的内容。因此,首先建议您查看服务器返回的字符串是否仅为Base64编码,同时还要使用AES进行加密。另外要注意的是,如果服务器端使用了一些填充方式,例如:AES/CBC/NoPaddingAES/CBC/PKCS5PaddingAES/CBC/PKCS7Padding,则在Android中必须使用相同的填充方式才能解密该字符串。


在将byte[]转换为String时,请尝试使用UTF-8字符集。 - hardartcore
我认为您看到这个输出是因为字符串没有被正确转换,它仍然是字节数组。 - hardartcore

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接