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 で 16 進数をプレーンにエンコードするのでしょうか。これは、必要なサイズの 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 に答える