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

时间:2019-01-02 14:18:02

标签: c# .net cryptography simd sha256

我试图用反射器研究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。

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

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版本(或Windows 10的6个月更新)之前的一年中使用市场上有CPU的指令集可以提高速度,那么CNG团队可能已经根据该说明制作了优化版本。
  • SHA256托管
    • 在.NET Core中,这只是另一个实现的包装。
    • 在.NET Framework中,您在referencesource上看到的就是所获得的。
    • 可以加快速度吗?可能。
    • 会吗?似乎不太可能;不鼓励使用该类型。
  

(评论:它使用avx2吗?avx512?)

Dunno。从理论上讲,您可以介入/反汇编本机实现并进行查找。我可以在AVX-512上找到的最早的处理器是 Intel Core i7-7800X,从2017年第二季度开始。我现在可以找到的最新的Windows FIPS CAVP证书是SHS#4253(3/9/2018),所以有机会Windows 10的最新版本中正在使用AVX-512。

  

(例如:sha256的avx2 / avx512)以及如何管理?

AFAIK,您不能;除了加入该团队(https://careers.microsoft.com)。

  

例如,我有使用sha256托管而不是Cng的Amazon.Glacier dll。我想使其使用我不需要的默认设置。

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