在企业安全中,加解密数据是非常基础的也是非常重要的一个环节,其中AES加解密算法被广泛应用于企业数据存储、传输等领域。虽然软件AES算法能够很好的进行数据加解密处理,但是其性能不佳,耗电严重的问题一直被企业用户诟病。现在主流的Intel CPU已经完全支持AES硬件加解密指令,通过利用这些指令,企业用户将会获得高性能和低功耗的双份礼物。那么如何检查用户平台支持AESNI(AES New Instructions)指令呢?本文将会通过简单的程序演示来讲解它。
在Intel® 64 and IA-32 Architectures Software Developer’s Manual中,我们在第287页能够找到下面一段文字,如图1所示。
图1
我们可以通过CPUID指令,检查ECX寄存器来确认是否硬件平台支持AESNI指令。
那么如何使用CPUID指令呢?
请继续查看在Intel® 64 and IA-32 Architectures Software Developer’s Manual,在第613页,我们看到了CPUID指令的使用方式,如图2所示。
图2
类似的汇编代码如下:
在获取ECX值后,我们可以检查AESNI位来查看系统是否支持硬件AESNI加解密。具体ECX存放内容的格式,如图3所示。
图3
简单吗?
或许有些麻烦吧!毕竟我们需要写汇编代码(可能很多程序员已经忘记如何写这种低级的语言,拿起来也需要折腾一会儿),然后再通过麻烦的位指令来检查ECX寄存器的第25位来判断是否系统支持AESNI。
那有没有简单的呢?
有!感谢微软提供了
void __cpuid(
int CPUInfo[4],
int InfoType
);
来做CPUID指令需要做的工作,具体参数说明请参考http://msdn.microsoft.com/en-us/library/hskdteyh%28v=vs.90%29.aspx,本文仅仅做一个简单的说明。
这里CPUInfo[4]依次存放寄存器EAX, EBX, ECX, EDX的值,InfoType是在执行CPUID之前需要制定EAX的值。
为了获取AESNI的信息,InfoType应该设为01H。
int main( void ) { int CPUInfo[4] = { 0, 0, 0, 0 }; int InfoType = 0x01; //CPUID(); __cpuid( CPUInfo, InfoType ); printf( "ECX: 0x%x\n", CPUInfo[ 2 ] ); if ( CPUInfo[ 2 ] & (1 << 25) ) printf( "AES --- supported\n" ); getchar(); return 0; } |
上面代码演示了如何使用微软的__cpuid()来建议系统是否支持AESNI指令,具体的汇编代码将由微软来实现,开发者省去了很多的麻烦,是不是一个更好的解决方案呢?
上一篇:2013各大IT公司薪资标准 下一篇:为了软件即服务,谷歌致力于开发10Gbps互联网技术