我为手机上的加密文件开发了一个Android应用程序。通过搜索,我找到了这个主题:How to encrypt file from SD card using AES in Android?
该方法工作正常,但加密文件的速度很慢...... 在这一行:byte [] d = new byte [8];为什么只有8个字节?我们不能设定更高的价值吗?
另外,您知道一种快速加密文件的方法吗?我听说过用于本机代码实现的crypto ++,但是如何在我的应用程序上实现JNI?
谢谢,
编辑:加密功能
public void encrypt (String RSAPrivateKey, String Key, byte[] iv, String zipname, ZipEncryptAsyncTask task) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException
{
FileInputStream fis = new FileInputStream (zipname + ".temp");
FileOutputStream fos = new FileOutputStream (zipname);
SecretKeySpec sks = new SecretKeySpec (Base64.decode(Key, Base64.DEFAULT), "AES");
IvParameterSpec ivspec = new IvParameterSpec (iv);
Cipher cipher = Cipher.getInstance ("AES/CBC/PKCS5Padding");
fos.write(String.valueOf(RSAPrivateKey.getBytes().length).getBytes());
fos.write(RSAPrivateKey.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, sks, ivspec);
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
long size = 0;
byte[] d = new byte[8];
for(int b; (b = fis.read(d)) != -1; )
{
cos.write(d, 0, b);
task.doProgress((size += 8));
}
cos.flush();
cos.close();
fis.close();
new File(zipname + ".temp").delete();
}
答案 0 :(得分:1)
作为替代方案,您可以考虑更改正在使用的密码模式。必须逐块串行使用CBC模式。计数器模式(CTR)可以与同时加密的不同块并行运行。当然,并行处理会产生开销,您需要重新编写代码,但如果缓冲区大小调整没有给您足够的速度增益,那么它可能是下一个尝试的选项。
答案 1 :(得分:0)
正如@CodesInChaos所说,一种方法是增加缓冲区的大小。 现在我做一个基准测试,确定缓冲区的最佳大小,并使用最佳值。