0

私は Java の暗号化ライブラリを使用しており、IllegalBlockSizeException.

現在、データベースの内容を XML ファイル形式で抽出しようとしています。データ ダンプ中に、データベースで定義されたキーを使用して復号化される文字列を含むマニフェスト ファイルを作成しています。

その後、XML ファイルのコンテンツが別のデータベースに読み込まれるときに、そのデータベースからキーを取得し、それを使用してマニフェストを復号化します。復号化されたマニフェストが元のコンテンツと一致しない場合は、ソース データベースと宛先データベースの暗号化キーが一致しないことを意味し、ユーザーに通知されます。

以下はコードです。EncryptionEngine オブジェクトは、Java 暗号化ライブラリを使用して暗号化の多くの詳細を抽象化するシングルトンです。かなり古く成熟したコードであるため、正しく動作すると仮定します。

これはすべて私が作ったクラスです。まず、次のデータ メンバーがあります。

private final String encryptedManifestContents;
private final static String DECRYPTED_MANIFEST_CONTENTS = "This file contains the encrypted string for validating data in the dump and load process";
final static String ENCRYPTED_MANIFEST_FILENAME = "manifest.bin";

まず、暗号化プロセス。文字列は次のように暗号化されます。

final EncryptionEngine encryptionEngine = EncryptionEngine.getInstance();
encryptedManifestContents = encryptionEngine.symmetricEncrypt(DECRYPTED_MANIFEST_CONTENTS); // The contents get converted to bytes via getBytes("UTF-8")

次に、マニフェスト ファイルに書き込まれます (宛先は、ファイル パスを文字列として保持する単なる変数です)。

EncryptedManifestUtil encryptedManifestUtil = new EncryptedManifestUtil(); // The class I've created.  The constructor is the code above, which just initialized the EncryptionEngine and encrypted the manifest string.
manifestOut = new FileOutputStream(destination + "/" + ENCRYPTED_MANIFEST_FILENAME);
manifestOut.write(encryptedManifestUtil.encryptedManifestContents.getBytes("UTF-8"));

この時点で、暗号化プロセスが完了します。String を取得し、暗号化し、その内容をファイルに書き込みました。誰かがデータをロードすると、復号化プロセスが開始されます。

BufferedReader fileReader = new BufferedReader(new FileReader(filename)); // Filename is the manifest's file name and location
final EncryptionEngine encryptionEngine = EncryptionEngine.getInstance();
String decryptedManifest = encryptionEngine.decryptString(fileReader.readLine().getBytes("UTF-8")); // This is a symmetric decrypt

復号化が発生すると、次の例外がスローされます。

Caused by: javax.crypto.IllegalBlockSizeException: last block incomplete in decryption
    at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
    at javax.crypto.Cipher.doFinal(DashoA13*..)

ファイルを正しく読み書きしているように見えますが、内容が意味不明です。fileReader.readLine() の結果は次のとおりです。

9�Y�������䖷�߾��=Ă���    s7Cx�t�b��_-(�b��LFA���}�6�f����Ps�n�����ʢ�@��  �%��%�5P�p

助けてくれてありがとう。

編集:だから、ファイルへの書き込み方法を変更しました。

次の行を思い出してください。

encryptedManifestContents = encryptionEngine.symmetricEncrypt(DECRYPTED_MANIFEST_CONTENTS);

暗号化は、最初に入力された文字列からバイトを取得し、次に復号化し、最初にベース 64 バイトにエンコードすることによってバイトを文字列に戻します。次に、base 64 バイト配列を文字列に変換します。

これを念頭に置いて、ファイル ライターを FileOutputStream ではなく PrintWriter に変更し、バイトではなく文字列をファイルに直接書き込みます。残念ながら、まだエラーが発生しています。ただし、読み取り行から得られる文字列には � が少ないようです。

4

2 に答える 2

3

問題は fileReader.readLine() にあるようです-バイトストリームをファイルに書き込んでから、それを文字列として読み込んでいます。代わりに、この質問を参照するなど、バイト ストリームを読み取るか、Base64 エンコーディングを使用してバイト配列を文字列に変換し、ファイルに書き込み、ファイルから読み取り、バイトに戻す必要があります。配列。

于 2013-04-08T19:00:00.620 に答える
1

実際に厳密にバイト単位で処理したい場合に、文字を読み取るように定義されたオブジェクトである Reader を誤って使用していると思います。これはおそらく問題のすべてではありませんが、バイトを書き込んでいる場合は、文字ではなくバイトを読み取る必要があります。

于 2013-04-08T19:02:49.777 に答える