我一直在遵循教程“ How do I encrypt and decrypt files using DES?”向现有的AndroID 4应用添加简单的文件加密.
一切工作正常,除了加密和解密非常非常慢.
以下两种方法几乎是完整的教程:
public static voID encryptOrDecrypt(String key, int mode, inputStream is, OutputStream os) throws Throwable { DESKeySpec dks = new DESKeySpec(key.getBytes()); SecretKeyFactory skf = SecretKeyFactory.getInstance("DES"); SecretKey desKey = skf.generateSecret(dks); Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5padding for SunJCE if (mode == Cipher.ENCRYPT_MODE) { cipher.init(Cipher.ENCRYPT_MODE, desKey); CipherinputStream cis = new CipherinputStream(is, cipher); docopy(cis, os); } else if (mode == Cipher.DECRYPT_MODE) { cipher.init(Cipher.DECRYPT_MODE, desKey); CipherOutputStream cos = new CipherOutputStream(os, cipher); docopy(is, cos); }}public static voID docopy(inputStream is, OutputStream os) throws IOException { byte[] bytes = new byte[64]; int numBytes; // Why is this taking so long? while ((numBytes = is.read(bytes)) != -1) { os.write(bytes, 0, numBytes); } os.flush(); os.close(); is.close();}
非常简单和基本,但是解密/加密1 MB文件大约需要20-30秒.详细地说,是while循环在两个流之间复制字节,这太慢了.
将byte []的大小更改为较大的值(如65536)以一次读取更多字节不会改变任何内容.我认为一次读取更多字节将加快处理速度,但事实并非如此.
在没有加密的情况下在“正常”流之间复制数据不会花费很长时间.真的是这种昂贵的加密吗?我已经在其他平台上使用了类似的加密,而这样的延迟从来都不是问题.
本教程使用DES,但将算法更改为其他内容,例如AES也不更改任何内容.
有什么想法可以加快速度吗?
解决方法:
我基本上在运行AndroID 4.4.4的Google LG Nexus 5上进行了一些实验,使用您的代码并加密了一个1000000(百万)字节的文件,并读取了/ sdcard文件系统的内容.
no crypt 1421 msAES ECB mode 2577 msDES ECB 3214
接下来,我稍微修改了您的代码以使用BufferedInputStream和BufferedOutputStream
no crypt 88 msAES ECB mode 855 msDES ECB mode 1419 MS
这表明时序对缓冲很敏感,并且AES比DES快.
提供程序名称为“ AndroIDOpenSSL”
总结以上是内存溢出为你收集整理的android-将字节从FileInputStream复制到CipherOutputStream(反之亦然)非常慢全部内容,希望文章能够帮你解决android-将字节从FileInputStream复制到CipherOutputStream(反之亦然)非常慢所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)