TestingAES-NIInstructionsfromC#我想知道是否有办法在C#.NET中测试主机系统CPU中是否存在AES-NI。首先让我说这个问题不是问如何在.NET中使用AES-NI。事实证明,仅使用AESCryptoServiceProvider将使用AES-NI(如果可用)。此结果基于独立基准测试,我将AESCryptoServiceProvider的性能与支持AES-NI的TrueCrypt中提供的基准进行了比较。在使用和不使用AES-NI的两台机器上,结果惊人地相似。我希望能够对此进行测试的原因是能够向用户展示他们的计算机支持AES-NI。这是相关的,因为它减少了支持事件,包括“但我的朋友也有Corei5,但他的速度要快得多!”如果程序的UI可以向用户指示他们的系统支持或不支持AES-NI,您还可以指示“由于该系统不支持AES-NI,性能较低是正常的”。(我们可以感谢英特尔对不同处理器步进的所有混淆!:-))有没有办法通过WMI检测到这一点?在SO:InlineassemblycodetogetCPUID上似乎有一个类似的问题,答案很好。但是这个答案需要进行一些调整以满足您的需求。首先,据我所知,AES-NI只能出现在64位处理器上,对吧?那么你可以忽略上面答案中的所有32位代码。其次,您需要ECX寄存器或其第25位,因此您必须稍微更改代码:privatestaticboolIsAESNIPresent(){byte[]sn=newbyte[16];//!!!这里有8个字节if(!ExecuteCode(refsn))returnfalse;varecx=BitConverter.ToUInt32(sn,8);return(ecx&(1最后需要将ECX寄存器存入数组:byte[]code_x64=newbyte[]{0x53,/*pushrbx*/0x48,0xc7,0xc0,0x01,0x00,0x00,0x00,/*movrax,0x1*/0x0f,0xa2,/*cpuid*/0x41,0x89,0x00,/*mov[r8],eax*/0x41,0x89,0x50,0x04,/*mov[r8+0x4],ebx!!!更改*/0x41,0x89,0x50,0x08,/*mov[r8+0x8],ecx!!!添加*/0x41,0x89,0x50,0x0C,/*mov[r8+0xC],edx!!!added*/0x5b,/*poprbx*/0xc3,/*ret*/};据我所知,这就是变体。Mark上面的回答很好,让我的工作正常,但我注意到如果应用程序在32位模式下运行,则ecx寄存器未被x86代码拉入,导致无法检测到AES-NI。我添加了一行并更改了另一行,基本上应用了对x64代码所做的更改到x86代码。这允许您从32位模式查看AES-NI位。不确定它是否对某人有帮助,但我想我会发布它。编辑:当我进行一些测试时,我注意到x64代码返回不正确的寄存器。EDX在偏移量0x4、0x8和0xC处返回,而且ECX和EDX寄存器位于与x86代码不同的位置,因此您需要更频繁地检查IntPtr.Size以确保在两种环境中都能正常工作。为简化起见,我将ECX寄存器放在0x4处,将EDX放在0x8处,以便数据正确排列。如果有人问我可以发布整个课程,这是我从这篇文章和其他文章中学到的一个例子。以上就是C#学习教程:由C#测试AES-NI命令分享的全部内容,如果对你有用,还需要了解更多C#学习教程,希望大家多多关注---公众号staticboolExecuteCode(refbyte[]result){byte[]code_x86=newbyte[]{0x55,/*pushebp*/0x89,0xE5,/*movebp,esp*/0x57,/*pushedi*/0x8b,0x7D,0x10,/*movedi,[ebp+0x10]*/0x6A,0x01,/*push0x1*/0x58,/*popeax*/0x53,/*pushebx*/0x0F,0xA2,/*cpuid*/0x89,0x07,/*mov[edi],eax*/0x89,0x4F,0x04,/*mov[edi+0x4],ecx改变*/0x89,0x57,0x08,/*mov[edi+0x8],edx改变*/0x5B,/*popebx*/0x5F,/*popedi*/0x89,0xEC,/*movesp,ebp*/0x5D,/*popebp*/0xC2,0x10,0x00,/*ret0x10*/};byte[]code_x64=newbyte[]{0x53,/*pushrbx*/0x48,0xC7,0xC0,0x01,0x00,0x00,0x00,/*movrax,0x1*/0x0f,0xA2,/*cpuid*/0x41,0x89,0x00,/*mov[r8],eax*/0x41,0x89,0x48,0x04,/*mov[r8+0x4],ecx改变*/0x41,0x89,0x50,0x08,/*mov[r8+0x8],edx改变*/0x5B,/*poprbx*/0xC3,/*ret*/};整数;byte[]代码=(IntPtr.Size==4)?代码_x86:代码_x64;IntPtrptr=newIntPtr(code.Length);if(!VirtualProtect(code,ptr,PAGE_EXECUTE_READWRITE,outnum))Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());ptr=newIntPtr(result.Length);返回(ExecuteNativeCode(代码,IntPtr.Zero,0,结果,ptr)!=IntPtr.Zero);本文收集自网络,不代表立场,如有侵权请点右联系管理员删除。如需转载请注明出处:
