AES内存效率

时间:2016-03-22 23:30:34

标签: c++ memory encryption memory-management aes

我正在使用CTR块链接编写用于AES加密的C ++程序,但我的问题并不需要知道。

我想知道我应该缓冲多少文件以加密并输出到新的加密文件。我问这个是因为我知道磁盘读取非常昂贵所以它只是有意义,如果可能的话,我应该读取并缓冲整个原始文件,加密,输出到新文件。但是,如果文件是1gb,我不想在加密期间在主内存中保留整整1gb。

所以,我很好奇最佳缓冲区大小是多少?例如,缓冲100mb并执行10次加密迭代以处理整个1gb文件。感谢。

2 个答案:

答案 0 :(得分:4)

Memory map文件,让系统找出正确的缓冲区大小。

通常,文件缓冲到主存储器中(在服务器和桌面系统上)。因此,应用程序中的缓冲区大小可以保持相对较小。 1 MiB将是充足的,并且在具有1 GiB主存或更多的任何系统上可能无关紧要。

在不缓冲内存的嵌入式系统上,可能需要一些人确定下面发生了什么以及需要占用多少内存。我认为大约1-8 KiB的缓冲区是一个很好的最低要求。如果你低于那个,你也可能想要为AES操作计时。

为了确保以后可以优化,您可能希望保持缓冲区为64字节的倍数(AES的块大小为16字节,SHA-2 512的块大小为64字节)。一般情况下,尝试并保持2的全功率或尽可能接近(一个MiB为2 ^ 20字节)。

答案 1 :(得分:2)

谁在告诉你“磁盘读取非常昂贵”?除非您正在处理数TB的数据,否则IO的成本将非常低,您将很难对其进行测量。 1MB缓冲区将超出您的需求。我打赌你很难找到64KB到1MB或更高的基准差异。

一个例外情况是,如果你从一个非常慢的设备上读取大量数据,比如在拥挤的网络上的NAS驱动器,但即使这样,我也会考虑任何努力实现缓冲是一种错误的优化。在这种情况下,将数据复制到本地驱动器,将其从本地存储中处理。

无论如何,C ++会以合理的默认值缓冲输入和输出,而且大多数操作系统会在您按顺序读取时获取数据块,以便提高检索效率。除非你有一个非常令人信服的理由,坚持正常行为。不需要编写自定义缓冲代码。