java中法语字符的解密可以在windows上工作,但不能在Linux上工作
我使用以下代码对加密字符串进行解密java中法语字符的解密可以在windows上工作,但不能在Linux上工作,java,encryption,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 n
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服务器上部署代码时,它并没有显示正确的字符(?PERVI?RES)。
我的解密方法有问题吗?问题可能在这里:
return new String(cipher.doFinal((new BASE64Decoder()).decodeBuffer(decryptMe)));
使用平台的默认字符集,通常应避免使用。相反,请使用并指定加密数据的编码。例如,如果数据为UTF-8:
return new String(cipher.doFinal((new BASE64Decoder()).decodeBuffer(decryptMe)), StandardCharsets.UTF_8);
您可以通过调用查找平台上的默认字符集,因此请在本地服务器上检查它,并在代码中使用该字符集
这也可能是您的终端没有正确显示Unicode输出的问题,但这取决于您使用的终端软件。查看手册中的Unicode显示选项。问题可能在于:
return new String(cipher.doFinal((new BASE64Decoder()).decodeBuffer(decryptMe)));
使用平台的默认字符集,通常应避免使用。相反,请使用并指定加密数据的编码。例如,如果数据为UTF-8:
return new String(cipher.doFinal((new BASE64Decoder()).decodeBuffer(decryptMe)), StandardCharsets.UTF_8);
您可以通过调用查找平台上的默认字符集,因此请在本地服务器上检查它,并在代码中使用该字符集
这也可能是您的终端没有正确显示Unicode输出的问题,但这取决于您使用的终端软件。查看手册中的Unicode显示选项。您的Linux终端支持Unicode吗?@HunterMcMillen如何检查?是否有任何命令可以告诉我支持的Unicode?它可能在应用程序的首选项菜单中。您的Linux终端是否支持Unicode?@HunterMcMillen如何检查?是否有任何命令可以告诉我支持的Unicode?它可能会出现在任何应用程序的首选项菜单中。最好使用UTF-8,因为它可以处理所有脚本。@JoopEggen需要在加密之前匹配字节的编码,但是,是的,如果您的代码处理两侧,那么您应该将两者都设置为使用UTF-8,用于加密。@SeanVanGorder-我在本地记录了默认字符集值,并在Linux服务器上进行了测试。价值观是不同的。在我的本地版本中,它是>>windows-1252,但在Linux框中,它是>>US-ASCII。@默认情况下,Yoseph US-ASCII有点奇怪,它只包含基本的字母/数字/符号,而不包括您需要的重音字符。如果操作系统以某种方式设置为US-ASCII,您可能需要更改它。@SeanVanGorder我在Unix/Linux上没有那么多经验。你能告诉我如何更改默认值吗?的确。最好使用UTF-8,因为它可以处理所有脚本。@JoopEggen需要在加密之前匹配字节的编码,但是,是的,如果您的代码处理两侧,那么您应该将两者都设置为使用UTF-8,用于加密。@SeanVanGorder-我在本地记录了默认字符集值,并在Linux服务器上进行了测试。价值观是不同的。在我的本地版本中,它是>>windows-1252,但在Linux框中,它是>>US-ASCII。@默认情况下,Yoseph US-ASCII有点奇怪,它只包含基本的字母/数字/符号,而不包括您需要的重音字符。如果操作系统以某种方式设置为US-ASCII,您可能需要更改它。@SeanVanGorder我在Unix/Linux上没有那么多经验。您能告诉我如何更改默认值吗?