java - 解密带有特殊字符的字符串时出现ArrayIndexOutOfBoundsException

标签 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)

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

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

<小时/>

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

最佳答案

Java 使用 UTF-16 作为自己的编码:大多数字符将使用 16 位,但也有一些异常(exception)。当一个字符无法用 UTF-16 编码时,它将使用 hi-surrogate(1 个字符)和 low-surrogate(1 个字符)进行编码,因此占用 2 个 native Java 字符空间。

您的字符表示是:

Ţ:带有变音符号的拉丁文大写字母 T (U+0162):feff0162

Java 表示将是 2 个 Java native 字符(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 方法之前,您的输入应该已经是错误的。

关于java - 解密带有特殊字符的字符串时出现ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29163248/

相关文章:

Java 设计模式使用抽象类作为参数的方法的不同实现

java - 使用 JFreeChart 上下拖动点后获取值

java - 如何同时共享 Java 和 GWT 项目的 EventBus?

python imaplib gpg 文件内容转换为消息

java - 线程消费者内部的 NullPointerException

java - 在嵌入式 PhoneGap 应用程序中保存和恢复 WebView

java - 并发问题在 Google Maps Widget 上绘制 google maps GeoCoder 请求

java - GWT Twitter 分享按钮

SSLHandshakeException:收到致命警报:在 tomcat 7 服务器上设置密码时 handshake_failure

java - 握手后 SSLSocket getOutputStream() 阻塞