AndroidでAESを使用していくつかのXMLファイルを暗号化し、FTPを使用してサーバーに送信し、LinuxターミナルでJavaを使用して暗号化を解除しようとしています。
AES、DES、トリプル DES などの暗号化方式で暗号化を試みましたが、FTP でサーバーにファイルを送信した後、一部 (約 25%) は復号化できず、常に同じものです。Androidエミュレーター内で受信したファイルの暗号化を解除しようとしましたが、どちらも機能しませんでした
また、spongycastle jarをダウンロードして、BouncyCastleライブラリの代わりに使用しようとしました.BouncyCastleライブラリは、どこかで読んでAndroid Javaで時代遅れになりましたが、どちらも機能しませんでした.
また、ファイルを暗号化する前に、すべての \r\n を削除しようとしました。
私が現在使用しているライブラリは次のとおりです。
私が今得ているエラーは、「javax.crypto.IllegalBlockSizeException: 復号化で最後のブロックが不完全です」です。
現在、暗号化/復号化に使用しているコードは次のとおりです。
String fileNotEncrypted=Environment.getExternalStorageDirectory() + "unencrypted.xml";
RandomAccessFile fileNotEncryptedRa = new RandomAccessFile(fileNotEncrypted, "r");
byte[] textNotEncryptedByte = new byte[(int)fileNotEncryptedRa.length()];
fileNotEncryptedRa.read(textNotEncryptedByte);
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
byte[] textEncryptedByte = EncodeDecodeAES.encryptBytes("1234567890123456", textNotEncryptedByte);
String fileEncrypted=Environment.getExternalStorageDirectory() + "encrypted.xml";
FileOutputStream fos = new FileOutputStream(fileEncrypted);
fos.write(textEncryptedByte);
fos.close();
そして、これは私がFTPで受け取ったファイルを復号化するために使用しているコードです
Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
//encryptedFile is a String I get from main(String[] args), so I can use the code in a script easily
RandomAccessFile fileEncrypted = new RandomAccessFile(encryptedFile, "r");
byte[] textEncryptedByte = new byte[(int)fileEncrypted.length()];
fileEncrypted.read(textEncryptedByte);
byte[] textDecryptedByte = EncodeDecodeAES.decryptBytes("Dephi20101234567", textEncryptedByte);
//decriptedFile is another String got from main(String[] args)
FileOutputStream fos = new FileOutputStream(decryptedFile);
fos.write(textDecryptedByte);
fos.close();
解決:
この問題は、暗号文を FTP で送信しようとしたことが原因でした。私がしなければならなかったのは、暗号文を base64 にエンコードしてから、base64 をファイルに書き込み、そのファイルを FTP で送信することでした。
Base64 エンコーディングについては、ここにあるオープン ソース ライブラリを使用しています: Base64Coder