gpt4 book ai didi

c++ - 使用 AES/GCM 加密的已编译 Crypto++ 库代码是否使用英特尔的 AES-NI 指令?

转载 作者:行者123 更新时间:2023-11-27 23:54:13 27 4
gpt4 key购买 nike

我正在实现 AES256/GCM encryption和使用 Crypto++ 库的身份验证。我的代码是使用 Visual Studio 2008 作为 C++/MFC 项目编译的。这是一个使用旧版本库 Cryptopp562 的较旧项目。

我很好奇生成的编译代码是否会使用英特尔的 AES-NI instructions ?如果是这样,如果硬件(较旧的 CPU)不支持它会怎样?

编辑: 这是我用来测试它的代码示例:

int nIV_Length = 12;
int nAES_KeyLength = 32;
BYTE* iv = new BYTE[nIV_Length];
BYTE* key = new BYTE[nAES_KeyLength];

int nLnPlainText = 128;
BYTE* pDataPlainText = new BYTE[nLnPlainText];

CryptoPP::AutoSeededRandomPool rng;
rng.GenerateBlock(iv, nIV_Length);

CryptoPP::GCM<CryptoPP::AES>::Encryption enc;
enc.SetKeyWithIV(key, nAES_KeyLength, iv, nIV_Length);

BYTE* pDataOut_AES_GCM = new BYTE[nLnPlainText];
memset(pDataOut_AES_GCM, 0, nLnPlainText);

BYTE mac[16] = {0};
enc.EncryptAndAuthenticate(pDataOut_AES_GCM, mac, sizeof(mac), iv, nIV_Length, NULL, 0, pDataPlainText, nLnPlainText);

delete[] pDataPlainText;
delete[] pDataOut_AES_GCM;
delete[] key;
delete[] iv;

最佳答案

如果您在不支持这些指令的 x86 硬件上运行包含 AES-NI 指令的代码,您应该会遇到无效指令错误。除非代码做了一些聪明的事情(比如查看 CPUID 来决定是否运行 AES-NI 优化代码,或者其他什么),这也可以用来检测是否实际使用了 AES-NI 指令。

否则,您始终可以使用调试器,并在 AES-NI 指令处设置断点,以查看您的进程是否曾经使用过该部分代码。

根据 Crypto++ release notes 5.6.1 版中添加了 AES-NI 支持。查看 5.6.5 Crypto++ 版本的源代码,如果在编译时启用了 AES-NI 支持,则它会使用运行时检查(HasAESNI() 函数,可能利用 CPUID)来决定是否使用这些内在函数。参见 rijndael.cpp (和 CPUID 代码的 cpu.cpp)在其源代码中获取详细信息。

关于c++ - 使用 AES/GCM 加密的已编译 Crypto++ 库代码是否使用英特尔的 AES-NI 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43857083/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com