如何对加密库进行基准测试?

5

如何对加密库进行基准测试?

我们应该使用哪种单位(时间、CPU周期等)来比较不同的加密库?

是否有任何工具、程序等?

欢迎提出任何想法和评论!

感谢您的回答!


这将取决于可用的库和加密方案,以及您可用的平台选项。例如:您正在测试对称密钥还是非对称密钥加密?您是在测试加密还是仅数字签名生成?对您来说,密钥强度还是原始性能更重要? - Dan Esparza
4个回答

3
我猜您是指性能基准。我认为时间和周期都是有效的基准,因为某些代码在不同的架构上执行可能会有所不同(如果它们足够不同,则可能会有很大差异)。
如果这对您非常重要,我建议您自己进行测试。您可以使用一些计时器(几乎所有语言都有)或者使用一些分析器(几乎所有语言也都有)来确定您正在寻找的算法在目标平台上的确切性能。
如果您正在比较两种算法,您可以查找其他人已经收集到的数据,并且这将给您一个大致的想法。例如,这里是来自Crypto ++的一些基准测试: http://www.cryptopp.com/benchmarks.html 请注意,他们使用MB/秒和Cycles/Byte作为度量标准。我认为这些是非常好的选择。

3

在我之前有一些非常好的回答,但请记住,优化是通过时序攻击泄露关键材料的一种非常好的方式(例如,请参阅AES有多么具有毁灭性)。如果攻击者有任何机会计时您的操作,您需要选择可用的最恒定时间库(如果有任何人可以监视你,可能还需要选择最恒定的功率使用)。 OpenSSL在保持对当前攻击方面做得很好,不能保证其他库也是如此。


2
“什么是测试加密库性能的好方法?”
下面的答案是针对Crypto++库的,我不了解其他库,比如OpenSSL、Botan、BouncyCastle等。
Crypto++库内置了基准测试套件。
“我们应该使用哪个单位(时间、CPU周期等)来比较不同的加密库?” 通常情况下,性能是以每字节循环数(cycles-per-byte)为单位进行衡量的。每字节循环数取决于 CPU 频率。另一个相关的指标是吞吐量,以 MB/s 为单位进行衡量。它也取决于 CPU 频率。”
有什么工具、程序……吗?
git clone https://github.com/weidai11/cryptopp.git
cd cryptopp
make static cryptest.exe

# 2.0 GHz (use KB=1024; not 1000)
make bench CRYPTOPP_CPU_SPEED=1.8626

"make bench"将创建一个名为"benchmark.html"的文件。
如果您想手动运行测试,则:
./cryptest.exe b <time in seconds> <cpu speed in GHz>

它将输出类似 HTML 的表格,但不包括 <HEAD><BODY> 标签。您仍然可以在 Web 浏览器中查看它。
您还可以查看 Crypto++ 基准测试页面 Crypto++ Benchmarks。该信息已过时,但已列入我们的待办事项清单。
你还需要对正确性有敏锐的洞察力。例如,SSE4.2和ARMv8都有一个CRC32指令。每字节周期数应该从大约3或5个(仅软件)降至大约1或1.5个(硬件加速)。在现代运行约2 GHz的硬件上,这应该相当于从大约300或500 MB/s(仅软件)到大约1.5 GB/s(硬件加速)的变化。
其他技术,如SSE2和NEON,处理起来更加棘手。虽然有一些理论上的每字节周期数和吞吐量,但你可能不知道具体是多少。你可能需要联系算法的作者来了解。例如,我们联系了BLAKE2的作者,以了解我们的ARMv7 / ARMv8 NEON实现是否符合预期,因为它在作者的主页上缺少基准测试结果
我还发现GCC 4.6(及以上版本)和-O3可以在仅使用软件实现时产生很大的差异。这是因为GCC在-O3下进行了大量向量化处理,您可能会看到2倍至2.5倍的加速。例如,编译器可以生成在-O2下以40 cpb运行的代码。在-O3下,它可以以15或19 cpb运行。良好的SSE2或NEON实现应该比仅使用软件的实现快几个字节。在同样的例子中,SSE2或NEON实现可能以8到13 cpb的速度运行。
还有像OpenBenchmarking.org这样的网站,可以为您提供一些指标。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接