概述
AES是世界上最安全、使用廣泛的加密算法,很多安全合規要求裏面都明確要求使用AES算法,只是相對於3des、rc4等加密算法,速度慢了很多,幸好有了AES-NI,這是針對AES加密算法的硬件加解密CPU指令集。
AES-NI的全稱是:Advanced Encryption Standard New Instructions。指令集說明
更多詳細的信息可以參考Intel發佈的企業安全AES-NI白皮書,本文重點在目前阿里公有云上的主流機型上進行性能測試對比,用於RDS的SSL(鏈路加密)和TDE(透明加密)特性中。
支持AES-NI指令集的Intel CPU列表,基本上2010年之後的Intel CPU都支持,另外AMD和ARM的一些型號也支持。
支持AES-NI的安全和加密軟件庫
絕大多數現代編譯器都支持AES-NI指令。常見的支持AES-NI的安全加密軟件庫:
- Cryptography API: Next Generation (CNG) (requires Windows)[27]
- Linux's Crypto API
- Java 7 HotSpot
- Network Security Services (NSS) version 3.13 and above28
- Solaris Cryptographic Framework[29] on Solaris 10 onwards
- FreeBSD's OpenCrypto API (aesni(4) driver)[30]
- OpenSSL 1.0.1 and above[31]
- FLAM®/FLUC® 5.1.08 (released 2015-08-24) and above
查看CPU信息
測試的目標機器是D13機型,具體CPU配置如下:
#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
CPU socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 45
Stepping: 7
CPU MHz: 2194.853
BogoMIPS: 4388.87
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 15360K
NUMA node0 CPU(s): 0-23
檢查系統是否支持AES-NI指令
D13機型24個核都開啓了AES-NI
#grep -m1 -o aes /proc/cpuinfo
aes
#grep -o aes /proc/cpuinfo|wc -l
24
openssl是否支持AES-NI指令
openssl從1.0.0版本之後開始支持aesni engine,但是在1.0.0版本中必須在代碼中顯式指定engine,如下:
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
ENGINE_load_builtin_engines();
ENGINE* engine=ENGINE_by_id("aesni");
if(engine==NULL){
printf("aesni not found\n");
}
EVP_EncryptInit_ex(&ctx,EVP_aes_128_cbc(),engine,test_key_128,test_init_vector);
int out;
EVP_CipherUpdate(&ctx,output,&out, test_plain_text, inputlen);
openssl 1.0.1版本後,將這個engine去掉了,變成運行時期自動檢測是否支持AES-NI,如下:
extern unsigned int OPENSSL_ia32cap_P[2];
const EVP_CIPHER *EVP_aes_128_cbc(void) { return AESNI_CAPABLE?&aesni_128_cbc:&aes_128_cbc; }
只有使用openssl EVP的接口定義函數才能夠使用AES-NI。簡單介紹一下EVP,EVP函數對openssl的底層加解密函數進行了封裝,提供高層的通用接口,其中一大好處就是底層的加解密套件可以更換,而調用方無需做代碼更改。
測試方法
- 開啓AES-NI指令加速情況下測試aes-256-cbc
openssl speed -elapsed -evp aes-256-cbc
- 關閉AES-NI指令加速的情況下測試aes-256-cbc的性能
OPENSSL_ia32cap="~0x200000200000000" openssl speed -elapsed -evp aes-256-cbc
在D13機型中不同密鑰長度是否開啓AES-NI的加解密性能測試數據
測試值的含義是單個CPU每秒處理的數據量。
AES-NI enabled | type | 16 bytes | 64 bytes | 256 bytes | 1024 bytes | 8192 bytes |
---|---|---|---|---|---|---|
ON | aes-256-cbc | 282.49MB | 296.7MB | 300.08MB | 301.0MB | 301.21MB |
OFF | aes-256-cbc | 136.59MB | 153.13MB | 156.37MB | 158.5MB | 159.37MB |
ON | aes-128-cbc | 385.65MB | 411.25MB | 418.37MB | 420.14MB | 420.62MB |
OFF | aes-128-cbc | 180.44MB | 209.81MB | 217.87MB | 220.55MB | 222.4MB |

結論:
- 密鑰長度越長,處理速度越慢
- AES-NI開啓後的處理性能提升2~3倍