java - java 中的法语字符解密适用于 Windows,但不适用于 Linux 机器

标签 java encryption

我使用以下代码来解密加密的字符串

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/

相关文章:

ruby - 在 ruby​​ 中使用密码加密字符串

security - 如何安全地将数据作为 URL 中的参数发送?

docker - mariadb 作为 docker 容器 - 主机安装绑定(bind)上的启动损坏

java - 安卓/Java : Enum methods crashing app

java - 哪种算法最适合我的列表管理?

java - 在 Mac OS X 中运行 .exe 文件

java - 更改 symmetry.key.master.password 在 6.0 中不起作用

java AES加密然后使用相同的 key 和IV在PHP中解密

java - 在 JAVA 中搜索并替换文件中的内容

java - 用户单击 AlertDialog OK 按钮后如何导航到下一个 Activity ?