2011-03-23 35 views
5

什么是测试加密库的好测试?如何对加密库进行基准测试?

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

是否有任何工具,程序....?

任何想法,评论是欢迎的!

谢谢您的输入!

+0

这将取决于可用的库和加密方案以及您可用的平台选项。例如:您正在测试的是对称密钥还是非对称密钥加密?您是在测试加密还是只是数字签名生成?关键优势或原始表现对你更重要吗? – 2011-03-23 17:55:56

回答

2

什么是测试加密库的好测试?

下面的答案在Crypto ++的上下文中。我现在不了解其他库,如OpenSSL,Botan,BouncyCastle等。

Crypto ++库有一个内置的基准测试套件。


哪个单位(时间,CPU周期等),我们应该使用比较型动物加密库?

您通常以每字节的周期数来衡量性能。每个字节的周期取决于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>标签。您仍然可以在网络浏览器中查看它。

您还可以在Crypto++ Benchmarks上查看Crypto ++基准测试页。信息的日期和它在我们的TODO清单上。


你也需要accumen为什么看起来是正确的。例如,SSE4.2和ARMv8有一个CRC32指令。每个字节的周期应该从大约3或5 cpb(仅软件)到大约1或1.5 cpb(硬件加速)。它应该等同于在大约2 GHz的现代硬件上大约300或500 MB/s(仅软件)的变化,大约1.5 GB/s(硬件加速)。

其他技术,如SSE2和NEON,更难处理。理论上每个字节的循环数和吞吐量应该可以看到,但是你可能不知道它是什么。您可能需要联系算法的作者才能找到答案。例如,我们联系了BLAKE2的作者,了解我们的ARMv7/ARMv8 NEON实现是否按预期执行,因为它是作者主页上的missing benchmark results

我也发现GCC 4.6(及以上版本)和-O3可以在仅有软件的实现方面有很大的不同。这是因为GCC在-O3的矢量化程度很高,您可能会看到2倍到2.5倍的加速。例如,编译器可能会生成运行在40 cpb的代码-O2。在-O3它可能运行在15或19 cpb。一个好的SSE2或NEON实现应该比单纯软件实现至少每个字节少几个周期。在同一个例子中,SSE2或NEON的实现可能运行在8至13 cpb。

还有像OpenBenchmarking.org这样的网站,可以为您提供一些指标。

3

我假设你的意思是性能基准。我会说时间和周期都是有效的基准,因为一些代码可能在不同的体系结构上执行不同的操作(如果它们不同,可能会大相径庭)。

如果这对你来说非常重要,我会自己做测试。你可以使用一些计时器(几乎所有的语言都有一个计时器),或者你可以使用一些分析器(几乎所有的语言都有其中一种)来找出你在目标平台上寻找的算法的确切性能。

如果您正在查看一种算法与另一种算法,您可以查找其他人已经收集的数据,这会给您一个粗略的想法。例如,以下是来自Crypto ++的一些基准: http://www.cryptopp.com/benchmarks.html

请注意,它们使用MB /秒和周期/字节作为度量标准。我认为这是非常好的选择。

3

我面前的一些非常好的答案,但请记住,优化是通过timing attack(例如参见how devastating it can be for AES)泄漏密钥材料的一种非常好的方式。如果攻击者有任何机会计算你的操作时间,你不想要最快但最稳定的时间库(如果有人可以监控你的电脑,可能是最常用的电源使用情况)。 OpenSSL在保护当前攻击方面做得非常出色,不一定会说出与其他库相同的东西。

相关问题