1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

.NET Core で RIPEMD160 を使おう! with Bouncy Castle

Posted at

ハッシュアルゴリズムの RIPEMD160 を Bouncy Castle を使って C# で実装した時のメモです。
このアルゴリズムは Bitcoin 等に使われてますね!

環境

  • .NET Core 3.1

RIPEMD160 が消えた

公式ドキュメント を見るとわかる通り、 .NET Framework では RIPEMD160 アルゴリズムが公式にサポートされていましたが、.NET Core では削除されていました。
リポジトリの Issue を見るに、(私の拙い英語力で解釈すると)
「OS 側で提供されないアルゴリズムは .NET Core では実装しないよ!」ということでしょうか?
困りました。

Bouncy Castle を使おう

Bouncy Castle は暗号化ライブラリの一つです。言語は Java と C# がサポートされています。
.NET Core でも使えます。
Nuget からサクっといれちゃいましょう。
執筆時点(2020/08/24)ではバージョンが最新ではないみたいなので、気になるようであればリポジトリの Release からどうぞ。

使い方

Org.BouncyCastle.Crypto.Digests 名前空間の RipeMD160Digest クラスを使います。
コード自体は簡単なものになります。

class Program
{
    static void Main(string[] args)
    {
        var data = Encoding.UTF8.GetBytes("abcdefg");

        var digest = new RipeMD160Digest();
        var result = new byte[digest.GetDigestSize()];
        digest.BlockUpdate(data, 0, data.Length);
        digest.DoFinal(result, 0);

        WriteBytes(result);
        //874f9960c5d2b7a9b5fad383e1ba44719ebb743a
    }

    private static void WriteBytes(IEnumerable<byte> bytes)
    {
        Console.WriteLine(string.Join("", bytes.Select(x => $"{x:x2}")));
    }
}
  1. RIPEMD160 のインスタンスを生成して、
  2. BlockUpdate を呼び出して、
  3. DoFinal で結果を得る。

という単純な使い方です。
(RipeMD160 の仕様は長さが20バイトなので、digest.GetDigestSize() の値も 20 で固定です。)

参考にしたもの

RipeMD160Digest.cs
GeneralDigest.cs

Bouncy Castle は C# に対するドキュメントが無いため、学ぶにはソースコードを読む必要があるなど一苦労かかりますね!
私の記事がなにかお役に立てれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?