在 .NET Core 中找不到 RIPEMD160

6

我在.net core 3.1中找不到任何 RIPEMD160 的实现。

MS关于RIPEMD160的文档 并不存在于 net StandardCore 3.1Core 5.0 中.

System.Security.Cryptography 中,我找不到任何相关内容。

在寻找第三方包 (例如Chilkat) 之前,我想尝试使用框架库。


似乎他们没有导入它(甚至没有完全托管的“RIPEMD160Managed”,因此不受操作系统影响)。 - xanatos
我已经在项目中导入了BouncyCastle。我发现了_Org.BouncyCastle.Crypto.Digests.RipeMD160Digest_,所以将尝试使用它。 - Alex 75
你可以导入合并之前的Mono版本,这个版本来自于Microsoft的referencesource... https://github.com/mono/mono/blob/mono-4.0.0-branch/mcs/class/corlib/System.Security.Cryptography/RIPEMD160Managed.cs (这样你就可以绕过许可问题...当时的Mono是MIT许可证...不清楚他们从referencesource导入的源代码发生了什么) - xanatos
嗯,即使参考源也是MIT许可证,所以您可以使用Microsoft的“原始”版本:https://github.com/microsoft/referencesource/blob/master/mscorlib/system/security/cryptography/ripemd160managed.cs(请参阅许可证说明https://github.com/microsoft/referencesource) - xanatos
我已经将你的问题回滚到早期版本。如果你想提供一个解决方案,请单独发布一个答案。你可以这样做。 - Artjom B.
2个回答

4
微软决定在.NET Core中删除散列和加密算法的“托管”(完全实现在.NET中)。例如,RIPEMD160,请参见https://github.com/dotnet/runtime/issues/2094

RIPEMD160不是由操作系统加密层提供的算法,而.NET Core不再携带托管实现的加密算法。

并且从msdn中得知:

所有哈希算法和基于哈希的消息认证(HMAC)类,包括*Managed类,都会延迟到操作系统库。虽然各种操作系统库在性能上有所不同,但它们应该是兼容的。

我找不到是否有关于此事的讨论,或者某些经理决定以这种方式进行最佳处理。
一个简单的解决方案是获取在.NET 4.7/.NET 4.8中使用的代码并直接使用它:

https://github.com/microsoft/referencesource/blob/master/mscorlib/system/security/cryptography/ripemd160managed.cs

代码的来源是MIT许可,因此没有许可问题,请参见主页

除非文件头中另有说明,否则该存储库中的文件均根据MIT许可证许可。如果文件头仅包含版权标头(例如“版权所有(c)Microsoft Corporation。保留所有权利。”),您可以假定相关文件已获得MIT许可。


可以运行。但我忘记更改旧实现://return (RIPEMD160)CryptoConfig.CreateFromName("System.Security.Cryptography.RIPEMD160");到:return new VSSM.API.OMServicev3.CodeOld.RIPEMD160Managed(); - Per G

0

我开始从System.Security.Cryptography复制一些类,但由于有许多属性和对其他类/接口的依赖,我不喜欢那个解决方案。
因为Chilkat似乎有点老(netstandard 1.3),而且在项目中我已经在使用BouncyCastle,所以最终我只是写了这个:

type RIPEMD160 () =
    static member ComputeHash (bytes: byte array) =
        let hasher =  Org.BouncyCastle.Crypto.Digests.RipeMD160Digest()
        hasher.BlockUpdate(bytes, 0, bytes.Length)
        let hash:byte array = Array.zeroCreate (hasher.GetDigestSize())
        hasher.DoFinal(hash, 0) |> ignore
        hash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接