ハッシュアルゴリズムの 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}")));
}
}
- RIPEMD160 のインスタンスを生成して、
- BlockUpdate を呼び出して、
- DoFinal で結果を得る。
という単純な使い方です。
(RipeMD160 の仕様は長さが20バイトなので、digest.GetDigestSize()
の値も 20 で固定です。)
参考にしたもの
RipeMD160Digest.cs
GeneralDigest.cs
Bouncy Castle は C# に対するドキュメントが無いため、学ぶにはソースコードを読む必要があるなど一苦労かかりますね!
私の記事がなにかお役に立てれば幸いです。