Android文件解密和加密需要时间

我在文件下载时在android中完成了加密和解密,但我希望在文件解密时提高时间性能。 我的问题是当我下载任何文件,所以我在那里添加加密,但在这个阶段我显示进度加载器所以它看起来不错,但是当文件完全下载并尝试打开该文件然后它解密该文件这次它是花太多时间。 这看起来很糟糕。 如何减少解密时间? 这是我的代码

加密代码

byte data[] = new byte[1024]; String seed = "password"; byte[] rawKey = getRawKey(seed.getBytes()); SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); output = new CipherOutputStream(output, cipher); long total = 0; while ((count = input.read(data)) != -1) { total += count; publishProgress("" + (int) ((total * 100) / lenghtOfFile)); output.write(data, 0, count); } 

解密代码在这里:

 String newPath = sdCardPath + "/" + dPdfName; File f1 = new File(newPath); if (!f1.exists()) try { f1.createNewFile(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { InputStream fis = new FileInputStream(f); OutputStream fos = new FileOutputStream(f1); String seed = "password"; byte[] rawKey = getRawKey(seed.getBytes()); SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); fis = new CipherInputStream(fis, cipher); int b; byte[] data = new byte[4096]; while ((b = fis.read(data)) != -1) { // fos.write(cipher.doFinal(data), 0, b); fos.write(data, 0, b); } fos.flush(); fos.close(); fis.close(); } catch (Exception e) { // TODO: handle exceptionpri e.printStackTrace(); } 

获取行密钥方法:

 private static byte[] getRawKey(byte[] seed) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(seed); kgen.init(128, sr); SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); return raw; } 

建议:

1)将解密移动到另一个asynctask并添加另一个进度指示器。

2)保留最后,比如10%的进度指示器进行解密。 这是我实际做过的一次,但我正在进行完整性检查(针对MD5哈希IIRC),而不是解密。

3)将解密移动到下载异步,立即解密每个接收到的数据部分,从而隐藏下载时间背后的解密时间。

4)不确定这会更快,但你可能有两个服务线程:一个下载文件,另一个解密。 最好不要在这里使用AsyncTask,因为它们可能在不同版本的Android上表现不同(包括在单个线程上顺序执行,请参阅AsyncTask是否真的在概念上存在缺陷,或者我只是缺少一些东西?讨论,以及我的说明https:/ /stackoverflow.com/a/14602486/755804 )

另请注意,负责下载和解密的线程属于Model (在MVC意义上),并且不得归属于一个不能超过屏幕转向的Controller的Activity: https : //stackoverflow.com/a/14603375/755804

如果您的下载需要很长时间,您可能会对恢复中断的下载感兴趣,最好从一开始就考虑它。 修改简单的解决方案总是更容易,而multithreading解决方案相当复杂。 如果您传输了多个文件,则可能会发生其中一个文件在传输过程中损坏,并且您可能希望选项仅重新传输已损坏的文件。 您可能还需要完整性检查。

确保将数据缓冲区与加密的块大小对齐。

有关示例,请参阅: https : //stackoverflow.com/a/33171612/475496

使用这种方法可以加快我们的加密速度。