Android中的慢速AES解密

时间:2011-01-11 23:38:01

标签: android encryption aes

我尝试使用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));

2 个答案:

答案 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 ....