0

I import an XML file as a byte array to the project

RandomAccessFile rnd = new RandomAccessFile(filePath, "r");
byte[] fileData = new byte[(int) rnd.length()];
rnd.read(fileData);

I encrypted the array using java.crypto

Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");

byte[] encypted = new byte[cipher.getOutputSize(fileData.length)];
int len = cipher.update(fileData, 0, fileData.length, encypted, 0);
len += cipher.doFinal(encypted, len);

When I decrypt the byte array and print it using

System.out.println(new String(decrypted, "UTF-8"));

I got the XML file but there were some unkown characters at the end (they are only at the end). Is there any way I can remove this?

Thanks in advance

4

3 に答える 3

2

ここで同様の質問を参照してください、しかし答えはあなたの状況に非常に関連しているかもしれないものです:

1.暗号化に使用されたパディングがわからない場合は、「パディングなし」を設定して復号化します。これにより、パディングを含むすべてが復号化され、パディングの不一致が原因でエラーがスローされることはありません。

2.暗号文を復号化したら、出力の最後のブロックを見て、使用されたパディングを確認します。パディングが異なれば、バイトパターンも異なるため、通常は簡単にわかります。

3.正しいタイプのパディングを期待するように復号化方法を設定すると、自動的に削除されます。

これがあなたに関係がある場合は、ここにパディングパターンなどのリンクがあります:パディングウィキペディア

これは、DESを使用して暗号化するための非常に優れたチュートリアルでもあります:http://www.exampledepot.com/egs/javax.crypto/desstring.htmlそしてここにDESのPBEがあります: HMAC(SHA1)とDES( EDE)

于 2012-07-02T11:10:41.130 に答える
0

重要かもしれない欠落しているコードがたくさんあります。私が注意することの1つは、文字エンコードを指定せずにデータを読み込んでいることです。次に、復号化時に、UTF-8デコーダーを使用して文字列を作成しています。これは、元のXMLファイルがUTF-8でエンコードされている場合にのみ意味があり、これは完全に可能です。また、RandomAccessFile.read()実際に読み取られたバイト数を含むintを返します。配列全体が読み込まれると想定するのではなく、その番号を使用することになっています。

于 2012-07-03T00:43:31.113 に答える
-1

パディングを変更しましたが、機能しました。

cipher = Cipher.getInstance("DESede/CFB8/NoPadding");
于 2012-07-04T04:56:27.270 に答える