我尝试使用AES 128位密钥解密4.2 MB .dcf文件,但是解密(在cipher.doFinal(data)函数上)花费了33秒,这是否正常?
这是一个代码片段:
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));
您应该尝试计算不写入文件所花费的时间,即,在调用System.currentTimeMillis()之前和之后立即调用cipher.doFinal()。
System.currentTimeMillis()
cipher.doFinal()
话虽这么说,基于Android的手机通常使用最新的主频为500 MHz或更高的ARM处理器,并且从理论上讲,这种野兽每秒可以对几兆字节的数据进行AES加密或AES解密。
但是 ,Android代码使用名为Dalvik的几乎Java虚拟机。在Android-2.2之前,这是一个解释器(没有JIT编译器),这意味着它对于计算密集型任务来说有点慢。 如果 您观察到的中等性能确实来自AES操作本身(而不是文件写入), 那么 可能的答案是您的VM提供了用Java编写并用Dalvik解释的AES实现。在那种情况下,除了希望有更好的VM实现之外,没有什么治愈方法(VM可以对AES使用本机代码实现;而且,在Android 2.2及更高版本中,Dalvik拥有JIT编译器,可以提高代码执行性能)。