Android中的慢速AES解密

Lor*_*. T 6 encryption android aes

我尝试使用AES 128位密钥解密4.2 MB的.dcf文件,但解密时需要33秒(在函数cipher.doFinal(数据)上),这是正常的吗?

这是一段代码:

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));
Run Code Online (Sandbox Code Playgroud)

Tho*_*nin 2

您应该尝试在不写入文件的情况下测试所花费的时间,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 编译器,可以提高代码执行的性能)之外,几乎没有什么解决办法)。