5

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

解密方法成功,但给出了这个输出 在此处输入图像描述

4

2 回答 2

8

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

于 2013-03-01T13:11:29.703 回答
1

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

于 2013-03-01T13:12:49.857 回答