Java 用特殊字符加密和解密字符串

Java 用特殊字符加密和解密字符串,java,encryption,Java,Encryption,我试图加密一个客户端的名称(字符串格式),将其存储在数据库中,然后检索并解密它。由于我需要避免使用任何第三方库,所以我使用了Java发行版中随时可用的类 这个过程运行良好,直到我遇到一个带有特殊字符(Ascii:48910)的名称。这被显示为问号(?)。加密和解密进行得很顺利,但在解密后,特殊字符被替换为问号 因此,我将编码格式从“UTF-8”更改为“ISO-8859-1”。这解决了显示问题,但解密后特殊字符仍被替换 正在使用的代码和输出如下所示(我已删除了不必要的代码): 输出: String

我试图加密一个客户端的名称(字符串格式),将其存储在数据库中,然后检索并解密它。由于我需要避免使用任何第三方库,所以我使用了Java发行版中随时可用的类

这个过程运行良好,直到我遇到一个带有特殊字符(Ascii:48910)的名称。这被显示为问号(?)。加密和解密进行得很顺利,但在解密后,特殊字符被替换为问号

因此,我将编码格式从“UTF-8”更改为“ISO-8859-1”。这解决了显示问题,但解密后特殊字符仍被替换

正在使用的代码和输出如下所示(我已删除了不必要的代码):

输出:

String To Encrypt: Expendable’s Pte Ltd
Encrypted String: TAAJuF7KOmBZHBXFHsW0FB9YBwH7Tcif
Decrypted String: Expendable?s Pte Ltd

请告知如何在不替换特殊字符的情况下实现解密。

了解一些有用的信息

System.out.println((int) getSpecialCharacter(49810).charAt(0));
印刷品

146
这就是您在此处实际创建的角色

System.out.println("The Falcon" + (char) 146 + "s Hangar Pte Ltd");
印刷品

The Falcon’s Hangar Pte Ltd
我认为问题在于使用ISO-8859-1字符集和

byte[] plainText = unencryptedString.getBytes(FORMAT);
但是,当您将其转换回字符串时,将使用系统默认值

decryptedText = new String(plainText);
我想这应该是

decryptedText = new String(plainText, FORMAT); // use the same Charset

我认为每次从字符串到字节数组再返回时都应该指定编码。特别是,这一行:

decryptedText = new String(plainText);
应改为:

decryptedText = new String(plainText, FORMAT);

否则,您将依赖于环境的编码,这很可能与格式不同,并导致特殊字符被打印为“?”

如果问题仅出现在“解密后”,您可以简化示例,因为它似乎与加密/解密无关。顺便说一句,ASCII字符和
字节
值在127处停止,ISO-8851-1在255处停止,因此很难确定您所说的是什么字符变成猎鹰的机库私人有限公司这些都没有意义。没有理由不使用UTF-8,getSpecialCharacter方法只是丢弃字符的高位,因此49810实际上只是146。但问题是您使用了错误的字符串构造函数。使用字符串(字节[],字符集)构造函数。它是ISO-88589-1字符集中的字符,代码为180。请参见此处:。无法在编辑器中键入。问题中存在大量不一致之处。我建议您休息一下,检查一下您的代码,例如,是48910还是49810或146?是ASCII(最多127个)、ISO-8859-1(最多255个)还是UTF-8(包括49810个)是的,问题是我使用了错误的字符。不知怎的,我得出结论,49810是与字符对应的代码。实际上是(char)180。需要暂停编码来释放我的思想:)。
decryptedText = new String(plainText, FORMAT);