【问题标题】:Slow AES decryption in AndroidAndroid 中的慢速 AES 解密
【发布时间】:2011-06-07 12:39:19
【问题描述】:

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

这是一个代码sn-p:

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));

【问题讨论】:

  • 我预计这将取决于硬件 - 例如,我的 Desire 在某些事情上比我妻子的 Wildfire 快得多。你在试什么?
  • @MisterSquonk,我在模拟器上试了一下,大约需要 30-33 秒,在我的三星 Galaxy Spica 上,大约需要 25-30 秒。
  • 如果您解释我将如何创建一个您正在解密的文件,我会在我的 HTC Desire (Froyo) 上尝试您的代码,如果它对您有用的话知道结果。
  • @MisterSquonk:我在朋友的 N1 上试过,只用了 2 秒。没错,这取决于硬件和 froyo(使用 jit 编译器)
  • 哇,差别很大。有兴趣知道,感谢您的更新。

标签: android encryption aes


【解决方案1】:

AFAIK,无法通过 Android API 访问 ARM 芯片的 AES 加密/解密硬件 :-(

不幸的是,这对 Google 来说是一个巨大的疏忽……这使得在其他平台上使用 AES 很多更快……

【讨论】:

    【解决方案2】:

    您应该尝试计算不写入文件所花费的时间,即在调用 cipher.doFinal() 之前和之后调用 System.currentTimeMillis()

    话虽如此,基于 Android 的手机通常使用时钟频率为 500 MHz 或更高的最新 ARM 处理器,这样的野兽理论上能够每秒对数兆字节的数据进行 AES 加密或 AES 解密。

    然而,Android 代码使用一个类似于 Java 的虚拟机,称为 Dalvik。在 Android-2.2 之前,这是一个解释器(没有 JIT 编译器),这意味着它对于计算密集型任务来说有点慢。 如果你观察到的平庸性能真的来自 AES 操作本身(而不是文件写入)那么合理的答案是你的 VM 提供了一个用Java 并用 Dalvik 解释。在这种情况下,除了希望存在更好的 VM 实现(VM 可以使用 AES 的本机代码实现;此外,对于 Android 2.2 及更高版本,Dalvik 有一个 JIT compiler 应该可以提高代码性能执行)。

    【讨论】:

    • 您好 Thomas,感谢您的回答。我已经删除了文件写入,在 froyo 模拟器上的 cipher.doFinal 函数大约需要 30-33 秒,在三星 Galaxy Spica (eclair) 上大约需要 25-30 秒。我的朋友在黑莓上做了同样的任务,花了大约 8 秒。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 2014-11-17
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多