Подтвердить что ты не робот

Как использовать CNG (или набор инструкций с поддержкой AES-NI) в .NET?

В настоящее время я выполняю большое количество шифрования/дешифрования текста в c # с помощью AES.

При использовании чисто программной системы для обработки большого количества наборов данных, которые необходимо расшифровать, может потребоваться достаточно много времени процессора. Я знаю, что Intel выпустила свой набор инструкций AES-NI, а AMD - аналогичное.

Я использую .NET 4.0, я знаю, что Windows CNG Framework использует эти наборы инструкций, но не похоже, что AesManaged в мире .NET делает то же самое.

Существует фантастический проект "CLR Security", который делает шлюз из .NET 3.5 в Windows CNG, однако он не поддерживается уже год, и я бы не стал (если это возможно) переходить на него умирающий проект.

В .NET 4 есть класс CNGProvider, но, по-видимому, нет достаточной документации для объединения рабочего дешифрования из него для AES.

Кто-нибудь имеет опыт работы с темой, которую он мог бы указать мне в правильном направлении о том, как реализовать AES-NI в чистой среде .NET, используя готовые классы, без необходимости выполнять p/invoke непосредственно из c #? (Было бы хорошо, если бы это делал класс-обёртка, если он поддерживается).

4b9b3361

Ответ 1

  Что насчет AesCryptoServiceProvider? Там написано, что используется CAPI, и так надеюсь, СПГ, если таковой имеется. - Руп

Этот комментарий очень помог, после некоторых копаний похоже, что AesCryptoServiceProvider будет использовать AES-NI, если доступно. Однако я не могу найти "официальную" документацию от Microsoft по этому вопросу. При выполнении простых тестов синхронизации разница в ~ 15 раз быстрее, поэтому либо сам API значительно оптимизирован (что для 15-кратного увеличения - довольно приятная оптимизация), либо он использует набор команд AES-NI.

К сожалению, у меня нет бокса без AES-NI для тестирования, но если я когда-нибудь получу его, я обновлю эту ветку с результатами.

Поэтому я уверен, что это API для AES-NI, но не могу гарантировать без дальнейшего тестирования.

Ответ 2

  Как использовать CNG (или набор инструкций с поддержкой AES-NI) в .NET?

Я собираюсь сосредоточиться на вопросе набора команд AES-NI. Мне это показалось интересным, поскольку я сам задавался вопросом (для использования в C и C++).

Microsoft добавила поддержку AES-NI в Visual Studio 2008 SP1 (_MSC_FULL_VER >= 150030729). Самое раннее, что вы можете наблюдать AES-NI в продуктах Microsoft, это около 2008 года, так как более ранние компиляторы не поддерживали его. Это означает, что в Server 2008 он есть, и, возможно, в Windows Vista через пакет обновления и выше.

Согласно Поддерживает ли MS Crypto API инструкции процессора AES и AES-NI?, у 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.


Я также проверил следующие библиотеки DLL в Windows 8.1, и там не было инструкций 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 и 0 хитов для сайта csp "aesni": microsoft.com. Что бы ни происходило, Microsoft держит это в секрете.