解密具有特殊字符的String时的ArrayIndexOutOfBoundsException

时间:2015-03-20 09:26:31

标签: java gwt encryption bouncycastle tripledes

使用com.googlecode.gwt.crypto.client.TripleDesCipher#decrypt解密字符串时,会抛出以下异常:

java.lang.ArrayIndexOutOfBoundsException: -59 
at com.googlecode.gwt.crypto.bouncycastle.util.encoders.HexEncoder.decode(HexEncoder.java:106) 
at com.googlecode.gwt.crypto.bouncycastle.util.encoders.Hex.decode(Hex.java:86)
at com.googlecode.gwt.crypto.client.TripleDesCipher.decrypt(TripleDesCipher.java:51)

传递给方法的String包含一个特殊字符。

你们之前有没有遇到过这样的错误?


传递给decrypt方法的String包含特殊字符Ţ。它以 UTF-8 编码,但由TripleDesCipher以某种方式解析为 ISO-8859-1

2 个答案:

答案 0 :(得分:0)

Java正在使用UTF-16进行自己的编码:大部分字符将使用16位,但有一些例外。当一个字符不能用UTF-16编码时,它将使用hi-surrogate(1 char)和low-surrogate(1 char)进行编码,因此需要2个本机Java char空间。

你的char表示是:

Ţ:带有CEDILLA的拉丁文大写字母(U + 0162):feff0162

java表示将是2个java native char(0xfeff和0x0162)。 您可以通过测试一个字符是否为高代理来检测此行为(在这种情况下,必须紧跟一个低代理项。)

有关javadoc的更多信息:

http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isHighSurrogate%28char%29

一般在Character header doc中:

http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html

修改

忘记之前的回复,它不应该与数据表示相关联。似乎您要“解密”的任何字符串必须首先加密为十六进制。因此,这不包括Ţ作为加密数据中的潜在价值。在将其输入TripleDesCipher.decrypt方法之前,您的输入应该已经错误。

答案 1 :(得分:0)

正如答案中已经提到的,问题是我们读了 UTF-8 字符串,因为它是 ISO-8859-1 并将其传递给{{1方法。

错误的编码归因于multipart/form-data request