【问题标题】:AES256 Encryption/Decryption speedAES256 加密/解密速度
【发布时间】:2012-04-09 21:10:50
【问题描述】:

我正在编写一个加密和解密文件的应用程序。我正在使用 CipherInputStream 和 CipherOutputStream 进行使用 AES256 位密码的加密/解密过程。

我的问题是,如果我使用字节数组并即时写入文件进行加密,它所花费的时间比我解密文件创建字节数组所需的时间少 2 倍。这很奇怪,因为我知道 AES 加密和解密是对称过程,它们应该花费相同的时间来完成。

有什么想法吗?

【问题讨论】:

  • 了解如何分析您的代码。就像你说的,AES加解密是一样的速度,所以区别肯定在别的地方。
  • 所以这里有更多细节。如果我将文件读入字节数组然后在内存中解密或加密它需要相同的时间。但是使用 CipherInputStream/CipherOutputStream 会显着缩短处理时间。

标签: android encryption aes


【解决方案1】:

Stackoverflow 上有很多帖子抱怨 Android 上的 I/O 操作缓慢。很多时候,问题是执行写入操作的块大小错误。

智能手机中使用的闪存以数千字节的大块形式组织 - 因此,为了获得最佳写入速度,您应该只写入 4KB 或多个 4KB 的块。

像 AES 这样的密码在 8 字节块上按块工作 - 这可能会导致大量性能消耗。

我建议通过缓冲区大小为 4 或 16 KB 的 BufferedOutputStream 发送 CipherOutputStream 的输出。这应该会显着加快进程。

此外,您必须考虑写入闪存总是比读取慢。

【讨论】:

  • 是的,这很奇怪。因为我的加密-写入过程比读取-解密过程快得多。
  • 这可能是因为 CipherInputStream 使用内部缓冲,并且当您直接使用 FileOutputStream 写入字节时,字节是 not 缓冲的。在读取或写入文件时,始终建议创建缓冲区。这是假设您在解密后再次将文件写入磁盘。
【解决方案2】:

不确定您的代码是什么样的。

我修复了一个类似的慢速解密问题。我的原始代码引用了最流行的 Android 加密/解密示例。它使用 CipherOutputStream 加密和 CipherInputStream 解密。我发现解密比加密慢大约 4 倍。最终我发现问题是 CipherInputStream。它比 CipherOutputStream 慢得多。解决方法是使用 CipherOutputStream 进行加密和解密,并将 Cipher 从加密翻转为解密。之后,解密和加密一样快。

如果您不想将解密后的内容输出到文件中,它们可能是其他方法来实现这一点。也许根本不使用密码流。只需解密缓冲区。我还没试过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多