C# の文字列から MD5 ハッシュを計算する
ハッシュアルゴリズムは、任意の入力データを固定サイズのハッシュにマッピングする際に使用される数学的アルゴリズムです。これらは、ハッシュマップ、パスワード検証、メッセージダイジェスト、暗号通貨セキュリティなどのデータ構造にデータを保存するなど、さまざまな目的で使用されます。
MD5 は、ハッシュアルゴリズムのメッセージダイジェストクラスに属しています。Rivest は、MD5 および MD2、MD4 などの他のアルゴリズムを開発しました。
このアルゴリズムは元々、デジタル署名を認証するために設計されました。しかしその後、多くの脆弱性が発見され、その脆弱性が廃止されました。
それでもなお、データの整合性の検証に使用され、高度なアルゴリズムを理解するための基盤を形成します。MD5 アルゴリズムは、すべてのメッセージダイジェストアルゴリズムと同様に、長さが不明なメッセージを入力として受け取り、それを固定サイズのハッシュに変換します。
入力文字列を少し変更すると、ハッシュが完全に異なります。この記事では、C# を使用して MD5 ハッシュを計算する方法を学習します。
C# で MD5 アルゴリズムを使用する
MD5 アルゴリズムは、次の 4つの主要なステップで構成されています。
まず、パディングビットを追加します。
このステップでは、合計ビット数が 512 の最も近い倍数よりも 64 少なくなるようにパディングビットを追加します。これは、アルゴリズムが 512 ビットのサイズとステップ 2 のデータを処理できるようにするために行われます。64 ビットで表される文字列の長さが追加され、512 の偶数倍になります。
次に、長さビットを追加します。
文字列の長さを 64 ビットで計算します。ステップ 1 で形成された出力にそれらを追加します。
第三に、MD バッファーを初期化します。
A、B、C、および D という名前の 32 ビットの 4 メッセージダイジェストバッファを初期化します。それらは次のとおりです。
A = 01 23 45 67
B = 89 ab cd ef
C = fe dc ba 98
D = 76 54 32 10
4つ目は、個々の 512 ビットブロックの処理です。
ビット全体がサイズ 512 のブロックに分割されます。形成された各ブロックは、32 ビットの 16 サブブロックに分割されます。形成されたすべての 16 ブロックは、バッファ A、B、C、および D を使用した一連の 4 演算を通過して、最終的なハッシュを生成します。
C# で System.Security.Cryptography ライブラリを使用して文字列から MD5 ハッシュを計算する
using System;
using System.Security.Cryptography;
using System.Text;
public class Test {
public static string ComputeMd5Hash(string message) {
using (MD5 md5 = MD5.Create()) {
byte[] input = Encoding.ASCII.GetBytes(message);
byte[] hash = md5.ComputeHash(input);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++) {
sb.Append(hash[i].ToString("X2"));
}
return sb.ToString();
}
}
public static void Main() {
string message = "Welcome to DelfStack";
Console.WriteLine(ComputeMd5Hash(message));
}
}
出力:
53C62733BB54F2B720A32490E6C447FF
上記のプログラムでは、C# に存在する MD5 クラスのオブジェクトを作成します。これは、メソッド ComputeHash() を介して md5 アルゴリズムの既製の実装を提供します。
メッセージ文字列をバイトストリームに変換して、ComputeHash() メソッドの関数シグネチャと一致させます。これにより、結果がバイトストリームの形式で返されます。次に、文字列ビルダークラスを使用して、バイトストリームを有効な C# 文字列に変換します。
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn