1

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

我正在尝试将我的加密字符串发送到以下方法,但它无法获取字节 [],在将字符串转换为字节 [] 时出现数字格式异常。

我的解密方法:

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)

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

请建议。

4

2 回答 2

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()    
于 2013-08-15T08:52:00.963 回答
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 的整个字节数组用于存储单个 Integer。

于 2013-08-15T08:23:24.327 回答