OpenSSL 会自动检测并启用 AES-NI 硬件加速。
1、OpenSSL 在初始化时会通过 CPUID 指令检测处理器是否支持 AES-NI
2、支持则启动切换到硬件加速实现,否则退回软件实现
3、使用标准 EVP 接口,如:EVP_aes_128_cbc、EVP_aes_128_cfb 时,OpenSSL 内部自动选择最有实现。
4、OpenSSL 1.0.1+ 版本开始支持 AES-NI
5、推荐运行最低版本为:OpenSSL 1.1.0+
6、验证 AES-NI 是否启用(这通常于INTEL处理器上)
bash
# 检查支持的 CPU 特性
openssl list -cipher-commands | grep -i aes
# 测试速度(观察输出中是否有 'aes-ni' 字样)
openssl speed -elapsed aes-128-cbc
7、通过 C++ 代码验证
cpp
#include <openssl/evp.h>
#include <iostream>
int main() {
const EVP_CIPHER* cipher = EVP_aes_128_cbc();
// 检查是否使用硬件加速
if (EVP_CIPHER_flags(cipher) & EVP_CIPH_FLAG_AESNI) {
std::cout << "AES-NI acceleration is ENABLED" << std::endl;
} else {
std::cout << "Using software implementation" << std::endl;
}
return 0;
}
8、最佳实践建议
A、始终使用标准接口(EVP)
cpp
// 推荐方式(自动选择最优实现)
EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, key, iv);
B、避免低级别调用
1、不要使用 AES_encrypt 等低级函数(这些函数会绕过硬件加速,是纯软件实现)
2、坚持使用 EVP 高级封装接口
C、运行时检查(基于编译器宏,但这未必准确)
cpp
#include <openssl/opensslconf.h>
#ifdef OPENSSL_CPUID_OBJ
# ifdef OPENSSL_IA32_SSE2
std::cout << "AES-NI capable build" << std::endl;
# endif
#endif
特殊情况处理
如果遇到硬件加速未启用的情况:
1、确保 BIOS 中启用了 AES-NI (某些服务器默认禁用)
2、位于KVM虚拟机环境时
bash
# KVM 需添加 CPU 特性
-cpu host,aes=on
3、强制禁用,硬件加速(调试用)
bash
# 设置环境变量禁用硬件加速
export OPENSSL_ia32cap="~0x200000200000000"