在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方法成功,但是给出了这个输出
答案 0 :(得分:7)
在大多数情况下,我一直在处理BadPaddingException
,当我试图解密在服务器端使用不同填充加密的东西时,或者在某些情况下甚至没有解密。首先,我建议您查看方法并确保服务器不仅返回Base64
编码的字符串,而且还使用AES
加密。另一件需要注意的事情是,服务器端的加密是否使用某种类型的填充:AES/CBC/NoPadding
,AES/CBC/PKCS5Padding
或AES/CBC/PKCS7Padding
。在这种情况下,您必须在Android中使用相同的填充,以便您可以解密字符串。
答案 1 :(得分:1)
要使用不需要初始化向量的方法加密固定长度的仅16字节数据,请将AES
更改为AES/ECB/NoPadding
。