在 C# 中從字雜湊值符串計算 MD5 雜湊值

Harshit Jindal 2023年10月12日
  1. C# 中使用 MD5 演算法
  2. 使用 System.Security.Cryptography 庫從 C# 字串計算 MD5 雜湊值
在 C# 中從字雜湊值符串計算 MD5 雜湊值

雜湊演算法是用於將任意輸入資料對映到固定大小雜湊的數學演算法。它們用於多種用途,例如將資料儲存在雜湊值對映密碼驗證訊息消化加密貨幣安全等資料結構中。

MD5 屬於雜湊演算法的訊息摘要類。Rivest 開發了 MD5 和其他演算法,如 MD2MD4 等。

該演算法最初設計用於驗證數字簽名。但後來,發現了許多導致其棄用的漏洞。

儘管如此,它仍然用於資料完整性驗證,併為理解高階演算法奠定了基礎。MD5 演算法與所有訊息消化演算法一樣,將未知長度的訊息作為輸入,並將其轉換為固定大小的雜湊。

對輸入字串的微小更改將導致完全不同的雜湊值。本文將學習如何使用 C# 計算 MD5 雜湊值。

C# 中使用 MD5 演算法

MD5 演算法包括以下四個主要步驟:

首先,新增填充位。

在這一步中,我們新增填充位,使總位數變為 64,小於最接近的 512 倍數。這樣做是為了使演算法可以處理 512 位大小的資料,步長 2,以 64 位表示的字串長度相加得到 512 的偶數倍。

第二,新增長度位。

64 位計算字串的長度。將它們附加到步驟 1 中形成的輸出。

第三,初始化 MD 緩衝區。

我們初始化了 4 個訊息摘要緩衝區,其名稱為 ABCD32 位。它們如下:

A = 01 23 45 67
B = 89 ab cd ef
C = fe dc ba 98
D = 76 54 32 10

第四是單個 512 位塊的處理。

整個位被分成大小為 512 的塊。形成的每個塊被分成 1632 位的子塊。形成的所有 16 塊通過一系列 4 操作與緩衝區 ABCD 傳遞以給出最終雜湊。

使用 System.Security.Cryptography 庫從 C# 字串計算 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
Harshit Jindal avatar Harshit Jindal avatar

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