使用CPU硬件指令对AES加解密进行加速

简介: ###概述 AES是世界上最安全、使用广泛的加密算法,很多安全合规要求里面都明确要求使用AES算法,只是相对于3des、rc4等加密算法,速度慢了很多,幸好有了AES-NI,这是针对AES加密算法的硬件加解密CPU指令集。 AES-NI的全称是:Advanced Encryption Standard New Instructions。[指令集说明](https://en.wikipedi

概述

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]; 

#define AESNI_CAPABLE (OPENSSL_ia32cap_P[1]&(1<<(57-32)))

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_001

结论:

  • 密钥长度越长,处理速度越慢
  • AES-NI开启后的处理性能提升2~3倍
目录
相关文章
|
2月前
|
Linux
如何在linux中查看cpu信息、机器硬件型号
如何在linux中查看cpu信息、机器硬件型号
|
2月前
|
Linux
|
8月前
|
算法 编译器
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
689 0
|
2月前
|
存储 Ruby 内存技术
【机组期末速成】CPU的结构与功能|CPU结构|指令周期概述|指令流水线|中断系统
【机组期末速成】CPU的结构与功能|CPU结构|指令周期概述|指令流水线|中断系统
145 1
|
26天前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
|
10天前
|
Linux 调度
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
部署02-我们一般接触的是Mos和Wimdows这两款操作系统,很少接触到Linux,操作系统的概述,硬件是由计算机系统中由电子和机械,光电元件所组成的,CPU,内存,硬盘,软件是用户与计算机接口之间
|
2月前
|
存储
【头歌·计组·自己动手画CPU】五、单总线CPU设计(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】五、单总线CPU设计(理论版) 【计算机硬件系统设计】
484 2
|
2月前
|
存储 编解码
【头歌·计组·自己动手画CPU】一、计算机数据表示(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】一、计算机数据表示(理论版) 【计算机硬件系统设计】
48 2
|
2月前
|
数据处理 计算机视觉 芯片
【头歌·计组·自己动手画CPU】二、运算器设计(讲解版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】二、运算器设计(讲解版) 【计算机硬件系统设计】
70 2
|
2月前
|
存储 算法 索引
【头歌·计组·自己动手画CPU】三、存储系统设计(HUST)(理论版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】三、存储系统设计(HUST)(理论版) 【计算机硬件系统设计】
405 1

热门文章

最新文章