我有一个 MS-Access 数据库,其中包含“加密”字符串。这些看起来像这样:
但是,我很快注意到这些字符串的长度与明文的长度完全匹配(我知道明文)。因此,通过对 Excel 的一些尝试,我发现如果您使用=CODE(<char>)
-function(因此您可以在默认字符集中获得字符代码,=CHAR(<number>)
反之亦然)并将这个数字与符号应该代表的字母的字符代码进行异或你总是得到相同的结果。这意味着我只需要在 java 中创建一个包含这些值的数组,瞧。Excel 示例(右侧提到的“数组”):
示例:“>>”的索引为 (dec) 187,因此 187xor253 产生 70 =>“F”
现在,我使用 jackcess 访问这些值,并且“解密”大部分都很好,但有时我会从字符串中得到错误的字符。在 Excel 中一切正常。具有最佳结果的代码:
public static final int[] DECRYPT_KEY = { 253, 203, 204, 217, 226, 205, 128, 201, 222, 183, 58, 217, 230, 201, 183, 211, 158, 203, 167, 213, 35, 33, 201, 123, 186, 247 };
public static void main(String[] args) throws IOException
{
System.out.println(System.getProperty("file.encoding"));
Database db = DatabaseBuilder.open(new File("/home/***/TM.db"));
Table table = db.getTable("personal");
for (Row row : table)
{
String vorname = row.getString("vorname");
byte[] vornameArr = vorname.getBytes("cp1252");
for (int i1 = 0; i1 < vornameArr.length; i1++)
{
vornameArr[i1] = (byte) ((vornameArr[i1] & 0xff) ^ DECRYPT_KEY[i1]);
}
System.out.println(new String(vornameArr, "cp1252"));
}
}
但正如我所说,有些字符仍然是错误的,但在 Excel 中一切都很好。当我打印出getBytes("cp1272")
给出的数字时,它与 Excel 完全不同。
您有什么想法吗,我可能做错了什么以及为什么 java 有时会给出与 Excel 不同的值?什么是更好的方法?我已经尝试了所有字符集组合,其中一些在其他失败的情况下有效,但随后出现了其他错误的结果。