Java Android AES文件加密有时会失败

Java Android AES文件加密有时会失败,java,android,encryption,aes,padding,Java,Android,Encryption,Aes,Padding,我一直在尝试用AES在android中加密一些XML文件,用FTP将它们发送到服务器,然后用java在Linux终端中取消加密 我尝试使用AES、DES、Triple DES和其他加密方法进行加密,但通过FTP将文件发送到服务器后,其中一些(约25%)无法解密,始终是相同的。 我还尝试在android仿真器中对接收到的文件进行解密,但也没有成功 我还尝试下载spongycastle JAR并使用它们来代替BouncyCastle库,我在某个地方读到它在android java中已经过时了,但它也

我一直在尝试用AES在android中加密一些XML文件,用FTP将它们发送到服务器,然后用java在Linux终端中取消加密

我尝试使用AES、DES、Triple DES和其他加密方法进行加密,但通过FTP将文件发送到服务器后,其中一些(约25%)无法解密,始终是相同的。 我还尝试在android仿真器中对接收到的文件进行解密,但也没有成功

我还尝试下载spongycastle JAR并使用它们来代替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编码,我使用以下开源库:

在解密Linux上加密的文件时,我遇到了一个与android Base64类非常相似的问题(反之亦然)。Linux只使用了
\n
(或者只使用
\r
,不记得了)而不是正在进行的
\r\n
。这导致文件长度不同,解密失败。上面,您声明所有
\r\n
都已删除,但我猜您没有检查
\n
。试着检查两种情况是否一致


最后,是我在android和Linux上使用的Base64类,以确保一致性。

这有点不清楚,但问题似乎在于您的密文。然而,听起来你一直在关注你的明文,你是在编码你的密文吗?你的ftp传输可靠吗?我试着用ftp重新发送文件,以防传输出现问题,但在第一次传输中失败的文件仍然在同一点上失败。我使用FileOutputStream将cyphertext直接放入文件中,然后在尝试解密之前不要再触摸它。我将编辑帖子并添加用于解密的代码,以防万一。Ftp协议确实有编码,编码问题可能会导致类似的问题,您可能希望尝试对密文进行base64编码以进行传输。您知道
RandomAccessFile.read
需要在循环中进行吗?直到它返回-1?我正在使用RandomAccessFile.read进行最后2次测试(到现在为止已经完成了21次),之前也遇到过同样的问题。但是我们从一开始就使用ftp,所以base64编码密文的想法是一个好主意。我将尝试一下并公布结果。我以为使用ftp传输文件会在服务器中生成文件的一点一点完美副本…没错,我没有检查\n。我也会试试看它是否有效。谢谢你的建议。最后,和\n\r没有给我带来任何麻烦。我检查了新方法,目的是插入一些linux和windows的回车,它们被正确地加密/解密。无论如何,谢谢你的主意:)