企业安全技术(1):检查平台AESNI支持

在企业安全中,加解密数据是非常基础的也是非常重要的一个环节,其中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

类似的汇编代码如下:

MOV EAX, 01H

CPUID

在获取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指令,具体的汇编代码将由微软来实现,开发者省去了很多的麻烦,是不是一个更好的解决方案呢?

你还是看什么?为什么不自己手动的试一下?

Para obtener información más completa sobre las optimizaciones del compilador, consulte nuestro Aviso de optimización.
Etiquetas: