「暗号化された」文字列を含む MS-Access データベースがあります。これらは次のようになります。
しかし、これらの文字列の長さが平文の長さと正確に一致することにすぐに気付きました (私は平文を知っています)。そのため、Excel で少し試してみたところ、-関数を使用すると=CODE(<char>)
(デフォルトの文字セットで文字コードを取得し、その逆も=CHAR(<number>)
可能)、この数値を記号が表す文字の文字コードと xor することがわかりました。常に同じ結果が得られます。つまり、Java と voila でこれらの値を使用して配列を作成するだけです。Excel の例 (右側の「配列」):
例: ">>" は (10 進) 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")
とエクセルとは全然違います。
私が間違っている可能性があることと、JavaがExcelとは異なる値を与えることがあるのはなぜですか?より良いアプローチは何でしょうか?私はすでに文字セットのすべての組み合わせを試しました。いくつかは他の失敗した場所で機能しましたが、他の間違った結果が得られました。