Я не могу найти реализацию RIPEMD160 в .net core 3.1.
Документация MS для RIPEMD160 не существует для net Standard, Core 3.1, Core 5.0.
В System.Security.Cryptography я не могу найти ничего, связанного с этим.
Прежде чем обращаться к сторонним пакетам (возможно, Chilkat), я хотел бы попробовать использовать библиотеку фреймворка.
Я уже импортирую BouncyCastle в проект. Я нашел Org.BouncyCastle.Crypto.Digests.RipeMD160Digest, поэтому попытаюсь использовать это.
Вы можете импортировать моно-версию, которую моно имел перед слиянием источника ссылок от Microsoft... github.com/mono/mono/blob/mono-4.0.0-branch/mcs/class/corlib/… (таким образом вы бы обошли проблемы с лицензией... моно в то время лицензировалось как MIT... неясно, что случилось с источником, который они импортировали из referencessource)
Ммм, даже справочный источник имеет лицензию MIT... так что вы можете взять «оригинальную» версию Microsoft: github.com/microsoft/referencesource/blob/master/mscorlib/… (см. примечания по лицензированию github.com/ Майкрософт/справочный источник)
Я вернул ваш вопрос к более ранней версии. Если вы хотите предоставить решение своего вопроса, опубликуйте на него отдельный ответ. Вы можете сделать это.
Microsoft решила удалить «управляемые» (полностью реализованные в .NET) реализации алгоритмов хеширования и шифрования в .NET Core (не спрашивайте меня, почему). См. например https://github.com/dotnet/runtime/issues/2094 (именно про RIPEMD160):
RIPEMD160 не является алгоритмом, предоставляемым уровнями шифрования ОС, и .NET Core больше не содержит управляемых реализаций криптографических алгоритмов.
И из msdn:
Все классы хеш-алгоритмов и проверки подлинности сообщений на основе хэшей (HMAC), включая классы *Managed, относятся к библиотекам ОС. Хотя различные библиотеки ОС различаются по производительности, они должны быть совместимы.
Я не могу найти, было ли обсуждение по этому поводу, или какой-то менеджер решил, что лучше сделать так или как.
Простое решение — взять код, используемый в .NET 4.7/.NET 4.8, и использовать его напрямую:
Код получен от MIT, поэтому проблем с лицензированием нет, смотрите домашнюю страницу:
Файлы в этом репозитории находятся под лицензией MIT, если иное не указано в заголовке файла. Если заголовок файла содержит только заголовок об авторских правах (например, «Авторское право (c) Microsoft Corporation. Все права защищены.»), вы можете предположить, что связанный файл находится под лицензией MIT.
Работает. Но я забыл изменить старую реализацию с: //return (RIPEMD160)CryptoConfig.CreateFromName("System.Security.Cryptography.RIPEMD160"); Чтобы: вернуть новый VSSM.API.OMServicev3.CodeOld.RIPEMD160Managed();
Я начал копировать некоторые классы из System.Security.Cryptography, но из-за того, что есть много атрибутов и зависимостей от других классов/интерфейсов, мне это решение не нравится.
Потому что Чилкат кажется немного староватым (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
Кажется, они не импортировали его (даже тот
RIPEMD160Managed
, который был полностью управляемым, поэтому независим от ОС)