代码之家  ›  专栏  ›  技术社区  ›  Harold L. Brown

使用特殊字符解密字符串时的ArrayIndexOutOfBoundsException

  •  0
  • Harold L. Brown  · 技术社区  · 11 年前

    使用解密字符串时 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)
    

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

    你们中有人以前遇到过这样的错误吗?


    传递给 decrypt 方法包含特殊字符 Å¢ 。编码为 UTF-8型 但是被 TripleDesCipher 像 异-8859-1 .

    2 回复  |  直到 11 年前
        1
  •  1
  •   csauvanet    11 年前

    Java使用UTF-16进行自己的编码:大多数字符将使用16位,但也有一些例外。当一个字符不能在UTF-16中编码时,它将使用高代理(1个字符)和低代理(1字符)进行编码,因此使用2个本地Java字符空间。

    您的字符表示为:

    :拉丁文大写字母T与CEDILLA(U+0162):feff0162

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

    有关javadoc的更多信息:

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

    通常在字符头文档中:

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

    编辑

    忘记前面的响应,它不应该与数据表示相关联。似乎您要“解密”的任何字符串都必须首先加密为十六进制。因此,这排除了加密数据中的潜在值。你的输入应该已经错了 TripleDesCipher.decrypt 方法

        2
  •  0
  •   Harold L. Brown    11 年前

    正如答案中已经提到的,问题是我们阅读了 UTF-8型 字符串原样 异-8859-1 并将其传递给 decrypt 方法

    错误编码是由于 multipart/form-data request .

    推荐文章