Message-Digest Algorithm 5
http://zh.wikipedia.org/wiki/MD5
MD5即Message-Digest Algorithm 5(消息摘要算法第五版)的簡(jiǎn)稱(chēng),是當(dāng)前計(jì)算機(jī)領(lǐng)域用于確保信息傳輸完整一致而廣泛使用的雜湊算法之一(又譯哈希算法、摘要算法等),主流編程語(yǔ)言普遍已有MD5的實(shí)現(xiàn)。
將數(shù)據(jù)(如一段文字)運(yùn)算變?yōu)榱硪还潭ㄩL(zhǎng)度值,是雜湊算法的基礎(chǔ)原理,MD5的前身有MD2、MD3和MD4。
目錄
?[隱藏]?- 1 歷史與密碼學(xué)
- 2 弱點(diǎn)
- 3 應(yīng)用
- 4 算法
- 5 偽代碼
- 6 MD5散列
- 7 參見(jiàn)
- 8 參考文獻(xiàn)
- 9 外部鏈接
- 9.1 碰撞
- 9.2 工具
歷史與密碼學(xué)
1992年8月Ronald L. Rivest向IETF提交了一份重要文件,描述了這種算法的原理,由于這種算法的公開(kāi)性和安全性,在90年代被廣泛使用在各種程序語(yǔ)言中,用以確保資料傳遞無(wú)誤等。
MD5由MD4、MD3、MD2改進(jìn)而來(lái),主要增強(qiáng)算法復(fù)雜度和不可逆性。
MD5一度被廣泛應(yīng)用于計(jì)算機(jī)安全領(lǐng)域。但由于近年來(lái)MD5的弱點(diǎn)不斷被發(fā)現(xiàn),以及當(dāng)今計(jì)算機(jī)運(yùn)算能力的不斷提升,現(xiàn)在已經(jīng)可能人為構(gòu)造出兩個(gè)具有相同MD5校驗(yàn)值的信息[2],使本算法不再適合現(xiàn)今的安全領(lǐng)域。目前,MD5算法因其普遍、穩(wěn)定、快速的特點(diǎn),仍廣泛應(yīng)用于普通數(shù)據(jù)的錯(cuò)誤檢查領(lǐng)域。例如在一些BitTorrent下載中,軟件將通過(guò)計(jì)算MD5檢驗(yàn)下載到的文件片段的完整性。
弱點(diǎn)
MD5算法較老,散列長(zhǎng)度固定為128位元,隨著計(jì)算機(jī)運(yùn)算能力提高,更快地找到“碰撞”是有可能的。因此,在安全要求高的場(chǎng)合不應(yīng)再使用MD5。
2004年,王小云證明MD5數(shù)字簽名算法可能被快速生成“碰撞”[3]。2007年,Marc Stevens,Arjen K. Lenstra和Benne de Weger進(jìn)一步指出通過(guò)偽造軟件簽名,可重復(fù)性攻擊MD5算法[4]。研究者使用前綴碰撞法(chosen-prefix collision),使程序前端包含惡意程序,利用后面的空間添上垃圾代碼湊出同樣的MD5散列值。
2007年,荷蘭埃因霍芬技術(shù)大學(xué)科學(xué)家成功把2個(gè)可執(zhí)行文件進(jìn)行了MD5碰撞,使得這兩個(gè)運(yùn)行結(jié)果不同的程序會(huì)被計(jì)算出同一個(gè)MD5值[5]。2008年12月一組科研人員通過(guò)MD5碰撞成功生成了偽造的SSL證書(shū),這使得在https協(xié)議中服務(wù)器可以偽造一些根CA的簽名。[6]
應(yīng)用
MD5已經(jīng)廣泛使用在為文件傳輸提供一定的可靠性方面。例如,服務(wù)器預(yù)先提供一個(gè)MD5校驗(yàn)和,用戶(hù)下載完文件以后,用MD5算法計(jì)算下載文件的MD5校驗(yàn)和,然后通過(guò)檢查這兩個(gè)校驗(yàn)和是否一致,就能判斷下載的文件是否出錯(cuò)。
算法
?
Figure 1. 一個(gè)MD5運(yùn)算— 由類(lèi)似的64次循環(huán)構(gòu)成,分成4組16次。F 一個(gè)非線(xiàn)性函數(shù);一個(gè)函數(shù)運(yùn)算一次。Mi 表示一個(gè) 32-bits 的輸入數(shù)據(jù),Ki 表示一個(gè) 32-bits 常數(shù),用來(lái)完成每次不同的計(jì)算。MD5是輸入不定長(zhǎng)度信息,輸出固定長(zhǎng)度128-bits的演算法。經(jīng)過(guò)程序流程,生成四個(gè)32位數(shù)據(jù),最后聯(lián)合起來(lái)成為一個(gè)128-bits散列。基本方式為,求余、取余、調(diào)整長(zhǎng)度、與鏈接變量進(jìn)行循環(huán)運(yùn)算。得出結(jié)果。
是 XOR, AND, OR , NOT 的符號(hào)。
偽代碼
//Note: All variables are unsigned 32 bits and wrap modulo 2^32 when calculating
var int[64] r, k
//r specifies the per-round shift amounts
r[ 0..15]:= {7, 12, 17, 22,? 7, 12, 17, 22,? 7, 12, 17, 22,? 7, 12, 17, 22}
r[16..31]:= {5,? 9, 14, 20,? 5,? 9, 14, 20,? 5,? 9, 14, 20,? 5,? 9, 14, 20}
r[32..47]:= {4, 11, 16, 23,? 4, 11, 16, 23,? 4, 11, 16, 23,? 4, 11, 16, 23}
r[48..63]:= {6, 10, 15, 21,? 6, 10, 15, 21,? 6, 10, 15, 21,? 6, 10, 15, 21}
//Use binary integer part of the sines of integers as constants:
for i from 0 to 63
??? k[i] := floor(abs(sin(i + 1)) × 2^32)
//Initialize variables:
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476
//Pre-processing:
append "1" bit to message
append "0" bits until message length in bits ≡ 448 (mod 512)
append bit length of message as 64-bit little-endian integer to message
//Process the message in successive 512-bit chunks:
for each 512-bit chunk of message
??? break chunk into sixteen 32-bit little-endian words w[i], 0 ≤ i ≤ 15
??? //Initialize hash value for this chunk:
??? var int a := h0
??? var int b := h1
??? var int c := h2
??? var int d := h3
??? //Main loop:
??? for i from 0 to 63
??????? if 0 ≤ i ≤ 15 then
??????????? f := (b and c) or ((not b) and d)
??????????? g := i
??????? else if 16 ≤ i ≤ 31
??????????? f := (d and b) or ((not d) and c)
??????????? g := (5×i + 1) mod 16
??????? else if 32 ≤ i ≤ 47
??????????? f := b xor c xor d
??????????? g := (3×i + 5) mod 16
??????? else if 48 ≤ i ≤ 63
??????????? f := c xor (b or (not d))
??????????? g := (7×i) mod 16
??????? temp := d
??????? d := c
??????? c := b
??????? b := leftrotate((a + f + k[i] + w[g]),r[i]) + b
??????? a := temp
??? Next i
??? //Add this chunk's hash to result so far:
??? h0 := h0 + a
??? h1 := h1 + b
??? h2 := h2 + c
??? h3 := h3 + d
End ForEach
var int digest := h0 append h1 append h2 append h3 //(expressed as little-endian)
MD5散列
一般128位的MD5散列被表示為32位十六進(jìn)制數(shù)字。以下是一個(gè)43位長(zhǎng)的僅ASCII字母列的MD5散列:
MD5("The quick brown fox jumps over the lazy dog") = 9e107d9d372bb6826bd81d3542a419d6即使在原文中作一個(gè)小變化(比如用c取代d)其散列也會(huì)發(fā)生巨大的變化:
MD5("The quick brown fox jumps over the lazy cog") = 1055d3e698d289f2af8663725127bd4b空文的散列為:
MD5("") = d41d8cd98f00b204e9800998ecf8427e?
總結(jié)
以上是生活随笔為你收集整理的Message-Digest Algorithm 5的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows上hadoop安装(cyg
- 下一篇: 五大常用算法之四:回溯法