System.Security.Cryptography 是否使用 SIMD 优化?

Is System.Security.Cryptography using SIMD optimisation?

我试图用反射器研究 SHA-256 计算。但它进入了某个地方非托管代码

我想知道的是 .NET System.Security.Cryptography 实现是否可以优化。以使用 SIMD 为例。

所以问题是 - .NET 4.6+ SHA-256 是否会使用 SIMD。如果不能,是否可以通过使用 SIMD 提高性能,或者当前的实现几乎是最好的?

编辑:我目前使用的 dll 使用的是 Microsoft System.Security.Cryptography 内部的 CAPI 本机代码,它调用的代码是 unmanaged,我无法在 atm 上找到它的源代码。 .

托管实现 https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/sha256managed.cs 似乎没有使用 SIMD。

I tried to look into SHA-256 calculations with reflector. But it goes somewhere into unmanaged code.

.NET 中的大部分密码学只是对系统库提供的功能的包装。 .NET Framework 中存在一些历史异常(例如 SHA256Managed),但 .NET Core 中不再存在这些异常(例如 SHA256Managed is no longer managed,类型名称只是为了兼容性而存在)。

What I am trying to find is if the .NET System.Security.Cryptography implementation can be optimized. With use of SIMD for example.

System.Security.Cryptography 是一个很大的命名空间,里面有很多不同的东西。既然你特别提到了 SHA-2-256,我们可以稍微分解一下。

  • SHA256CryptoServiceProvider
    • 这使用 CAPI (crypt32.dll/advapi32.dll/etc) 的 SHA-2-256 实现。
    • 在 Windows 10(可能还有一些较旧的 Windows 版本)crypt32/etc 中的实现只是转发到 CNG 实现。
  • SHA256Cng
    • 这使用来自 CNG (bcrypt.dll) 的 SHA-2-256 实现。
    • Windows 8 有 SSE2 指令集的最低 CPU 要求,因此至少它可能使用 SSE2 加速。
    • AES 实现在可用时使用 AES-NI,因此该库已经具有探测新指令集和回退实现的模式。
    • 最合理的期望是,如果在 Windows 版本发布前一年,使用在市场上 CPU 的指令集可以提高速度(或 Windows 10) 的 6 个月更新,那么 CNG 团队可能已经使用该指令制作了优化版本。
  • SHA256 托管
    • 在 .NET Core 中,这只是另一个实现的包装器。
    • 在 .NET Framework 中,所见即所得。
    • 可以加速吗?应该是吧。
    • 会吗?似乎不太可能;不鼓励使用该类型。

(from comments: does it use avx2? avx512?)

不知道。从理论上讲,您可以进入/反汇编本机实现并找出答案。我能找到的最旧的 AVX-512 处理器是 英特尔酷睿 i7-7800X,从 2017 年第二季度开始。我现在能找到的 Windows 的最新 FIPS CAVP 证书是 SHS#4253 (3/9/2018),所以 AVX 有可能-512 用于 Windows 10.

的最新版本

(re: avx2/avx512 for sha256) and how can I manage that?

据我所知,你不能;除了加入该团队 (https://careers.microsoft.com)。

for example I have Amazon.Glacier dll which uses sha256 managed instead of Cng.. I want to make it use what I need not what it set to use by default.

您需要让亚马逊更改为使用 SHA256.Create()。没有真正可行的方法来更改别人的代码(除非它是接受贡献的开源...在这种情况下,您可以尝试直接更改它)。