2012-03-26 219 views
1

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

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

任何想法?

+1

了解如何分析您的代码。正如你所说,AES加密和解密速度是相同的,所以差别必须在其他地方。 – 2012-03-26 11:40:26

+0

所以这里有更多的细节。如果我将文件读入字节数组,然后在内存中解密或加密它需要相同的时间。但是使用CipherInputStream/CipherOutputStream会使处理时间显着不同。 – 2012-03-26 13:00:41

回答

5

在Stackoverflow上有很多贴子抱怨Android上的I/O操作很慢。通常这个问题对于执行第二次写入操作来说是不好的块大小。

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

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

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

此外,您必须考虑写入闪存始终比读取速度慢。

+0

是的,这是奇怪的事情。因为我的加密写入过程比读取解密过程快得多。 – 2012-03-26 15:24:36

+2

这可能是因为CipherInputStream使用内部缓冲,并且当您使用FileOutputStream直接写入字节时,字节是* not * buffered。从文件读取或写入文件时,始终建议创建缓冲区。这假设您在解密后再次将文件写入磁盘。 – 2012-03-26 15:36:36

2

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

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

如果你不想输出解密到一个文件,他们可能是其他方式来实现。也许根本不使用密码流。只需解密缓冲区。我还没有尝试过。

+0

你能分享你的代码吗? – 2016-10-25 07:51:28