Android中AES 256的解密获取NumberFormateException
我正在进行SOAP解析,将请求发送到.net服务器 响应在服务器端通过AES 256算法进行加密。来自服务器的响应是 k/tMHkiyWgoof8FAsTJttWZT7sku5QcJe6iZsWjkPXS+xE7ujjPn/F0E8SQWKXLH0JIXXHYWRV1SDJJBNXSIXIXIXIXIXIT FNAB83UIOR3VUNB3FMVCOxTHK+Ej4mx+HBNB9PKJGOJFTPX666FN6MWBKMFE4UQHTVBDGJM9HISAW0MM91UANU8G0UUPNDHN1 现在我在java文件中使用解密方法,如下所示:Android中AES 256的解密获取NumberFormateException,android,encryption,Android,Encryption,我正在进行SOAP解析,将请求发送到.net服务器 响应在服务器端通过AES 256算法进行加密。来自服务器的响应是 k/tMHkiyWgoof8FAsTJttWZT7sku5QcJe6iZsWjkPXS+xE7ujjPn/F0E8SQWKXLH0JIXXHYWRV1SDJJBNXSIXIXIXIXIXIT FNAB83UIOR3VUNB3FMVCOxTHK+Ej4mx+HBNB9PKJGOJFTPX666FN6MWBKMFE4UQHTVBDGJM9HISAW0MM91UANU8G0UUPNDH
**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”)代码>