Java ';BadPaddingException:焊盘块损坏';使用AES/ECB进行解密时

Java ';BadPaddingException:焊盘块损坏';使用AES/ECB进行解密时,java,android,aes,badpaddingexception,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)); 对于以下16字节的加密数据,上述代码始终抛出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));
对于以下16字节的加密数据,上述代码始终抛出
BadPaddingException:pad block corrupted

data=“:ʺ$jhkèèèèÔ(数据为16个字符)

密钥长度为16字节

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

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

编辑: 更改为
Cipher-Cipher=Cipher.getInstance(“AES/ECB/NoPadding”)

Cipher-Cipher=Cipher.getInstance(“AES”)

解密方法成功,但给出此输出

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

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

Cipher.doFinal将字节数组而不是字符串作为参数。是的。。这是字节数组。请提供有关您接收的数据的更多信息,以及您是否正在进行解密?@Android Developer这是可用于加密的数据。我将它作为一个base64字符串,在将其传递给这个解密方法之前对其进行解码。上面的代码是整个解密方法。键是16字节。@userSeven7s:您在示例和代码中使用的字符串是13个字符长。您试图解密的实际数据是什么?在从字节[]转换为字符串时,尝试使用UTF-8字符集。我认为您看到了此输出,因为字符串未正确转换,仍然是字节[]。