17

私は現在、AESを使用してc#でテキストの大量の暗号化/復号化を実行しています。

純粋なソフトウェアシステムでは、復号化する必要のある多くのデータセットに対して、かなりの時間、プロセッサにかなりの打撃を与える可能性があります。IntelがAES-NI命令セットを発表し、AMDも同様のものを発表したことを私は知っています。

私は.NET4.0を使用していますが、Windows CNGフレームワークがこれらの命令セットを使用していることは知っていますがAesManaged、.NETの世界では同じようには見えません。

.NET3.5からWindowsCNGへのゲートウェイを作成する素晴らしいプロジェクト「CLRSecurity」がありますが、それは1年間維持されておらず、(可能であれば)死にかけているプロジェクトに飛びつきたくありません。

.NET 4にはCNGProviderクラスがありますが、AES用にそれから機能する復号化をまとめるのに十分なドキュメントがないようです。

誰かが、c#から直接ap / invokeを実行することなく、事前に作成されたクラスを使用して、純粋な.NET環境でAES-NIを実装する方法について正しい方向に私を向けることができるトピックの経験がありますか?(それが維持されている限り、それを実行するラッパークラスがあれば問題ありません)。

4

3 に答える 3

16

どうAesCryptoServiceProviderですか?それはCAPIを使用していると言っているので、可能であればCNGを使用することをお勧めします。– Rup

このコメントは非常に役立ちました。掘り下げた後AesCryptoServiceProvider、可能な場合はAES-NIを使用するようです。ただし、これに関するMicrosoftの「公式」ドキュメントは見つかりません。単純なタイミングベンチマークを実行すると、差が約15倍速くなるため、API自体が大幅に最適化されるか(15倍の増加の場合は非常に優れた最適化です)、AES-NI命令セットを使用します。

残念ながら、テストするAES-NI以外のボックスはありませんが、入手した場合は、このスレッドを結果で更新します。

したがって、これはAES-NIに使用するAPIであると確信していますが、さらにテストしないと保証できません。

于 2011-11-16T17:13:46.890 に答える
1

.NETでCNG(またはAES-NI対応の命令セット)を使用するにはどうすればよいですか?

AES-NI命令セットの質問に焦点を当てます。自分で思ったので(CとC ++で使用するために)面白いと思いました。

Microsoftは、Visual Studio 2008 SP1にAES-NIサポートを追加しました(_MSC_FULL_VER >= 150030729)。以前のコンパイラがAES-NIをサポートしていなかったため、Microsoft製品でAES-NIを観察できる最も早い時期は2008年頃です。つまり、Server 2008にはそれがあり、場合によってはServicePackを介したWindowsVista以降もあります。

MS Crypto APIはAESおよびAES-NIプロセッサ命令をサポートしていますか?、両方rsaenh.dllとそれをbcryptprimitives.dll持っています。IvanPによるステートメントは、Windows7およびWindows10でテストされています。

ただし、Windows8.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命令がありませんでした。

  • advapi32.dll
  • bcrypt.dll
  • crypt32.dll
  • cryptbase.dll
  • cryptcatsvc.dll
  • cryptdlg.dll
  • cryptdll.dll
  • cryptext.dll
  • cryptnet.dll
  • cryptowinrt.dll
  • cryptsp.dll
  • cryptsvc.dll

Microsoftのサイトには、この件に関する情報はあまりありません。csp "aes-ni"サイト:microsoft.comから2ヒット、 csp "aesni"サイト:microsoft.comから0ヒットを取得しました。何が起こっているにせよ、マイクロソフトはそれを秘密にしている。

于 2019-08-19T12:08:30.197 に答える
0

私はこれらの機能を備えた最も初期のチップセットで働いていました。当時、Windows7にはAESを使用する機能がありませんでした。私は当時利用可能なUbuntuに頼り、Intel docを使用し、インラインアセンブリを使用してcpuidを実行しました。それは私のトレーニングの目的を果たしました。それにもかかわらず、私が学んだことの1つは、「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

于 2020-07-17T07:52:11.043 に答える