java - 如何检测编码不匹配

标签 java encryption encoding

我有一堆旧的 AES 加密字符串,大致像这样加密:

  1. 字符串被转换为 ISO-8859-1 编码的字节
  2. 字节使用 AES 加密
  3. 结果转换为BASE64编码的字符数组

现在我想将新值的编码更改为 UTF8(例如,“€”不适用于 ISO-8859-1)。这意志的 如果我尝试使用 UTF-8 编码解密旧的 ISO-8859-1 编码值,当然会导致问题:

org.junit.ComparisonFailure: expected:<!#[¤%&/()=?^*ÄÖÖÅ_:;>½§@${[]}<|'äöå-.,+´¨]'-Lorem ipsum dolor ...> but was:<!#[�%&/()=?^*����_:;>��@${[]}<|'���-.,+��]'-Lorem ipsum dolor ...>

我正在考虑为此创建一些自动编码回退。

所以主要问题是是否足以检查解密的字符数组中的“�”字符以找出编码不匹配?声明“�”的“正确”方法是什么? ' 比较时的符号?

if (new String(utf8decryptedCharArray).contains("�")) {
    // Revert to doing the decrypting with ISO-8859-1
    decryptAsISO...
}

最佳答案

解密时,你会得到原始的字节序列(第一步的结果),然后你只能根据 ISO-8859-1 或 UTF-8 编码猜测这些字节表示字符。

从一个字节序列中,无法清楚地说明它是如何被解释的。

一些想法:

  • 您可以迁移所有旧的加密字符串(解密、使用 ISO-8859-1 解码为字符串、使用 UTF-8 编码为字节数组、加密)。那么问题就一劳永逸地解决了。
  • 你可以尝试解码两个版本的字节数组,看看一个版本是否非法,或者两个版本是否相等,如果仍然不明确,则根据预期的字符取概率较高的那个。我不建议这样做,因为它需要大量工作,而且仍然有可能出错。
  • 对于新条目,您可以在字符串/字节序列前添加一些未出现在 ISO-8859-1 文本中的标记。例如。有些人按照惯例在 UTF-8 编码文件的开头添加字节顺序标记。尽管生成的字节 (EF BB BF) 在 ISO-8859-1 中并非严格非法(被读作 ),但它们极不可能。然后,当您解密的字节以 EF BB BF 开头时,使用 UTF-8 解码为字符串,否则使用 ISO-8859-1。尽管如此,出错的概率仍非零。

如果可能的话,我会迁移现有条目。否则,您将不得不在您的代码库中永远使用“旧格式兼容性内容”,并且仍然不能绝对保证正确的行为。

关于java - 如何检测编码不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66759559/

相关文章:

c# - 字符串编码相关问题

java - 使用 java 的 KeyPairGenerator 的 openssl 等效项是什么?

java - 为什么SWT List填充全复合?

java - Android:登录的后台进程

java - Spring Data 和 Mongo Java 驱动程序的错误处理

java - 错误填充异常 - pkcs11 中的 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING

ssl - 是否可以使用带有服务器证书和客户端密码的 SSL?

java - 如何使用BigDecimal增加分期利息?

java - 线程 "main"javax.crypto.BadPaddingException : Decryption error 中的异常

python - AutoKey - Clipboard.get_selection() 函数在某些字符串上失败