Не удается найти RIPEMD160 в ядре .net

Я не могу найти реализацию RIPEMD160 в .net core 3.1.

Документация MS для RIPEMD160 не существует для net Standard, Core 3.1, Core 5.0.

В System.Security.Cryptography я не могу найти ничего, связанного с этим.

Прежде чем обращаться к сторонним пакетам (возможно, Chilkat), я хотел бы попробовать использовать библиотеку фреймворка.

Кажется, они не импортировали его (даже тот RIPEMD160Managed, который был полностью управляемым, поэтому независим от ОС)

xanatos 26.12.2020 16:05

Я уже импортирую BouncyCastle в проект. Я нашел Org.BouncyCastle.Crypto.Digests.RipeMD160Digest, поэтому попытаюсь использовать это.

Alex 75 26.12.2020 16:12

Вы можете импортировать моно-версию, которую моно имел перед слиянием источника ссылок от Microsoft... github.com/mono/mono/blob/mono-4.0.0-branch/mcs/class/corlib‌​/… (таким образом вы бы обошли проблемы с лицензией... моно в то время лицензировалось как MIT... неясно, что случилось с источником, который они импортировали из referencessource)

xanatos 26.12.2020 16:13

Ммм, даже справочный источник имеет лицензию MIT... так что вы можете взять «оригинальную» версию Microsoft: github.com/microsoft/referencesource/blob/master/mscorlib/… (см. примечания по лицензированию github.com/ Майкрософт/справочный источник)

xanatos 26.12.2020 16:14

Я вернул ваш вопрос к более ранней версии. Если вы хотите предоставить решение своего вопроса, опубликуйте на него отдельный ответ. Вы можете сделать это.

Artjom B. 27.12.2020 18:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
5
1 323
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Microsoft решила удалить «управляемые» (полностью реализованные в .NET) реализации алгоритмов хеширования и шифрования в .NET Core (не спрашивайте меня, почему). См. например https://github.com/dotnet/runtime/issues/2094 (именно про RIPEMD160):

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.Cryp‌​tography.RIPEMD160")‌​; Чтобы: вернуть новый VSSM.API.OMServicev3.CodeOld.RIPEMD160Managed();

Per G 23.01.2023 10:34

Я начал копировать некоторые классы из 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

Другие вопросы по теме