数字格式解密字符串时出现异常

时间:2013-08-15 08:03:24

标签: java android encryption

我正在尝试使用以下方法解密加密的字符串,但是遇到了异常。

我正在尝试将加密的字符串发送到下面的方法,但它无法获取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)

我真的不明白为什么我会收到这个错误。

请建议。

2 个答案:

答案 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()