2

我有一个 48 个字符的AES-192加密密钥,我用它来解密一个加密的数据库。

但是,它告诉我密钥长度无效,所以我记录了 getBytes() 的结果。

当我执行时:

final String string = "346a23652a46392b4d73257c67317e352e3372482177652c";
final byte[] utf32Bytes = string.getBytes("UTF-32");
System.out.println(utf32Bytes.length);

在我的 mac(Java 虚拟机)上使用 BlueJ,我得到192了输出。

但是,当我使用:

Log.d(C.TAG, "Key Length: " + String.valueOf("346a23652a46392b4d73257c67317e352e3372482177652c".getBytes("UTF-32").length));

我得到196作为输出。

有谁知道为什么会发生这种情况,以及 Dalvik 从哪里获得额外的 4 个字节?

4

2 回答 2

15

您应该在两台机器上指定字节顺序

final byte[] utf32Bytes = string.getBytes("UTF-32BE");

注意"UTF-32BE"是不同的编码,不是特殊.getBytes参数。它具有固定的字节顺序,不需要 BOM。更多信息:http ://www.unicode.org/faq/utf_bom.html#gen6

于 2012-11-29T15:19:02.050 回答
2

你为什么要 UTF-32 编码一个十六进制数字。这比它需要的大 8 倍。:P

String s = "346a23652a46392b4d73257c67317e352e3372482177652c";
byte[] bytes = new BigInteger(s, 16).toByteArray();
String s2 = new BigInteger(1, bytes).toString(16);
System.out.println("Strings match is "+s.equals(s2)+" length "+bytes.length);

印刷

Strings match is true length 24
于 2012-11-29T15:24:14.343 回答