Android/PHP-加密和解密

Android/PHP-加密和解密,android,encryption,Android,Encryption,我正在绞尽脑汁学习本页的代码: 我想将数据从服务器发送到Android应用程序,反之亦然,但它应该作为加密字符串发送。但是,我设法在PHP中加密和解密字符串。但在Android上,应用程序在解密时崩溃,并显示以下错误消息: java.lang.Exception:[解密]无法将“”解析为整数 此错误在for循环中出现: public static byte[] hexToBytes(String str) { if (str==null) {

我正在绞尽脑汁学习本页的代码:

我想将数据从服务器发送到Android应用程序,反之亦然,但它应该作为加密字符串发送。但是,我设法在PHP中加密和解密字符串。但在Android上,应用程序在解密时崩溃,并显示以下错误消息: java.lang.Exception:[解密]无法将“”解析为整数

此错误在for循环中出现:

    public static byte[] hexToBytes(String str) {
        if (str==null) {
                return null;
        } else if (str.length() < 2) {
                return null;
        } else {
                int len = str.length() / 2;
                byte[] buffer = new byte[len];

                for (int i=0; i<len; i++) {
                        buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16);
                }
                System.out.println("Buffer: " + buffer);
                return buffer;
        }
}
publicstaticbyte[]hexToBytes(stringstr){
如果(str==null){
返回null;
}else if(str.length()<2){
返回null;
}否则{
int len=str.length()/2;
字节[]缓冲区=新字节[len];

对于(int i=0;i您谈论的是加密和解密,但您展示的代码只是将数字字节(例如
0x4F
)转换为字符串(例如
“4F”
)——这可能与数据传输有关(如果您无法传输二进制格式),但与加密/解密完全无关

由于您的Android代码只包含一个整数解析,您是否检查了您提供的输入?
str.substring(i*2,i*2+2)
显然包含[0-9A-F]以外的数据当异常发生时。您应该首先检查您收到的字符串,并将其与您发送的字符串进行比较,以确保它们一致,并且它们只包含十六进制字符


编辑——通过hexToBytes()函数传递字符串“f46d86e65fe31ed46920b20255dd8ea6”工作正常。您的输入可能与您想象的不同。

03-15 19:56:36.882:I/System.out(6180):f46d86e65fe31ed46920b20255dd8ea6是输入值,因此结果是正确的:您已经知道字符串解析存在问题,因此发送了str.substring(i*2,i*2+2)在日志中,以便确定导致异常的是哪一对?仔细检查输入值,似乎是错误的。PHP页面在实际加密字符串之前添加了四行新行。但是,当我在Android上加密同一字符串时,它返回加密的:�M��_��我�Uݎ� 根据PHP版本,这是错误的,因为它返回F46D86E65FE31ED46920B2025DD8EA6。问题是在加密完成后,我忘记调用bytesToHex函数。如果您想获得最新版本的代码,可以在此处获得: