【发布时间】:2021-03-23 08:26:45
【问题描述】:
我有一堆旧的 AES 加密字符串,大致如下加密:
- 使用 ISO-8859-1 编码将字符串转换为字节
- 字节使用 AES 加密
- 结果转换为 BASE64 编码的字符数组
现在我想将新值的编码更改为 UTF8(例如,'€' 不适用于 ISO-8859-1)。这种意志 如果我尝试使用 UTF-8 编码解密旧的 ISO-8859-1 编码值,当然会导致问题:
org.junit.ComparisonFailure: expected:<!#[¤%&/()=?^*ÄÖÖÅ_:;>½§@${[]}<|'äöå-.,+´¨]'-Lorem ipsum dolor ...> but was:<!#[�%&/()=?^*����_:;>��@${[]}<|'���-.,+��]'-Lorem ipsum dolor ...>
我正在考虑为此创建一些自动编码回退。
所以主要问题是 检查解密的 char 数组中的“�”字符是否足以找出编码不匹配?什么是声明“�”的“正确”方式' 比较时的符号?
if (new String(utf8decryptedCharArray).contains("�")) {
// Revert to doing the decrypting with ISO-8859-1
decryptAsISO...
}
【问题讨论】:
-
不可能知道,除非您有一组特定的字符不能出现在原始字符串上,您可以检查解密的字符串(当然在编码为 UTF8 时会出现)。我认为最好的解决方案是将元数据附加到要使用的实际编码中。
-
实际上,您必须事先知道您正在处理的字节中使用了什么编码。或者你必须尝试一些编码检测,这是一项有点复杂的任务。
-
也许可以尝试使用两种编码解密您的数据并分析两者的结果?
-
@m0skit0 提出的解决方案可行,但我宁愿解决这个问题而不必处理。
-
@Seelenvirtuose 如果我尝试两种编码,我应该从结果中分析什么?在某些情况下结果是相同的(等于),但在某些情况下结果是不同的(!等于)......仍然不知道哪个是正确的?我想出的唯一一件事就是找到那个“�”字符(当系统无法将数据流呈现为正确的符号时,它用于指示问题)
标签: java encryption encoding