加密技術(shù)04-哈希算法-MD5原理

背景

MD5消息摘要算法(英語:MD5 Message-Digest Algorithm)凳忙,一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個 128 位( 16 字節(jié)草穆,被表示為 32 位十六進制數(shù)字)的散列值(hash value)敢伸,用于確保信息傳輸完整一致遇骑。MD5 由美國密碼學(xué)家羅納德·李維斯特(Ronald Linn Rivest)設(shè)計悯姊,于 1992 年公開羡藐,用以取代 MD4 算法。這套算法的程序在 RFC 1321 中被加以規(guī)范悯许。

將數(shù)據(jù)(如一段文字)運算變?yōu)榱硪还潭ㄩL度值仆嗦,是散列算法的基礎(chǔ)原理。

原理

  1. 補全消息先壕,在消息尾部瘩扼,先添加一位 1,之后補 0垃僚,使得消息長度(bits) % 512 = 448集绰;
  2. 然后把消息的長度值模上 2^64, 然后湊齊 64 位拼在尾部谆棺,總長度恰好可以被 512 整除栽燕;
  3. 初始化 4 個 32 位值,分別為 h0, h1, h2, h3改淑;
  4. 把消息分割成 k 份碍岔,每份長度 512 位,依次處理這 k 份數(shù)據(jù)朵夏;
  5. 把 h0, h1, h2, h3 和這 512 為數(shù)據(jù)塊蔼啦,進行 64 輪混淆和擴散處理;
  6. 拼接 h0, h1, h2, h3 然后輸出侍郭。

注意:MD5 對消息的長度沒有要求询吴。

// 偽代碼
unsigned int32 r[64], k[64]

//移位表
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}

//非線性變化掠河,造成雪崩效益
for i from 0 to 63
    k[i] := floor(abs(sin(i + 1)) × 2^32)

//初始值
var int h0 := 0x67452301
var int h1 := 0xEFCDAB89
var int h2 := 0x98BADCFE
var int h3 := 0x10325476

//補全消息亮元,首先必須添加一位 1,之后補 0唠摹,使得消息長度(bits) % 512 = 448
//然后把 message 的字節(jié)長度模上 2^64爆捞,以 64 位小端序的方式拼在尾部,總比特位數(shù)恰好可以被 512 整除
append "1" bit to message
append "0" bits until message length in bits ≡ 448 (mod 512)
append original length in bits mod 2^64 as 64-bit little-endian integer to message

//每次處理 512 位
for each 512-bit chunk of message
    //512 位每 32 位組成一個值勾拉,共 16 個煮甥,依次存入 w[0..15]
    break chunk into sixteen 32-bit little-endian words w[i], 0 ≤ i ≤ 15

    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

// 小端序
unsigned int32 digest := h0 append h1 append h2 append h3 

字節(jié)的排列方式有兩個通用規(guī)則

  • 大端序(Big-Endian)將數(shù)據(jù)的低位字節(jié)存放在內(nèi)存的高位地址藕赞,高位字節(jié)存放在低位地址成肘。這種排列方式與數(shù)據(jù)用字節(jié)表示時的書寫順序一致,符合人類的閱讀習慣斧蜕。
  • 小端序(Little-Endian)双霍,將一個多位數(shù)的低位放在較小的地址處,高位放在較大的地址處,則稱小端序洒闸。小端序與人類的閱讀習慣相反染坯,但更符合計算機讀取內(nèi)存的方式,因為CPU讀取內(nèi)存中的數(shù)據(jù)時丘逸,是從低地址向高地址方向進行讀取的单鹿。

比如:存儲 16 進制值 0x12345678,需要使用 4 個字節(jié)深纲,存儲字節(jié)在內(nèi)存地址增長方向分別是

大端序方式存儲:0x12 0x34 0x56 0x78

小端序方式存儲:0x78 0x56 0x34 0x12

安全

1996 年后被證實存在弱點仲锄,可以被加以破解,對于需要高度安全性的資料囤萤,專家一般建議改用其他算法昼窗,如 SHA-2。2004 年涛舍,證實 MD5 算法無法防止碰撞攻擊澄惊,因此不適用于安全性認證,如 SSL 公開密鑰認證或是數(shù)字簽名等用途富雅。

2009 年掸驱,中國科學(xué)院的謝濤和馮登國僅用了 220.96 的碰撞算法復(fù)雜度,破解了 MD5 的碰撞抵抗没佑,該攻擊在普通計算機上運行只需要數(shù)秒鐘毕贼。2011 年,RFC 6151 禁止 MD5 用作密鑰散列消息認證碼蛤奢。

關(guān)于 MD5 的 16 位與 32 位的區(qū)別

MD5 哈希后的位數(shù)一般為兩種鬼癣,16 位與 32 位。16 位實際上是從 32 位字符串中啤贩,取中間的第 9 位到第 24 位的部分待秃。

MD532("123123") = "4297F44B13955235245B2497399D7A93"

MD516("123123") = "13955235245B2497"

參考文獻

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痹屹,隨后出現(xiàn)的幾起案子章郁,更是在濱河造成了極大的恐慌,老刑警劉巖志衍,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暖庄,死亡現(xiàn)場離奇詭異,居然都是意外死亡楼肪,警方通過查閱死者的電腦和手機培廓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來春叫,“玉大人肩钠,你說我怎么就攤上這事俘侠。” “怎么了蔬将?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵爷速,是天一觀的道長。 經(jīng)常有香客問我霞怀,道長惫东,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任毙石,我火速辦了婚禮廉沮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徐矩。我一直安慰自己滞时,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布滤灯。 她就那樣靜靜地躺著坪稽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳞骤。 梳的紋絲不亂的頭發(fā)上窒百,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音豫尽,去河邊找鬼篙梢。 笑死,一個胖子當著我的面吹牛美旧,可吹牛的內(nèi)容都是我干的渤滞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼榴嗅,長吁一口氣:“原來是場噩夢啊……” “哼妄呕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起录肯,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤趴腋,失蹤者是張志新(化名)和其女友劉穎吊说,沒想到半個月后论咏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡颁井,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年厅贪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雅宾。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡养涮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贯吓,我是刑警寧澤懈凹,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站悄谐,受9級特大地震影響介评,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爬舰,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一们陆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧情屹,春花似錦坪仇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惜颇,卻和暖如春雾袱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背官还。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工芹橡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人望伦。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓林说,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屯伞。 傳聞我的和親對象是個殘疾皇子腿箩,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容