我正在编写一个加密和解密文件的应用程序。我正在使用CipherInputStream和CipherOutputStream来使用AES256位密码进行加密/解密过程。
我的问题是,如果我采用字节数组并写入文件来实现加密,它比我解密创建字节数组的文件花费的时间少2倍。这很奇怪,因为我知道AES加密和解密是对称过程,它们应该花费相同的时间来完成。
有什么想法吗?
答案 0 :(得分:5)
Stackoverflow上有很多帖子抱怨Android上的I / O操作速度慢。通常,问题是执行写操作的块大小。
智能手机中使用的闪存被组织成几千字节的大块 - 因此为了获得最佳写入速度,您应该只写4KB或更多的块。
像AES一样的密码在8字节的块上以块为单位工作 - 这可能会导致大量的性能消耗。
我建议通过缓冲区大小为4或16 KB的BufferedOutputStream发送CipherOutputStream的输出。这应该会显着加快这一过程。
此外,您必须考虑写入闪存始终比读取速度慢。
答案 1 :(得分:2)
不确定您的代码是什么样的。
我修复了类似的慢速解密问题。我的原始代码引用了最流行的Android加密/解密示例。它使用CipherOutputStream进行加密,并使用CipherInputStream进行解密。我发现解密比加密慢大约4倍。最终我发现问题是CipherInputStream。它比CipherOutputStream慢得多。修复方法是使用CipherOutputStream进行加密和解密,并将Cipher从加密翻转到解密。之后,解密就像加密一样快。
如果您不想将解密输出到文件,它们可能是实现此目的的其他方法。也许根本不使用密码流。只是解密缓冲区。我还没试过。