-1

AndroidでAESを使用していくつかのXMLファイルを暗号化し、FTPを使用してサーバーに送信し、LinuxターミナルでJavaを使用して暗号化を解除しようとしています。

AES、DES、トリプル DES などの暗号化方式で暗号化を試みましたが、FTP でサーバーにファイルを送信した後、一部 (約 25%) は復号化できず、常に同じものです。Androidエミュレーター内で受信したファイルの暗号化を解除しようとしましたが、どちらも機能しませんでした

また、spongycastle jarをダウンロードして、BouncyCastleライブラリの代わりに使用しようとしました.BouncyCastleライブラリは、どこかで読んでAndroid Javaで時代遅れになりましたが、どちらも機能しませんでした.

また、ファイルを暗号化する前に、すべての \r\n を削除しようとしました。

私が現在使用しているライブラリは次のとおりです。

エンコードデコードAES.java

私が今得ているエラーは、「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

4

1 に答える 1

1

Linuxで暗号化されたファイルを復号化しているときに(またはその逆)、AndroidのBase64クラスに関する非常によく似た問題に直面しました。Linuxは、進行中ではなく、のみを使用していまし\nた(または\r、覚えていません) 。\r\nこれにより、ファイルの長さが異なり、復号化に失敗していました。上記で、すべて\r\nが削除されたと述べましたが、チェックしていなかったと思います\n。一貫性があるはずの両方のケースをチェックしてみてください。

最後に、http://examples.oreilly.com/9781565924024/files/oreilly/jonathan/util/Base64.java は、一貫性を確保するために Android と Linux の両方で使用した Base64 クラスです。

于 2013-03-26T16:09:48.827 に答える