2011-01-11 48 views
6

我试图使用AES 128位密钥解密一个4.2 MB的.dcf文件,但解密需要33秒(在函数cipher.doFinal(data)上),这是正常吗?在Android中缓慢的AES解密

下面的代码片段:

long start = System.currentTimeMillis()/1000L; 
      try { 
       SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
       cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec); 

       android.util.Log.d("TEST", "Start decoding...." + String.valueOf(length)); 

       byte[] decrypted = cipher.doFinal(content); 

       File file2 = new File(Environment.getExternalStorageDirectory().getPath() + "/test.mp3"); 
       OutputStream os = new FileOutputStream(file2); 
       os.write(decrypted); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
      long end = System.currentTimeMillis()/1000L; 

      android.util.Log.d("TEST","Time "+ String.valueOf(end-start)); 
+0

我希望这将取决于硬件? - 我的愿望做某些事情比我的妻子的野火快了不少,例如你在上 – Squonk 2011-01-12 00:09:04

+0

@MisterSquonk尝试这个,我试过它在仿真器上花费了大约30-33秒,在我的三星Galaxy Spica上花费了大约25-30秒 – 2011-01-12 15:33:33

回答

2

你应该尝试板凳不写文件所用的时间,即调用cipher.doFinal()后立即之前和正确的判罚System.currentTimeMillis()。这就是说,基于Android的手机通常使用最新的主频为500 MHz或更高的ARM处理器,而且这种野兽理论上能够每秒钟对数兆字节的数据进行AES加密或AES解密。

但是,Android代码使用了一个名为Dalvik的几乎Java虚拟机。在Android-2.2之前,这是一个解释器(没有JIT编译器),这意味着它对计算密集型任务而言有点慢。 If您观察到的平庸表现确实来自AES操作本身(而不是文件编写)然后合理的答案是您的虚拟机提供了一个用Java编写并与Dalvik一起解释的AES实现。在那种情况下,除了希望有更好的虚拟机实现(虚拟机可以使用AES的本机代码实现;除此之外,在Android 2.2及更高版本中,Dalvik具有JIT compiler,这应该可以提高代码执行的性能) 。

0

AFAIK,有没有办法让通过Android的API访问ARM芯片的AES加密/解密硬件:-(

这是对谷歌的一部分不幸的是一个巨大的监督......使用AES在其他平台使得一个LOT快....