MD5(Message-Digest Algorithm 5) 由 Ronald Rivest 於 1991 年設計,是 MD4 的改進版。它將任意長度的位元組串(byte stream)轉換為固定長度 128-bit(16 位元組)的雜湊值。注意:輸入是「位元組串」而非「字串」,因此與字元編碼(UTF-8、Big5 等)無關,僅取決於原始位元組值。
MD5(password) 而非明文。驗證時計算輸入密碼的 MD5 比對。現代系統應改用 bcrypt、Argon2、PBKDF2 等慢速雜湊 + Salt。訊息長度 L(bit)滿足 L ≡ 448 (mod 512)。具體做法:先加一個 1 bit,再補 0 bit 至達標。補位後長度為 K×512 + 448 bits(即 K×64 + 56 bytes)。
以 64-bit 小端序整數表示原始訊息長度 L(bit),附加在補位後的資料末尾。此時總長度為 512-bit 的倍數(N×512 bits)。
四個 32-bit 暫存器(以十六進位顯示):
A = 0x01234567
B = 0x89ABCDEF
C = 0xFEDCBA98
D = 0x76543210
每輪使用不同函數(X,Y,Z 為 32-bit 字):
F(X,Y,Z) = (X & Y) | (~X & Z)
G(X,Y,Z) = (X & Z) | (Y & ~Z)
H(X,Y,Z) = X ^ Y ^ Z
I(X,Y,Z) = Y ^ (X | ~Z)
每輪處理一個 512-bit 區塊(16 個 32-bit 字 M[0..15])。使用常數表 T[1..64](T[i] = floor(2^32 × |sin(i)|))。
每步操作形式:a = b + ((a + f(b,c,d) + X[k] + T[i]) <<< s),其中 f 為輪函數,k 為訊息字索引,s 為左循環位移量,i 為步驟號。
四輪索引與位移量安排(節錄):
| 輪次 | 函數 | 步驟範例 |
|---|---|---|
| 1 | F | [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] ... |
| 2 | G | [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] ... |
| 3 | H | [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] ... |
| 4 | I | [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] ... |
每輪結束後:A += AA; B += BB; C += CC; D += DD(AA..DD 為輪初值)。
將最終 A,B,C,D 以小端序串接為 128-bit 雜湊值(通常以 32 字元十六進位字串表示)。
| 攻擊類型 | 現狀 | 影響 |
|---|---|---|
| 碰撞攻擊 | 2004 年 Wang 等人實際構造碰撞,複雜度 ~2^39 | 可偽造數位簽章、惡意軟體繞過白名單 |
| 選擇前綴碰撞 | 2009 年 Stevens 等人改進,複雜度 ~2^50 | 可產生任意前綴的兩份不同檔案同雜湊 |
| 預像攻擊 | 理論複雜度 2^128,尚無實際破解 | 單向性尚存,但不建議新系統使用 |
結論:MD5 已不適合任何需要抗碰撞的安全用途(數位簽章、憑證、完整性驗證、新系統密碼雜湊)。