只是为了完成我的问题,这是我的发现。
对于我上面的代码示例,将执行分叉到硬件支持指令的方法AES-NI
,与 Crypto++ 库中软件实现的指令相比,位于. 它是这样开始的:Rijndael::Enc::AdvancedProcessBlocks
rijndael.cpp
size_t Rijndael::Enc::AdvancedProcessBlocks(const byte *inBlocks, const byte *xorBlocks, byte *outBlocks, size_t length, word32 flags) const
{
#if CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
if (HasAESNI())
return AESNI_AdvancedProcessBlocks(AESNI_Enc_Block, AESNI_Enc_4_Blocks, (MAYBE_CONST __m128i *)(const void *)m_key.begin(), m_rounds, inBlocks, xorBlocks, outBlocks, length, flags);
#endif
CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
如果您正在构建 Crypto++ 库,那么将定义预处理器变量(Visual Studio 2008 with SP1
请注意,这SP1
很重要。)这种依赖关系对于能够使用AES-NI
内部函数(例如_mm_aesenc_si128和_mm_aesenclast_si128)来生成英特尔的AES-NI
机器代码指令是必要的。
所以在开头添加断点

将让您直接从 Visual Studio 调试它。不需要外部调试器。
如果您随后进入该AESNI_AdvancedProcessBlocks
方法,实际的 AES 加密将在其中一种AESNI_Enc_*
方法中进行处理。以下是构建中配置的实际指令aesenc
和aesenclast
机器指令的样子:x86
Release

因此,要回答我最初的问题,为了使我上面帖子中的代码示例能够利用英特尔的AES-NI
指令,需要构建代码示例和 Crypto++ 库,至少Visual Studio 2008 with SP1
. (即使代码运行的 CPU 支持指令Visual Studio 2008
,仅使用 或更早版本构建它也不会完成这项工作。)之后,似乎不需要其他步骤。该库将自动检测指令(函数)的存在,并在可用时使用它们。否则它将默认为软件实现。AES-NI
AES-NI
HasAESNI()
最后,出于好奇,我决定看看硬件和软件 AES-GCM 加密在速度上会产生多大的差异。我使用了以下代码片段(来自我上面的代码示例):
int nCntTest = 100000;
DWORD dwmsIniTicks = ::GetTickCount();
for(int i = 0; i < nCntTest; i++)
{
enc.EncryptAndAuthenticate(pDataOut_AES_GCM, mac, sizeof(mac), iv, nIV_Length, NULL, 0, pDataPlainText, nLnPlainText);
}
DWORD dwmsElapsed = ::GetTickCount() - dwmsIniTicks;
bool bHaveHwAES_Support = false;
#if CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
bHaveHwAES_Support = CryptoPP::HasAESNI();
#endif
_tprintf(L"\nTimed %d AES256-GCM encryptions %s hardware encryption of %d bytes: %u ms\n",
nCntTest, bHaveHwAES_Support ? L"with" : L"without",
nLnRealPlainText, dwmsElapsed);
这里有两个结果:

和

这显然不是一个包罗万象的测试。"Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz"
我用CPU在我的桌面上运行它。
但好消息是AES-GCM
加密似乎非常快,即使没有硬件 AES 支持。