2011-01-11 46 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快....