我使用以下代码来解密加密的字符串
public String decrypt(String decryptMe) throws Exception {
if (decryptMe == null) {
return null;
} else {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(2, this.getKeySpec());
return new String(cipher.doFinal((new BASE64Decoder()).decodeBuffer(decryptMe)));
}
}
当我在本地运行代码并将其部署在本地 tomcat 服务器上时,它显示正确的法语字符(即 ÉPERVIÈRES)。但是当我将代码部署在 Linux 机器上运行的 tc-server 上时,它没有显示正确的字符(??PERVI??RES)。 我的解密方法有问题吗?
最佳答案
问题可能出在这里:
return new String(cipher.doFinal((new BASE64Decoder()).decodeBuffer(decryptMe)));
new String(byte[] bytes)
使用平台的默认字符集,通常应该避免。相反,使用 new String(byte[] bytes, Charset charset)
并指定加密数据的编码。例如,如果数据是 UTF-8:
return new String(cipher.doFinal((new BASE64Decoder()).decodeBuffer(decryptMe)), StandardCharsets.UTF_8);
您可以通过调用 Charset.defaultCharset()
找到平台上的默认字符集,因此请在本地服务器上检查它并在代码中使用该字符集。
这也可能是您的终端无法正确显示 Unicode 输出的问题,但这取决于您使用的终端软件。检查 Unicode 显示选项手册。
关于java - java 中的法语字符解密适用于 Windows,但不适用于 Linux 机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49499204/