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

#.net #.net-core #hash

#.net #.net-core #хэш

Вопрос:

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

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

В системе.Безопасность.Криптография Я не могу найти ничего, связанного с этим.

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

Комментарии:

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

2. Я уже импортирую BouncyCastle в проект. Я отправляю Org.BouncyCastle. Криптография. Дайджесты. RipeMD160Digest so попытается использовать это.

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

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

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

Ответ №1:

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

RIPEMD160 не является алгоритмом, предоставляемым криптоуровнями ОС, и .NET Core больше не поддерживает управляемые реализации криптографических алгоритмов.

И из msdn:

Все классы аутентификации сообщений на основе хэша и хэша (HMAC), включая управляемые классы *, зависят от библиотек ОС. Хотя различные библиотеки ОС отличаются по производительности, они должны быть совместимы.

Я не могу найти, обсуждалось ли это, или какой-то менеджер решил, что лучше всего поступить таким образом или что.

Простое решение — захватить код, используемый в .NET 4.7 / .NET 4.8, и использовать его напрямую:

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

Код получен как MIT, поэтому проблем с лицензированием нет, см. Домашнюю страницу:

Файлы в этом репозитории лицензированы по лицензии MIT, если иное не указано в заголовке файла. Если заголовок файла содержит только заголовок авторского права (например, «Copyright (c) Microsoft Corporation. Все права защищены.», вы можете предположить, что связанный файл имеет лицензию MIT.

Ответ №2:

Я начал копировать некоторые классы из System.Безопасность.Криптография, но поскольку существует много атрибутов и зависимостей от других классов / интерфейсов, мне не нравится это решение.
Потому что 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