私は 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 に変更し、バイトではなく文字列をファイルに直接書き込みます。残念ながら、まだエラーが発生しています。ただし、読み取り行から得られる文字列には � が少ないようです。