Android中AES 256的解密获取NumberFormateException

Android中AES 256的解密获取NumberFormateException,android,encryption,Android,Encryption,我正在进行SOAP解析,将请求发送到.net服务器 响应在服务器端通过AES 256算法进行加密。来自服务器的响应是 k/tMHkiyWgoof8FAsTJttWZT7sku5QcJe6iZsWjkPXS+xE7ujjPn/F0E8SQWKXLH0JIXXHYWRV1SDJJBNXSIXIXIXIXIXIT FNAB83UIOR3VUNB3FMVCOxTHK+Ej4mx+HBNB9PKJGOJFTPX666FN6MWBKMFE4UQHTVBDGJM9HISAW0MM91UANU8G0UUPNDH

我正在进行SOAP解析,将请求发送到.net服务器

响应在服务器端通过AES 256算法进行加密。来自服务器的响应是

k/tMHkiyWgoof8FAsTJttWZT7sku5QcJe6iZsWjkPXS+xE7ujjPn/F0E8SQWKXLH0JIXXHYWRV1SDJJBNXSIXIXIXIXIXIT FNAB83UIOR3VUNB3FMVCOxTHK+Ej4mx+HBNB9PKJGOJFTPX666FN6MWBKMFE4UQHTVBDGJM9HISAW0MM91UANU8G0UUPNDHN1

现在我在java文件中使用解密方法,如下所示:

**public class SimpleCrypto {
public static String decrypt(String seed, String encrypted) throws Exception {
    byte[] keyb = seed.getBytes("UTF-8");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] thedigest = md.digest(keyb);
    SecretKeySpec skey = new SecretKeySpec(thedigest, "AES/ECB/PKCS7Padding");
    Cipher dcipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
    dcipher.init(Cipher.DECRYPT_MODE, skey);
    byte[] clearbyte = dcipher.doFinal(toByte(encrypted));
    return new String(clearbyte);
}
public static byte[] toByte(String hexString) {
    int len = hexString.length()/2;
    byte[] result = new byte[len];
    for (int i = 0; i < len; i++)
        result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
    return result;
}
}**
**公共类SimpleCrypto{
公共静态字符串解密(字符串种子、字符串加密)引发异常{
byte[]keyb=seed.getBytes(“UTF-8”);
MessageDigest md=MessageDigest.getInstance(“MD5”);
字节[]thedigest=md.digest(keyb);
SecretKeySpec skey=新的SecretKeySpec(最新版,“AES/ECB/PKCS7Padding”);
Cipher dcipher=Cipher.getInstance(“AES/ECB/PKCS7Padding”);
dcipher.init(Cipher.DECRYPT_模式,skey);
byte[]clearbyte=dcipher.doFinal(toByte(加密));
返回新字符串(clearbyte);
}
公共静态字节[]toByte(字符串hexString){
int len=hexString.length()/2;
字节[]结果=新字节[len];
对于(int i=0;i
您的
toByte
功能没有任何意义。加密响应不是十六进制字符串(十六进制<代码>字符串只有0123456789ABCDEF字符)。因此,您将响应视为一个十六进制
字符串
,并将其转换为
字节[]

当服务器将加密数据转换为
String
时,您需要知道服务器上使用的编码,并且您应该使用相同的编码从响应
String
返回
字节[]
。所以试试看

encrypted.getBytes(YOUR_RESPONSE_ENCODING);
编辑

此外,您的密码应该使用服务器上用于加密的相同算法,在我的情况下,我使用:

new SecretKeySpec(thedigest, "AES/CBC/ZeroBytePadding");
注意:我们也使用AES 256加密。但是有很多方法可以使用AES 256加密数据。您需要知道服务器上使用的确切算法和填充方法

如果您得到
BadPaddingException
,则表示您的数据长度不是密钥长度的精确倍数。因此,在您的情况下,
encrypted.getBytes(您的\u响应\u编码).length%最长的.length
必须等于
0
。您应该在数据末尾添加零字节,以便满足此约束

这里有一个很好的密码学指南:

dcipher.init(Cipher.DECRYPT_模式,skey);byte[]clearbyte=dcipher.doFinal(加密的.getByte(UTF8));dcipher.init(Cipher.DECRYPT_模式,skey);byte[]clearbyte=dcipher.doFinal(加密的.getByte(UTF8));使用你的建议代码后,我得到了错误的填充异常。我做错了什么。。。。。。!尝试新的SecretKeySpec(最常见的“AES/CBC/ZeroBytePadding”)