java - Jackcess:MSAccess 数据库的字符集错误

标签 java excel encryption jackcess

我有一个 MS-Access 数据库,其中包含“加密”字符串。这些看起来像这样: encrypted strings

但是,我很快注意到这些字符串的长度与明文的长度完全匹配(我知道明文)。因此,通过尝试使用 Excel,我发现如果您使用 =CODE(<char>) -function (这样您就可以得到默认字符集中的字符代码,=CHAR(<number>) 反之亦然)并将该数字与该符号应代表的字母的字符代码进行异或,您总是得到相同的结果。这意味着我只需要在 java 中使用这些值创建一个数组,瞧。 Excel 示例(右侧提到的“数组”): excel example decoding 示例:“>>”的索引为 (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 不同的值?什么是更好的方法?我已经尝试了所有字符集组合,其中一些组合有效,另一些则失败,但随后出现了其他错误的结果。

最佳答案

我能够通过使用问题中的字节值破解数据库文件来重新创建您的问题。线路

byte[] vornameArr = vorname.getBytes("cp1252");

尝试将 vorname 字符转换为 cp1252 字节,但没有与 U+008F(十进制 143, SINGLE SHIFT THREE )对应的 cp1252 字符,因此 Java 将该字符转换为问号( 0x3F)。因此,您的解码步骤是解码 0x3F 而不是 0x8F,这就是为什么您得到“FadiÝa”而不是“Fadima”。

通过将上面的单行替换为

,我能够得到正确的结果
byte[] doubleBytes = vorname.getBytes("UTF-16LE");  // 187 0 170 0 168 0 ...
byte[] vornameArr = new byte[doubleBytes.length / 2];
for (int i = 0; i < vornameArr.length; i++) {
    vornameArr[i] = doubleBytes[i * 2];  // remove nulls
}

然后通过解码循环运行 vornameArr 字节。 (如果您愿意,也可以在上述循环中应用解码转换。)

关于java - Jackcess:MSAccess 数据库的字符集错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43146115/

相关文章:

javascript - 保护外部JS文件

java - 分发自签名SSL证书: How to skip requirement to import to key store

excel - 使用 OLEDB 将列添加到 Excel 中的工作表

c - 我用 c 编写了这个凯撒密码程序,但每次运行它都会崩溃

excel - Openpyxl,如何在使用 openpyxl .save() 函数保存后保留之前的 .xlsx 文件样式?

VBA:当单元格为特定值时获取行数据

encryption - 将初始化向量和盐与密文一起传递是否不安全?

java - 以编程方式更改应用程序资源语言后,SlidingTabLayout 的选项卡语言不会更改

java - 如何将可变参数传递给观察者?

java - java.lang.String无法转换为int…不确定我在做什么