• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            君子性非異也,善假于物也。

            如有恒,何須三更起,半夜眠;最怕莫,三天打魚兩天曬網,竹籃打水一場空!
            posts - 31, comments - 23, trackbacks - 0, articles - 30
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            初識MD5算法

            Posted on 2006-11-09 20:51 neter 閱讀(362) 評論(0)  編輯 收藏 引用 所屬分類: 程序設計
            MD5的全稱是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer sciencersa data security incronald l. rivest開發出來,經md2md3md4發展而來。它的作用是讓大容量信息在用數字簽名軟件簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成一定長的大整數)。不管是md2md4還是md5,它們都需要獲得一個隨機長度的信息并產生一個128位的信息摘要。雖然這些算法的結構或多或少有些相似,但md2的設計與md4md5完全不同,那是因為md2是為8位機器做過設計優化的,而md4md5卻是面向32位的電腦。這三個算法的描述和c語言源代碼在internet rfcs 1321中有詳細的描述(http://www.ietf.org/rfc/rfc1321.txt),這是一份最權威的文檔,由ronald l. rivest19928月向ieft提交。

              rivest1989年開發出md2算法。在這個算法中,首先對信息進行數據補位,使信息的字節長度是16的倍數。然后,以一個16位的檢驗和追加到信息末尾。并且根據這個新產生的信息計算出散列值。后來,rogierchauvaud發現如果忽略了檢驗和將產生md2沖突。md2算法的加密后結果是唯一的--既沒有重復。

              為了加強算法的安全性,rivest1990年又開發出md4算法。md4算法同樣需要填補信息以確保信息的字節長度加上448后能被512整除(信息字節長度mod 512 = 448)。然后,一個以64位二進制表示的信息的最初長度被添加進來。信息被處理成512damg?rd/merkle迭代結構的區塊,而且每個區塊要通過三個不同步驟的處理。den boerbosselaers以及其他人很快的發現了攻擊md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的個人電腦在幾分鐘內找到md4完整版本中的沖突(這個沖突實際上是一種漏洞,它將導致對不同的內容進行加密卻可能得到相同的加密后結果)。毫無疑問,md4就此被淘汰掉了。

              盡管md4算法在安全上有個這么大的漏洞,但它對在其后才被開發出來的好幾種信息安全加密算法的出現卻有著不可忽視的引導作用。除了md5以外,其中比較有名的還有sha-1ripe-md以及haval等。

              一年以后,即1991年,rivest開發出技術上更為趨近成熟的md5算法。它在md4的基礎上增加了"安全-帶子"safety-belts)的概念。雖然md5md4稍微慢一些,但卻更為安全。這個算法很明顯的由四個和md4設計有少許不同的步驟組成。在md5算法中,信息-摘要的大小和填充的必要條件與md4完全相同。den boerbosselaers曾發現md5算法中的假沖突(pseudo-collisions),但除此之外就沒有其他被發現的加密后結果了。

              van oorschotwiener曾經考慮過一個在散列中暴力搜尋沖突的函數(brute-force hash function),而且他們猜測一個被設計專門用來搜索md5沖突的機器(這臺機器在1994年的制造成本大約是一百萬美元)可以平均每24天就找到一個沖突。但單從1991年到2001年這10年間,竟沒有出現替代md5算法的md6或被叫做其他什么名字的新算法這一點,我們就可以看出這個瑕疵并沒有太多的影響md5的安全性。上面所有這些都不足以成為md5的在實際應用中的問題。并且,由于md5算法的使用不需要支付任何版權費用的,所以在一般的情況下(非絕密應用領域。但即便是應用在絕密領域內,md5也不失為一種非常優秀的中間技術),md5怎么都應該算得上是非常安全的了。

            ?????? MD5是一個在國內外有著廣泛的應用的雜湊函數算法,它曾一度被認為是非常安全的。HASH函數,又稱雜湊函數,是在信息安全領域有廣泛和重要應用的密碼算法,它有一種類似于指紋的應用。在網絡安全協議中,雜湊函數用來處理電子簽名,將冗長的簽名文件壓縮為一段獨特的數字信息,像指紋鑒別身份一樣保證原來數字簽名文件的合法性和安全性。在前面提到的SHA-1MD5都是目前最常用的雜湊函數。經過這些算法的處理,原始信息即使只更動一個字母,對應的壓縮信息也會變為截然不同的“指紋”,這就保證了經過處理信息的唯一性。為電子商務等提供了數字認證的可能性。

            ???? 安全的雜湊函數在設計時必須滿足兩個要求:其一是尋找兩個輸入得到相同的輸出值在計算上是不可行的,這就是我們通常所說的抗碰撞的;其二是找一個輸入,能得到給定的輸出在計算上是不可行的,即不可從結果推導出它的初始狀態。現在使用的重要計算機安全協議,如SSLPGP都用雜湊函數來進行簽名,一旦找到兩個文件可以產生相同的壓縮值,就可以偽造簽名,給網絡安全領域帶來巨大隱患。

              算法的應用

              md5的典型應用是對一段信息(message)產生信息摘要(message-digest),以防止被篡改。比如,在unix下有很多軟件在下載的時候都有一個文件名相同,文件擴展名為.md5的文件,在這個文件中通常只有一行文本,大致結構如:

               md5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461

              這就是tanajiya.tar.gz文件的數字簽名。md5將整個文件當作一個大文本信息,通過其不可逆的字符串變換算法,產生了這個唯一的md5信息摘要。如果在以后傳播這個文件的過程中,無論文件的內容發生了任何形式的改變(包括人為修改或者下載過程中線路不穩定引起的傳輸錯誤等),只要你對這個文件重新計算md5時就會發現信息摘要不相同,由此可以確定你得到的只是一個不正確的文件。如果再有一個第三方的認證機構,用md5還可以防止文件作者的"抵賴",這就是所謂的數字簽名應用。

              md5還廣泛用于加密和解密技術上。比如在unix系統中用戶的密碼就是以md5(或其它類似的算法)經加密后存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成md5值,然后再去和保存在文件系統中的md5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員權限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。

              正是因為這個原因,現在被黑客使用最多的一種破譯密碼的方法就是一種被稱為"跑字典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字符串表,另一種是用排列組合方法生成的,先用md5程序計算出這些字典項的md5值,然后再用目標的md5值在這個字典中檢索。我們假設密碼的最大長度為8位字節(8 bytes),同時密碼只能是字母和數字,共26+26+10=62個字符,排列組合出的字典的項數則是p(62,1)+p(62,2).+p(62,8),那也已經是一個很天文的數字了,存儲這個字典就需要tb級的磁盤陣列,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼md5值的情況下才可以。這種加密技術被廣泛的應用于unix系統中,這也是為什么unix系統比一般操作系統更為堅固一個重要原因。

              算法描述

              對md5算法簡要的敘述可以為:md5512位分組來處理輸入的信息,且每一分組又被劃分為1632位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。

              在MD5算法中,首先需要對信息進行填充,使其字節長度對512求余的結果等于448。因此,信息的字節長度(bits length)將被擴展至n*512+448,即n*64+56個字節(bytes),n為一個正整數。填充的方法如下,在信息的后面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然后,在在這個結果后面附加一個以64位二進制表示的填充前信息長度。經過這兩步的處理,現在的信息字節長度=n*512+448+64=(n+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足后面處理中對信息長度的要求。

              MD5中有四個32位被稱作鏈接變量(chaining variable)的整數參數,他們分別為:a=0x01234567b=0x89abcdefc=0xfedcba98d=0x76543210?

              當設置好這四個鏈接變量后,就開始進入算法的四輪循環運算。循環的次數是信息中512位信息分組的數目。

              將上面四個鏈接變量復制到另外四個變量中:aabbccdd

              主循環有四輪(md4只有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對abcd中的其中三個作一次非線性函數運算,然后將所得結果加上第四個變量,文本的一個子分組和一個常數。再將所得結果向右環移一個不定的數,并加上abcd中之一。最后用該結果取代abcd中之一。

            以一下是每次操作中用到的四個非線性函數(每輪一個)。

               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))

               (&是與,|是或,~是非,^是異或)

              這四個函數的說明:如果xyz的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。

            f是一個逐位運算的函數。即,如果x,那么y,否則z。函數h是逐位奇偶操作符。

              假設mj表示消息的第j個子分組(從015),

            ?????? ff(a,b,c,d,mj,s,ti)表示a=b+((a+(f(b,c,d)+mj+ti)

            ?????? gg(a,b,c,d,mj,s,ti)表示a=b+((a+(g(b,c,d)+mj+ti)

            ?????? hh(a,b,c,d,mj,s,ti)表示a=b+((a+(h(b,c,d)+mj+ti)

            ?????? ii(a,b,c,d,mj,s,ti)表示a=b+((a+(i(b,c,d)+mj+ti)

              這四輪(64步)是:

              第一輪

               ff(a,b,c,d,m0,7,0xd76aa478)

               ff(d,a,b,c,m1,12,0xe8c7b756)

               ff(c,d,a,b,m2,17,0x242070db)

            ff(b,c,d,a,m3,22,0xc1bdceee)

               ff(a,b,c,d,m4,7,0xf57c0faf)

               ff(d,a,b,c,m5,12,0x4787c62a)

               ff(c,d,a,b,m6,17,0xa8304613)

               ff(b,c,d,a,m7,22,0xfd469501)

               ff(a,b,c,d,m8,7,0x698098d8)

               ff(d,a,b,c,m9,12,0x8b44f7af)

               ff(c,d,a,b,m10,17,0xffff5bb1)

               ff(b,c,d,a,m11,22,0x895cd7be)

               ff(a,b,c,d,m12,7,0x6b901122)

               ff(d,a,b,c,m13,12,0xfd987193)

               ff(c,d,a,b,m14,17,0xa679438e)

               ff(b,c,d,a,m15,22,0x49b40821)

              第二輪

               gg(a,b,c,d,m1,5,0xf61e2562)

               gg(d,a,b,c,m6,9,0xc040b340)

               gg(c,d,a,b,m11,14,0x265e5a51)

               gg(b,c,d,a,m0,20,0xe9b6c7aa)

               gg(a,b,c,d,m5,5,0xd62f105d)

               gg(d,a,b,c,m10,9,0x02441453)

               gg(c,d,a,b,m15,14,0xd8a1e681)

               gg(b,c,d,a,m4,20,0xe7d3fbc8)

               gg(a,b,c,d,m9,5,0x21e1cde6)

               gg(d,a,b,c,m14,9,0xc33707d6)

               gg(c,d,a,b,m3,14,0xf4d50d87)

               gg(b,c,d,a,m8,20,0x455a14ed)

               gg(a,b,c,d,m13,5,0xa9e3e905)

               gg(d,a,b,c,m2,9,0xfcefa3f8)

               gg(c,d,a,b,m7,14,0x676f02d9)

               gg(b,c,d,a,m12,20,0x8d2a4c8a)

              第三輪

               hh(a,b,c,d,m5,4,0xfffa3942)

               hh(d,a,b,c,m8,11,0x8771f681)

               hh(c,d,a,b,m11,16,0x6d9d6122)

               hh(b,c,d,a,m14,23,0xfde5380c)

               hh(a,b,c,d,m1,4,0xa4beea44)

            精品久久久中文字幕人妻| 久久亚洲AV成人无码软件| 久久不射电影网| 中文字幕无码久久人妻| 久久99精品国产一区二区三区 | 色悠久久久久久久综合网| 一本一本久久A久久综合精品| 国内精品久久久久久久影视麻豆| 人妻少妇久久中文字幕一区二区| 久久这里有精品视频| 亚洲精品高清国产一久久| 久久精品a亚洲国产v高清不卡| 国产精品一区二区久久精品涩爱| 亚洲精品无码久久千人斩| 一本色道久久综合狠狠躁| 国产91久久综合| 国产真实乱对白精彩久久| 亚洲乱码精品久久久久..| 91精品国产综合久久四虎久久无码一级| 一本综合久久国产二区| AAA级久久久精品无码区| 久久99精品久久久久久动态图| 97热久久免费频精品99| 99国产精品久久| 亚洲午夜久久久久妓女影院| 精品久久久久久久中文字幕| 国产精品久久久久影视不卡| 欧美大香线蕉线伊人久久| 伊人 久久 精品| 亚洲精品午夜国产va久久| 亚洲香蕉网久久综合影视| 亚洲精品视频久久久| 久久久久久国产a免费观看黄色大片| www亚洲欲色成人久久精品| 日本道色综合久久影院| 怡红院日本一道日本久久| 精品久久久久香蕉网| 国产91久久精品一区二区| 国产精品久久久久无码av| 国产精品久久一区二区三区| www.久久热.com|