我正在尝试使用以下方法解密加密的字符串,但是遇到了异常。
我正在尝试将加密的字符串发送到下面的方法,但它无法获取byte [],在将String转换为byte []时获得Number Format Exception。
我的解密方法:
public static String decrypt(String seed, String encrypted) throws Exception {
byte[] seedByte = seed.getBytes();
System.arraycopy(seedByte, 0, key, 0, ((seedByte.length < 16) ? seedByte.length : 16));
String base64 = new String(Base64.decode(encrypted, 0));
byte[] rawKey = getRawKey(seedByte);
byte[] enc = toByte(base64);
byte[] result = decrypt(rawKey, enc);
return new String(result);
}
这是我的toByte(String)方法:
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;
}
我得到的例外:
08-15 13:03:04.748: W/System.err(10013): java.lang.NumberFormatException: Invalid int: "@��"
08-15 13:03:04.748: W/System.err(10013): at java.lang.Integer.invalidInt(Integer.java:138)
08-15 13:03:04.748: W/System.err(10013): at java.lang.Integer.parse(Integer.java:375)
08-15 13:03:04.748: W/System.err(10013): at java.lang.Integer.parseInt(Integer.java:366)
08-15 13:03:04.748: W/System.err(10013): at java.lang.Integer.valueOf(Integer.java:510)
08-15 13:03:04.748: W/System.err(10013): at com.example.aes.EncodeDecodeAES.toByte(EncodeDecodeAES.java:226)
08-15 13:03:04.748: W/System.err(10013): at com.example.aes.EncodeDecodeAES.decrypt(EncodeDecodeAES.java:69)
08-15 13:03:04.748: W/System.err(10013): at com.example.aes.MainActivity$1.run(MainActivity.java:94)
我真的不明白为什么我会收到这个错误。
请建议。
答案 0 :(得分:0)
我认为这里的问题是解析你在这里执行的字节数组:
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();
您可以尝试这种方法(考虑一个4字节的整数,并且您想将hexString分成两位整数):
byte[][] result = new byte[len][4];
int[] numbers = new int[len];
for(int j = 0; j < len ; j++){
numbers[j] = Integer.parseInt(hexString.substring(2 * j, 2 * j + 2);
}
for (i = 0; i < len; i++){
result[i][3] = (byte) numbers[i] & 0xFF);//No need for shifting here
for(j = 0; j < len-1; j++){
result[i][j] = (byte) ((numbers[i] >> ((-1)*j*8+24)) & 0xFF);
}
}
您的实现的问题是您将字符串拆分为几个整数,并且您只是将整数的第一个字节分配给byte_array [0],然后分配给byte_array [1]第二个整数的第一个字节。知道长度为4的整个字节数组用于存储单个整数。
答案 1 :(得分:0)
好像你的十六进制字符串中有一些无效字节。在将其放入字节数组之前尝试验证它,例如执行以下操作:
if(new Scanner(hexString.substring(2 * i, 2 * i + 2), 16).hasNextInt())
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue()