我尝试使用 AES 128 位密钥解密 4.2 MB .dcf 文件,但解密需要 33 秒(在函数 cipher.doFinal(data) 上),这正常吗?
这是一个代码片段:
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()
.
话虽如此,基于 Android 的手机通常使用主频为 500 MHz 或更高的最新 ARM 处理器,理论上,这样的野兽每秒能够对数兆字节的数据进行 AES 加密或 AES 解密。
However,Android 代码使用一个几乎是 Java 的虚拟机,称为Dalvik http://en.wikipedia.org/wiki/Dalvik_%28software%29。在 Android-2.2 之前,这是一个解释器(没有 JIT 编译器),这意味着它对于计算密集型任务来说有点慢。If您观察到的平庸性能实际上来自 AES 操作本身(而不是文件写入)then合理的答案是,您的 VM 提供了一个用 Java 编写并用 Dalvik 解释的 AES 实现。在这种情况下,除了希望存在更好的 VM 实现(VM 可以使用 AES 的本机代码实现;此外,在 Android 2.2 及更高版本中,Dalvik 有一个即时编译器 http://en.wikipedia.org/wiki/Just-in-time_compilation这应该会提高代码执行的性能)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)