日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Message-Digest Algorithm 5

發(fā)布時間:2024/4/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Message-Digest Algorithm 5 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://zh.wikipedia.org/wiki/MD5

MD5即Message-Digest Algorithm 5(消息摘要算法第五版)的簡稱,是當(dāng)前計算機領(lǐng)域用于確保信息傳輸完整一致而廣泛使用的雜湊算法之一(又譯哈希算法、摘要算法等),主流編程語言普遍已有MD5的實現(xiàn)。

將數(shù)據(jù)(如一段文字)運算變?yōu)榱硪还潭ㄩL度值,是雜湊算法的基礎(chǔ)原理,MD5的前身有MD2、MD3和MD4。

目錄

?[隱藏]?
  • 1 歷史與密碼學(xué)
  • 2 弱點
  • 3 應(yīng)用
  • 4 算法
  • 5 偽代碼
  • 6 MD5散列
  • 7 參見
  • 8 參考文獻(xiàn)
  • 9 外部鏈接
    • 9.1 碰撞
    • 9.2 工具

歷史與密碼學(xué)

1992年8月Ronald L. Rivest向IETF提交了一份重要文件,描述了這種算法的原理,由于這種算法的公開性和安全性,在90年代被廣泛使用在各種程序語言中,用以確保資料傳遞無誤等。

MD5由MD4、MD3、MD2改進而來,主要增強算法復(fù)雜度和不可逆性。

MD5一度被廣泛應(yīng)用于計算機安全領(lǐng)域。但由于近年來MD5的弱點不斷被發(fā)現(xiàn),以及當(dāng)今計算機運算能力的不斷提升,現(xiàn)在已經(jīng)可能人為構(gòu)造出兩個具有相同MD5校驗值的信息[2],使本算法不再適合現(xiàn)今的安全領(lǐng)域。目前,MD5算法因其普遍、穩(wěn)定、快速的特點,仍廣泛應(yīng)用于普通數(shù)據(jù)的錯誤檢查領(lǐng)域。例如在一些BitTorrent下載中,軟件將通過計算MD5檢驗下載到的文件片段的完整性。

弱點

MD5算法較老,散列長度固定為128位元,隨著計算機運算能力提高,更快地找到“碰撞”是有可能的。因此,在安全要求高的場合不應(yīng)再使用MD5。

2004年,王小云證明MD5數(shù)字簽名算法可能被快速生成“碰撞”[3]。2007年,Marc Stevens,Arjen K. Lenstra和Benne de Weger進一步指出通過偽造軟件簽名,可重復(fù)性攻擊MD5算法[4]。研究者使用前綴碰撞法(chosen-prefix collision),使程序前端包含惡意程序,利用后面的空間添上垃圾代碼湊出同樣的MD5散列值。

2007年,荷蘭埃因霍芬技術(shù)大學(xué)科學(xué)家成功把2個可執(zhí)行文件進行了MD5碰撞,使得這兩個運行結(jié)果不同的程序會被計算出同一個MD5值[5]。2008年12月一組科研人員通過MD5碰撞成功生成了偽造的SSL證書,這使得在https協(xié)議中服務(wù)器可以偽造一些根CA的簽名。[6]

應(yīng)用

MD5已經(jīng)廣泛使用在為文件傳輸提供一定的可靠性方面。例如,服務(wù)器預(yù)先提供一個MD5校驗和,用戶下載完文件以后,用MD5算法計算下載文件的MD5校驗和,然后通過檢查這兩個校驗和是否一致,就能判斷下載的文件是否出錯。

算法

?

Figure 1. 一個MD5運算— 由類似的64次循環(huán)構(gòu)成,分成4組16次。F 一個非線性函數(shù);一個函數(shù)運算一次。Mi 表示一個 32-bits 的輸入數(shù)據(jù),Ki 表示一個 32-bits 常數(shù),用來完成每次不同的計算。

MD5是輸入不定長度信息,輸出固定長度128-bits的演算法。經(jīng)過程序流程,生成四個32位數(shù)據(jù),最后聯(lián)合起來成為一個128-bits散列。基本方式為,求余、取余、調(diào)整長度、與鏈接變量進行循環(huán)運算。得出結(jié)果。

是 XOR, AND, OR , NOT 的符號。

偽代碼

//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位十六進制數(shù)字。以下是一個43位長的僅ASCII字母列的MD5散列:

MD5("The quick brown fox jumps over the lazy dog") = 9e107d9d372bb6826bd81d3542a419d6

即使在原文中作一個小變化(比如用c取代d)其散列也會發(fā)生巨大的變化:

MD5("The quick brown fox jumps over the lazy cog") = 1055d3e698d289f2af8663725127bd4b

空文的散列為:

MD5("") = d41d8cd98f00b204e9800998ecf8427e

?

總結(jié)

以上是生活随笔為你收集整理的Message-Digest Algorithm 5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。