我尝试使用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));
答案 0 :(得分:2)
你应该尝试在没有文件写入的情况下缩短所需的时间,即在调用System.currentTimeMillis()
之前和之后立即拨打cipher.doFinal()
。
话虽如此,基于Android的手机通常使用最新的时钟频率为500 MHz或更高的ARM处理器,而这样的野兽理论上每秒能够对几兆字节的数据进行AES加密或AES解密。
然而,Android代码使用名为Dalvik的几乎Java虚拟机。在Android-2.2之前,这是一个解释器(没有JIT编译器),这意味着它对于计算密集型任务来说有点慢。 如果您观察到的平庸性能实际上来自AES操作本身(而不是文件编写)那么合理的答案是您的VM提供了一个写入的AES实现Java和Dalvik解释。在这种情况下,除了希望存在更好的VM实现(VM可以使用AES的本机代码实现;同样,对于Android 2.2及更高版本,Dalvik有JIT compiler这应该提高性能代码执行)。
答案 1 :(得分:0)
AFAIK,无法通过Android API访问ARM芯片的AES加密/解密硬件: - (
不幸的是,这是对谷歌的巨大疏忽......在其他平台上使用AES更快 LOT ....