我目前使用AES在c#中执行大量文本加密/解密。
使用纯软件系统,对于需要解密的大量数据集,可能需要相当长的处理器才能获得相当长的时间。我知道英特尔已经推出了他们的AES-NI指令集,并且AMD已经推出了类似的产品。
我正在使用.NET 4.0,我知道windows CNG框架使用了这些指令集,但似乎.NET世界中的AesManaged
没有做同样的事情。
有一个很棒的项目“CLR Security”,它建立了从.NET 3.5到Windows CNG的网关,但是它在一年内没有被维护,我宁愿不(如果可能的话)跳上一个垂死的项目。
.NET 4中有一个CNGProvider类,但似乎没有足够的文档可以将AES的工作解密拼凑起来。
有没有人有过关于如何在纯.NET环境中使用预制类实现AES-NI的正确方向的主题经验,而无需直接从c#进行p / inv? (如果有一个包装类,只要它被维护就可以了。)
答案 0 :(得分:15)
AesCryptoServiceProvider怎么样?它说使用CAPI等 希望CNG如果可用的话。 - Rup
这个评论有很大的帮助,在做了一些挖掘之后看起来像AesCryptoServiceProvider将使用AES-NI如果可用,我看不到微软对此的任何“官方”文档,但是当运行简单的时序基准测试时差异大约快15倍所以要么API本身进行了大规模优化(增加15倍是非常好的优化),要么使用AES-NI指令集。
Unfortunatley我没有非AES-NI盒子可供测试,但是如果我得到一个,我会用结果更新这个帖子。
所以我非常有信心这是用于AES-NI的API,但如果没有进一步的测试就无法保证。
答案 1 :(得分:1)
如何在.NET中使用CNG(或启用AES-NI的指令集)?
我将集中讨论AES-NI指令集问题。我发现它很有趣,因为我自己也想知道(用于C和C ++)。
Microsoft向Visual Studio 2008 SP1(_MSC_FULL_VER >= 150030729
)添加了AES-NI支持。最早可以在Microsoft产品中看到AES-NI的时间大约是2008年,因为早期的编译器不支持它。这意味着Server 2008拥有它,可能还有通过Service Pack及更高版本提供的Windows Vista。
根据Does MS Crypto API supports AES and AES-NI processor instructions?,rsaenh.dll
和bcryptprimitives.dll
都拥有它。 IvanP所作的声明已在Windows 7和Windows 10上进行了测试。
但是,在Windows 8.1上进行的测试表明...
# Using a Developer Command prompt so dumpbin is on-path:
> dumpbin /disasm c:\Windows\System32\rsaenh.dll > rsaenh.dll.txt
> dumpbin /disasm c:\Windows\System32\bcryptprimitives.dll > bcryptprimitives.dll.txt
然后:
# Using a GitBash terminal for grep
$ grep -i aes rsaenh.dll.txt
$
并且:
$ grep -i aes bcryptprimitives.dll.txt
000000018000234A: 66 0F 3A DF C0 00 aeskeygenassist xmm0,xmm0,0
0000000180002363: 66 0F 38 DB C0 aesimc xmm0,xmm0
000000018000237E: 66 0F 38 DC 41 10 aesenc xmm0,xmmword ptr [rcx+10h]
0000000180002384: 66 0F 38 DC 41 20 aesenc xmm0,xmmword ptr [rcx+20h]
000000018000238A: 66 0F 38 DC 41 30 aesenc xmm0,xmmword ptr [rcx+30h]
0000000180002390: 66 0F 38 DC 41 40 aesenc xmm0,xmmword ptr [rcx+40h]
0000000180002396: 66 0F 38 DC 41 50 aesenc xmm0,xmmword ptr [rcx+50h]
000000018000239C: 66 0F 38 DC 41 60 aesenc xmm0,xmmword ptr [rcx+60h]
00000001800023A2: 66 0F 38 DC 41 70 aesenc xmm0,xmmword ptr [rcx+70h]
00000001800023AF: 66 0F 38 DC 01 aesenc xmm0,xmmword ptr [rcx]
00000001800023B4: 66 0F 38 DC 41 10 aesenc xmm0,xmmword ptr [rcx+10h]
00000001800023C3: 66 41 0F 38 DD 02 aesenclast xmm0,xmmword ptr [r10]
000000018001936E: 66 0F 38 DC 41 10 aesenc xmm0,xmmword ptr [rcx+10h]
0000000180019374: 66 0F 38 DC 41 20 aesenc xmm0,xmmword ptr [rcx+20h]
000000018001937A: 66 0F 38 DC 41 30 aesenc xmm0,xmmword ptr [rcx+30h]
0000000180019380: 66 0F 38 DC 41 40 aesenc xmm0,xmmword ptr [rcx+40h]
0000000180019386: 66 0F 38 DC 41 50 aesenc xmm0,xmmword ptr [rcx+50h]
000000018001938C: 66 0F 38 DC 41 60 aesenc xmm0,xmmword ptr [rcx+60h]
0000000180019392: 66 0F 38 DC 41 70 aesenc xmm0,xmmword ptr [rcx+70h]
000000018001939F: 66 0F 38 DC 01 aesenc xmm0,xmmword ptr [rcx]
00000001800193A4: 66 0F 38 DC 41 10 aesenc xmm0,xmmword ptr [rcx+10h]
00000001800193B3: 66 41 0F 38 DD 02 aesenclast xmm0,xmmword ptr [r10]
000000018001952E: 66 0F 38 DE C4 aesdec xmm0,xmm4
0000000180019533: 66 0F 38 DE CC aesdec xmm1,xmm4
0000000180019538: 66 0F 38 DE D4 aesdec xmm2,xmm4
000000018001953D: 66 0F 38 DE DC aesdec xmm3,xmm4
000000018001954B: 66 0F 38 DF C4 aesdeclast xmm0,xmm4
0000000180019550: 66 0F 38 DF CC aesdeclast xmm1,xmm4
0000000180019555: 66 0F 38 DF D4 aesdeclast xmm2,xmm4
000000018001955A: 66 0F 38 DF DC aesdeclast xmm3,xmm4
000000018002E8B5: 66 0F 38 DE 41 10 aesdec xmm0,xmmword ptr [rcx+10h]
000000018002E8BB: 66 0F 38 DE 41 20 aesdec xmm0,xmmword ptr [rcx+20h]
000000018002E8C1: 66 0F 38 DE 41 30 aesdec xmm0,xmmword ptr [rcx+30h]
000000018002E8C7: 66 0F 38 DE 41 40 aesdec xmm0,xmmword ptr [rcx+40h]
000000018002E8CD: 66 0F 38 DE 41 50 aesdec xmm0,xmmword ptr [rcx+50h]
000000018002E8D3: 66 0F 38 DE 41 60 aesdec xmm0,xmmword ptr [rcx+60h]
000000018002E8D9: 66 0F 38 DE 41 70 aesdec xmm0,xmmword ptr [rcx+70h]
000000018002E8E6: 66 0F 38 DE 01 aesdec xmm0,xmmword ptr [rcx]
000000018002E8EB: 66 0F 38 DE 41 10 aesdec xmm0,xmmword ptr [rcx+10h]
000000018002E8FA: 66 41 0F 38 DF 02 aesdeclast xmm0,xmmword ptr [r10]
000000018003F458: 66 0F 38 DC E8 aesenc xmm5,xmm0
000000018003F45D: 66 0F 38 DC D8 aesenc xmm3,xmm0
000000018003F462: 66 0F 38 DC E0 aesenc xmm4,xmm0
000000018003F467: 66 0F 38 DC F0 aesenc xmm6,xmm0
000000018003F475: 66 0F 38 DD EF aesenclast xmm5,xmm7
000000018003F47A: 66 0F 38 DD DF aesenclast xmm3,xmm7
000000018003F47F: 66 0F 38 DD E7 aesenclast xmm4,xmm7
000000018003F492: 66 0F 38 DD F7 aesenclast xmm6,xmm7
因此,在现代Windows上,您需要使用依赖于bcryptprimitives.dll
的内容。我不知道什么.Net原语会加入bcryptprimitives.dll
。
我还在Windows 8.1上检查了以下DLL,并且不存在AES-NI指令:
Microsoft网站上没有太多有关此主题的信息。我从csp "aes-ni" site:microsoft.com获得了2次匹配,而csp "aesni" site:microsoft.com得到了0次匹配。无论发生什么情况,Microsoft都会对其保密。
答案 2 :(得分:0)
我最早从事具有这些功能的芯片组的研究。那时Windows 7还没有使用AES的能力。我求助于当时可用的Ubuntu,并使用了英特尔文档,并通过一些内联程序集完成了cpuid。那符合我训练的目的。不过,我了解到的一件事是,“ Intel安全密钥”几乎与“ AES-NI”同时提供。因此,如果我在芯片组中找到RDRAND指令,则意味着“可能”具有AES-NI。因此,我能做的最简单的方法(但文献不足)是
截至本文撰写时,尚未将// PF_RDRAND_INSTRUCTION_AVAILABLE作为MSDN API的一部分进行记录 IsProcessorFeaturePresent(PF_RDRAND_INSTRUCTION_AVAILABLE);
我们也可以这样使用CPU内部函数 https://docs.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=vs-2019
另请参阅以下文档以获取更多“证明”。 https://csrc.nist.gov/csrc/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp1894.pdf