System.Security.Cryptography.MD5クラスでMD5ハッシュ値の計算、Convert.ToBase64StringメソッドでBASE64への変換ができる。
MD5ハッシュ値の生成
using System;
using System.Security.Cryptography;
using System.Text;
class Sample {
static void Main()
{
var source = "hogehoge";
using (var md5 = MD5.Create()) {
// MD5ハッシュ値を求める
var md5hash = md5.ComputeHash(Encoding.UTF8.GetBytes(source));
// もとめたハッシュ値をBASE64に変換する
var md5hash_base64 = Convert.ToBase64String(md5hash);
// 出力結果: MpQ15eZr6AmmVq8QX0JAHg==
Console.WriteLine(md5hash_base64);
}
}
}
Imports System
Imports System.Security.Cryptography
Imports System.Text
Class Sample
Shared Sub Main()
Dim source As String = "hogehoge"
Using md5 As MD5 = MD5.Create()
' MD5ハッシュ値を求める
Dim md5hash As Byte() = md5.ComputeHash(Encoding.UTF8.GetBytes(source))
' もとめたハッシュ値をBASE64に変換する
Dim md5hash_base64 As String = Convert.ToBase64String(md5hash)
' 出力結果: MpQ15eZr6AmmVq8QX0JAHg==
Console.WriteLine(md5hash_base64)
End Using
End Sub
End Class
CompluteHashメソッドにはStreamクラスを渡すこともできるので、ファイルのハッシュ値を求めたい場合などはファイルを開いてStreamを渡せばよい。
using System;
using System.IO;
using System.Security.Cryptography;
class Sample {
static void Main()
{
using (var sourceStream = File.OpenRead("file.dat")) {
using (var md5 = MD5.Create()) {
// MD5ハッシュ値を求める
var md5hash = md5.ComputeHash(sourceStream);
// もとめたハッシュ値をBASE64に変換する
var md5hash_base64 = Convert.ToBase64String(md5hash);
Console.WriteLine(md5hash_base64);
}
}
}
}
Imports System
Imports System.IO
Imports System.Security.Cryptography
Class Sample
Shared Sub Main()
Using sourceStream As Stream = File.OpenRead("file.dat")
Using md5 As MD5 = md5.Create()
' MD5ハッシュ値を求める
Dim md5hash As Byte() = md5.ComputeHash(sourceStream)
' もとめたハッシュ値をBASE64に変換する
Dim md5hash_base64 As String = Convert.ToBase64String(md5hash)
Console.WriteLine(md5hash_base64)
End Using
End Using
End Sub
End Class
SHA256クラスなどHashAlgorithmの派生クラスを用いることで、上記と同様のコードでMD5以外のハッシュ値を求めるようにすることもできる。
using System;
using System.Security.Cryptography;
using System.Text;
class Sample {
static void Main()
{
var source = "hogehoge";
using (var sha256 = SHA256.Create()) {
// SHA256ハッシュ値を求める
var sha256hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(source));
// もとめたハッシュ値をBASE64に変換する
var sha256hash_base64 = Convert.ToBase64String(sha256hash);
// 出力結果: THFtTPIRx7fS8yM8lBdxrQUH6lus+TtJJ2aqQa6fcg0=
Console.WriteLine(sha256hash_base64);
}
}
}
Imports System
Imports System.Security.Cryptography
Imports System.Text
Class Sample
Shared Sub Main()
Dim source As String = "hogehoge"
Using sha256 As SHA256 = SHA256.Create()
' SHA256ハッシュ値を求める
Dim sha256hash As Byte() = sha256.ComputeHash(Encoding.UTF8.GetBytes(source))
' もとめたハッシュ値をBASE64に変換する
Dim sha256hash_base64 As String = Convert.ToBase64String(sha256hash)
' 出力結果: THFtTPIRx7fS8yM8lBdxrQUH6lus+TtJJ2aqQa6fcg0=
Console.WriteLine(sha256hash_base64)
End Using
End Sub
End Class
md5sumコマンドのようにBASE64ではなく16進値で取得したい場合は、Convert.ToBase64String()メソッドの代わりにBitConverter.ToString()メソッドを使う。 ただし、BitConverter.ToString()メソッドはバイト毎にハイフンを挟み、大文字形式で文字列化するので、md5sumコマンドの結果と同じにしたい場合はハイフンを取り除き、大文字を小文字に必要がある。
using System;
using System.Security.Cryptography;
using System.Text;
class Sample {
static void Main()
{
var source = "hogehoge";
using (var md5 = MD5.Create()) {
// MD5ハッシュ値を求める
var md5hash = md5.ComputeHash(Encoding.UTF8.GetBytes(source));
// もとめたハッシュ値を16進形式に変換したあと、ハイフンを取り除き、小文字にする
var md5sum = BitConverter.ToString(md5hash).Replace("-", string.Empty).ToLowerInvariant();
// 出力結果: 329435e5e66be809a656af105f42401e
Console.WriteLine(md5sum);
}
}
}
Imports System
Imports System.Security.Cryptography
Imports System.Text
Class Sample
Shared Sub Main()
Dim source As String = "hogehoge"
Using md5 As MD5 = MD5.Create()
' MD5ハッシュ値を求める
Dim md5hash As Byte() = md5.ComputeHash(Encoding.UTF8.GetBytes(source))
' もとめたハッシュ値を16進形式に変換したあと、ハイフンを取り除き、小文字にする
Dim md5sum As String = BitConverter.ToString(md5hash).Replace("-", String.Empty).ToLowerInvariant()
' 出力結果: 329435e5e66be809a656af105f42401e
Console.WriteLine(md5sum)
End Using
End Sub
End Class
参考までに、md5sumコマンドを使った場合の結果は以下のとおり。
md5sumコマンドでの結果
$ echo -n "hogehoge" | md5sum - 329435e5e66be809a656af105f42401e -
MD5クラスを使ってmd5sumコマンドを実装する
MD5クラスを使ってmd5sumコマンドと同じ結果を出力するプログラムを作る。
md5sum.cs (md5sumコマンドと同じ結果を出力するプログラム)
using System;
using System.IO;
using System.Security.Cryptography;
class MD5Sum {
static void Main(string[] args)
{
using (var md5 = MD5.Create()) {
foreach (var file in args) {
// ファイル名が"-"だった場合は、標準入力に書き込まれた内容を読み込む
using (var stream = (file == "-") ? Console.OpenStandardInput() : File.OpenRead(file)) {
Console.WriteLine("{0} {1}",
BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", string.Empty).ToLowerInvariant(),
file);
}
md5.Initialize();
}
}
}
}
実行結果
$ gmcs md5sum.cs $ echo -n "hogehoge" | mono md5sum.exe ./md5sum.cs - ./md5sum.exe - 18c7d2fb4856b998a619ce9e9784bca0 ./md5sum.cs 329435e5e66be809a656af105f42401e - 7fb4bb0cbeccc7b401237d238d92549d ./md5sum.exe d41d8cd98f00b204e9800998ecf8427e - $ echo -n "hogehoge" | md5sum ./md5sum.cs - ./md5sum.exe - 18c7d2fb4856b998a619ce9e9784bca0 ./md5sum.cs 329435e5e66be809a656af105f42401e - 7fb4bb0cbeccc7b401237d238d92549d ./md5sum.exe d41d8cd98f00b204e9800998ecf8427e -