Я попытался посмотреть расчеты 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()
. На самом деле не существует практического способа изменить чужой код (если только он не является открытым исходным кодом, который принимает вклады ... в этом случае, вы можете попробовать изменить его напрямую).