英特尔在比较新的CPU上提供了AES-NI指令,可以直接调用这些指令来进行AES加解密。关于此指令的速度提升情况,各方反应不一,最高有说提高17倍的,有说提高8-9倍左右的,还有说提高一半左右的。这可能和各人的测试平台和倾向都不一样,因此结果各有差别。
CPU是否支持AES-NI可以使用英特尔AES-NI白皮书中的函数检测。白皮书中所述检测为:
checking CPUID.01H:ECX.AES[bit 25] = 1.
代码如下
#define cpuid(func,ax,bx,cx,dx)\
__asm__ __volatile__ ("cpuid":\
"=a" (ax), "=b" (bx), "=c" (cx), "=d" (dx) : "a" (func));
int Check_CPU_support_AES()
{
unsigned int a,b,c,d;
cpuid(1, a,b,c,d);
return (c & 0x2000000);
}
微软VS2010以上版本(含)支持调用AES-NI。
- AES速度
测试了LibTomCrypt、rijndael-alg-fst.c、OpenSSL的AES速度,测试平台为:
操作系统: Windows XP Professional (SP2) (32位)
处理器: 英特尔 Core 2 Duo E8400 @ 3.00GHz
内存: 2 GB ( DDR2 800MHz )
编译:VC++6.0
以下测试结果都采用不解绕(UNROLL)。在此测试环境中,解绕和不解绕的速度相差非常小,几乎可以忽略不计。
测试结果如下:(简记LibTomCrypt为Tom,简记rijndael-alg-fst.c为Fast,简记OpenSSL为SSL)
|
Debug |
Release |
||||
|
Tom |
Fast |
SSL |
Tom |
Fast |
SSL |
Encrypt16 |
524.893 |
102.981 |
480.003 |
606.912 |
1109.189 |
1218.544 |
Decrypt16 |
529.611 |
102.353 |
479.799 |
593.443 |
908.381 |
1225.411 |
Encrypt24 |
469.653 |
99.387 |
436.004 |
525.932 |
943.827 |
1044.971 |
Decrypt24 |
464.927 |
99.823 |
431.03 |
529.255 |
774.287 |
1035.197 |
Encrypt32 |
429.025 |
98.474 |
398.485 |
469.170 |
822.720 |
913.642 |
Decrypt32 |
421.533 |
97.850 |
393.3 |
465.620 |
665.822 |
921.721 |
各版本的AES速度对比表(单位:Mbps)
各版本的AES速度对比图
相信AES-NI的速度会应该能提升好几倍,达到XGbps应该问题不大。