Java RSACipher 结果受 file.encoding 属性 影响

Java RSACipher result affected by file.encoding property

我正在尝试了解一些代码的行为,这些代码不是我创建的,但我可能必须修复这些代码。 根据 JVM 系统 属性 file.encoding.

的值(在 JVM 启动时 - 稍后以编程方式更改值似乎没有效果),代码对重音字符的行为有所不同

代码创建并初始化 RSACipher 实例:

  final Cipher cipher = Cipher.getInstance(DecryptInformation.RSA_ECB_PKCS1_PADDING);
  cipher.init(Cipher.DECRYPT_MODE, decryptingKey);
  

然后在一个循环中,它使用该实例来解密加密的字节。

  byte[]  plain = cipher.doFinal(scrambled, 0, i);
  

我验证了无论file.encoding的值如何,scrambled的值保持不变,但问题是plain中的字节在有重音的地方发生了变化人物。在我的单元测试中(为响应在运行时在 wildfly 应用程序中看到的问题而编写),有一个小写的 e-accute 字符(UTF-8 中的 c3a9)。如果使用 VM 参数 -Dfile.encoding=ISO-8859-1 启动测试,我会在变量 plain 中得到 c3a9对于角色。另一方面,如果我使用 -Dfile.encoding=UTF-8 开始测试,对于相同的输入字节,我得到的是 c383c2a9,我不知道如何为所有字符系统地修复该问题。

谁能解释一下file.encoding对解密的影响以及如何防止字符被破坏?例如,应用程序在 linux 上的 wildfly 上运行,其中默认 file.encoding 是 UTF-8,更改整个应用程序的此值可能会产生其他副作用,因此需要更改 file.encoding 不是一个选项。

最后,这是一个误报,因为尽管 ISO 中的默认系统编码允许解密并保留重音字符,但真正的问题是在创建加密数据的过程中,我们从 Swagger UI 以 ISO 编码的字符串。为了修复我必须的数据,在加密之前,通过如下代码将其转换为 UTF:

新字符串(textToEncrypt.getBytes(java.nio.charset.StandardCharsets.ISO_8859_1), java.nio.charset.StandardCharsets.UTF_8);

现在,当默认文件编码为 UTF-8 时,解码工作正常。我认为最好将此信息保留在这里,以防其他开发人员遇到类似问题。