Использует ли System.Security.Cryptography оптимизацию SIMD? - PullRequest
0 голосов
/ 02 января 2019

Я попытался посмотреть расчеты SHA-256 с отражателем.Но это где-то в неуправляемом коде .

Я пытаюсь выяснить, можно ли оптимизировать реализацию .NET System.Security.Cryptography.Например, с использованием SIMD.

Вопрос в том, будет ли .NET 4.6+ SHA-256 использовать SIMD или нет.А если нет - можно ли улучшить производительность с помощью SIMD или текущая реализация является самой лучшей?

РЕДАКТИРОВАТЬ: DLL, которую я использую в настоящее время, использует собственный код CAPI внутри Microsoft System.Security.Cryptography икод, который он вызывает, - неуправляемый , и я не могу найти источник для него atm ..

Управляемая реализация https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/sha256managed.cs, похоже, не использует SIMD.

1 Ответ

0 голосов
/ 04 января 2019

Я попытался посмотреть расчеты SHA-256 с отражателем. Но это идет куда-то в неуправляемый код.

Большая часть криптографии в .NET является просто оболочкой для функций, предоставляемых системными библиотеками. В .NET Framework есть несколько исторических исключений (например, SHA256Managed), но они больше не присутствуют в .NET Core (например, SHA256Managed больше не управляется , имя типа просто существует для совместимости).

Я пытаюсь выяснить, можно ли оптимизировать реализацию .NET System.Security.Cryptography. С использованием SIMD например.

System.Security.Cryptography - это большое пространство имен, в котором много разных вещей. Поскольку вы упомянули SHA-2-256 конкретно, мы можем немного разбить его.

  • SHA256CryptoServiceProvider
    • При этом используется реализация SHA-2-256 из CAPI (crypt32.dll / advapi32.dll / и т. Д.).
    • В Windows 10 (и, возможно, в некоторых старых версиях Windows) реализация в crypt32 / etc просто переходит к реализации CNG.
  • SHA256Cng
    • При этом используется реализация SHA-2-256 из CNG (bcrypt.dll).
    • Windows 8 предъявляла минимальные требования к процессору из набора инструкций SSE2, поэтому, как минимум, она, вероятно, использует ускорение SSE2.
    • Реализация AES использует AES-NI, когда она доступна, поэтому в библиотеке уже есть шаблоны поиска новых наборов команд и резервных реализаций.
    • Наиболее разумное ожидание состоит в том, что, если есть улучшение скорости, которое может быть достигнуто с помощью набора инструкций, имеющего процессор на рынке, за год до выпуска версии Windows (или 6-месячного обновления для Windows 10) тогда команда CNG, вероятно, сделала оптимизированную версию, используя эту инструкцию.
  • SHA256Managed
    • В .NET Core это просто оболочка над другой реализацией.
    • В .NET Framework вы получаете то, что вы видите в источнике ссылок.
    • Может ли это быть ускорено? Возможно.
    • Будет ли это? Кажется довольно маловероятным; использование типа не рекомендуется.

(из комментариев: используется ли avx2? Avx512?)

Незнайка. Теоретически вы можете зайти / разобрать нативную реализацию и выяснить это. Самый старый процессор, который я могу найти с AVX-512, это Intel Core i7-7800X , начиная со второго квартала 2017 года. Самым последним сертификатом FIPS CAVP для Windows, который я сейчас могу найти, является SHS # 4253 (3/9/2018), поэтому есть вероятность, что AVX-512 используется на новейшие выпуски Windows 10.

(re: avx2 / avx512 для sha256) и как мне это сделать?

AFAIK, ты не можешь; кроме присоединения к этой команде (https://careers.microsoft.com).

например, у меня есть Amazon.Glacier dll, которая использует управляемый sha256 вместо Cng .. Я хочу, чтобы он использовал то, что мне нужно, а не то, что установлено по умолчанию.

Вам нужно настроить Amazon на использование SHA256.Create(). На самом деле не существует практического способа изменить чужой код (если только он не является открытым исходным кодом, который принимает вклады ... в этом случае, вы можете попробовать изменить его напрямую).

...