使用 AES 256(EVP 和非 EVP API)在同一硬件上不同性能的 openssl 速度

信息安全 AES openssl
2021-08-21 05:40:14

如果我像这样运行 openssl 1.0.1e:

$ ./openssl speed aes-256-cbc (i.e without EVP API)
Doing aes-256 cbc for 3s on 16 size blocks: 14388425 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 64 size blocks: 3861764 aes-256 cbc's in 2.99s
Doing aes-256 cbc for 3s on 256 size blocks: 976359 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 246145 aes-256 cbc's in 2.99s
Doing aes-256 cbc for 3s on 8192 size blocks: 30766 aes-256 cbc's in 3.00s

但是,如果我这样运行它:

$ ./openssl speed -evp AES256
Doing aes-256-cbc for 3s on 16 size blocks: 71299827 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 64 size blocks: 18742055 aes-256-cbc's in 2.99s
Doing aes-256-cbc for 3s on 256 size blocks: 4771917 aes-256-cbc's in 2.99s
Doing aes-256-cbc for 3s on 1024 size blocks: 1199158 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 8192 size blocks: 150768 aes-256-cbc's in 2.99s

OpenSSL 文档中,似乎对相同的密码使用 EVP 或不使用 EVP 应该没有任何区别。是的,我始终如一地看到它。任何人都可以提供见解吗?我用谷歌搜索了很多,但找不到任何东西。我会查看代码,但不确定我是否能理解那部分。

2个回答

在 OpenSSL 源代码中,speed aes-256-cbc函数调用AES_cbc_encrypt()本身使用AES_encrypt()的函数,来自crypto/aes/aes_x86core.c. 这是一个带有表格的明显“经典”实现。

另一方面,使用 EVP,您最终会在代码中crypto/evp/e_aes.c动态检测当前 CPU 是否支持AES-NI 指令,这是最近 x86 处理器的一项功能,可以大大提高性能。在 OpenSSL 代码中,宏完成了这项工作(使用CPUIDAESNI_CAPABLE提供初始化库时设置的一些标志)。

底线:使用 EVP,您可以从基于当前 CPU 模型的改进实现的自动选择中受益,而非 EVP 代码直接使用通用软件实现,它在任何地方都可以工作,但速度较慢。

还有一点需要注意:

$ ./openssl speed aes-256-cbc (i.e without EVP API)
Doing aes-256 cbc for 3s on 16 size blocks: 14388425 aes-256 cbc's in 3.00s
$ ./openssl speed -evp AES256
Doing aes-256-cbc for 3s on 16 size blocks: 71299827 aes-256-cbc's in 3.00s

不使用 EVP API,在 3.00 秒内,处理 14,388,425 (~14M)
使用 EVP API,在 3.00 秒内,处理 71,299,827 (~71M)

它显然在 EVP 模式下处理得更快。