Как использовать 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 #? (Было бы хорошо, если бы это делал класс-обёртка, если он поддерживается).
Ответы
Ответ 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 держит это в секрете.