小编典典

Android上的慢速图像加密/解密

java

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

阅读 230

收藏
2020-11-30

共1个答案

小编典典

您应该尝试计算不写入文件所花费的时间,即,在调用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编译器,可以提高代码执行性能)。

2020-11-30