我的人生路  
          日歷
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789
          統(tǒng)計
          • 隨筆 - 74
          • 文章 - 57
          • 評論 - 7
          • 引用 - 0

          導航

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          顏色

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           
          MD5
          8 代碼演示 Coding by Sunrise_Chen.
           Description
          請輸入原碼:  經(jīng)MD5轉(zhuǎn)換后為:

          8 代碼綜述 Coding by Sunrise_Chen.
           Description

            MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest開發(fā)出來,經(jīng)MD2、MD3和MD4發(fā)展而來。它的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密匙前被"壓縮"成一種保密的格式(就是把一個任意長度的字節(jié)串變換成一定長的大整數(shù))。不管是MD2、MD4還是MD5,它們都需要獲得一個隨機長度的信息并產(chǎn)生一個128位的信息摘要。雖然這些算法的結(jié)構(gòu)或多或少有些相似,但MD2的設(shè)計與MD4和MD5完全不同,那是因為MD2是為8位機器做過設(shè)計優(yōu)化的,而MD4和MD5卻是面向32位的電腦。這三個算法的描述和C語言源代碼在Internet RFCs 1321中有詳細的描述http://www.ietf.org/rfc/rfc1321.txt),這是一份最權(quán)威的文檔,由Ronald L. Rivest在1992年8月向IEFT提交。

            Rivest在1989年開發(fā)出MD2算法。在這個算法中,首先對信息進行數(shù)據(jù)補位,使信息的字節(jié)長度是16的倍數(shù)。然后,以一個16位的檢驗和追加到信息末尾。并且根據(jù)這個新產(chǎn)生的信息計算出散列值。后來,Rogier和Chauvaud發(fā)現(xiàn)如果忽略了檢驗和將產(chǎn)生MD2沖突。MD2算法的加密后結(jié)果是唯一的--既沒有重復(fù)。

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

            盡管MD4算法在安全上有個這么大的漏洞,但它對在其后才被開發(fā)出來的好幾種信息安全加密算法的出現(xiàn)卻有著不可忽視的引導作用。除了MD5以外,其中比較有名的還有SHA-1、RIPE-MD以及HAVAL等。

            一年以后,即1991年,Rivest開發(fā)出技術(shù)上更為趨近成熟的MD5算法。它在MD4的基礎(chǔ)上增加了"安全-帶子"(Safety-Belts)的概念。雖然MD5比MD4稍微慢一些,但卻更為安全。這個算法很明顯的由四個和MD4設(shè)計有少許不同的步驟組成。在MD5算法中,信息-摘要的大小和填充的必要條件與MD4完全相同。Den Boer和Bosselaers曾發(fā)現(xiàn)MD5算法中的假沖突(Pseudo-Collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結(jié)果了。

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


          8 代碼分析 Coding by Sunrise_Chen.
           Source Code
          <%
          	'--------------------------------------
          	' COCOON Disk Manager v3 -- MD5 Function
          	'
          	'	經(jīng)典 MD5 算法的ASP實現(xiàn)
          	'                      -- 摘自某國外網(wǎng)站
          	'--------------------------------------
          	Private Const BITS_TO_A_BYTE = 8
          	Private Const BYTES_TO_A_WORD = 4
          	Private Const BITS_TO_A_WORD = 32
          	
          	Private m_lOnBits(30)
          	Private m_l2Power(30)
          	
          	Private Function LShift(lValue, iShiftBits)
          		If iShiftBits = 0 Then
          			LShift = lValue
          			Exit Function
          		ElseIf iShiftBits = 31 Then
          			If lValue And 1 Then
          				LShift = &H80000000
          			Else
          				LShift = 0
          			End If
          			Exit Function
          		ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
          			Err.Raise 6
          		End If
          	
          		If (lValue And m_l2Power(31 - iShiftBits)) Then
          			LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
          		Else
          			LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
          		End If
          	End Function
          	
          	Private Function RShift(lValue, iShiftBits)
          		If iShiftBits = 0 Then
          			RShift = lValue
          			Exit Function
          		ElseIf iShiftBits = 31 Then
          			If lValue And &H80000000 Then
          				RShift = 1
          			Else
          				RShift = 0
          			End If
          			Exit Function
          		ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
          			Err.Raise 6
          		End If
          	
          		RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)
          	
          		If (lValue And &H80000000) Then
          			RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
          		End If
          	End Function
          	
          	Private Function RotateLeft(lValue, iShiftBits)
          		RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
          	End Function
          	
          	Private Function AddUnsigned(lX, lY)
          		Dim lX4
          		Dim lY4
          		Dim lX8
          		Dim lY8
          		Dim lResult
          	
          		lX8 = lX And &H80000000
          		lY8 = lY And &H80000000
          		lX4 = lX And &H40000000
          		lY4 = lY And &H40000000
          		
          		lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)
          	
          		If lX4 And lY4 Then
          			lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
          		ElseIf lX4 Or lY4 Then
          			If lResult And &H40000000 Then
          				lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
          			Else
          				lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
          			End If
          		Else
          			lResult = lResult Xor lX8 Xor lY8
          		End If
          	
          		AddUnsigned = lResult
          	End Function
          	
          	Private Function md5_F(x, y, z)
          		md5_F = (x And y) Or ((Not x) And z)
          	End Function
          	
          	Private Function md5_G(x, y, z)
          		md5_G = (x And z) Or (y And (Not z))
          	End Function
          	
          	Private Function md5_H(x, y, z)
          		md5_H = (x Xor y Xor z)
          	End Function
          	
          	Private Function md5_I(x, y, z)
          		md5_I = (y Xor (x Or (Not z)))
          	End Function
          	
          	Private Sub md5_FF(a, b, c, d, x, s, ac)
          		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))
          		a = RotateLeft(a, s)
          		a = AddUnsigned(a, b)
          	End Sub
          	
          	Private Sub md5_GG(a, b, c, d, x, s, ac)
          		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))
          		a = RotateLeft(a, s)
          		a = AddUnsigned(a, b)
          	End Sub
          	
          	Private Sub md5_HH(a, b, c, d, x, s, ac)
          		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))
          		a = RotateLeft(a, s)
          		a = AddUnsigned(a, b)
          	End Sub
          	
          	Private Sub md5_II(a, b, c, d, x, s, ac)
          		a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))
          		a = RotateLeft(a, s)
          		a = AddUnsigned(a, b)
          	End Sub
          	
          	Private Function ConvertToWordArray(sMessage)
          		Dim lMessageLength
          		Dim lNumberOfWords
          		Dim lWordArray()
          		Dim lBytePosition
          		Dim lByteCount
          		Dim lWordCount
          		
          		Const MODULUS_BITS = 512
          		Const CONGRUENT_BITS = 448
          		
          		lMessageLength = Len(sMessage)
          		
          		lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
          		ReDim lWordArray(lNumberOfWords - 1)
          		
          		lBytePosition = 0
          		lByteCount = 0
          		Do Until lByteCount >= lMessageLength
          			lWordCount = lByteCount \ BYTES_TO_A_WORD
          			lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
          			lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
          			lByteCount = lByteCount + 1
          		Loop
          	
          		lWordCount = lByteCount \ BYTES_TO_A_WORD
          		lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
          		
          		lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)
          		
          		lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
          		lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)
          	
          		ConvertToWordArray = lWordArray
          	End Function
          	
          	Private Function WordToHex(lValue)
          		Dim lByte
          		Dim lCount
          		
          		For lCount = 0 To 3
          			lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
          			WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
          		Next
          	End Function
          	
          	Public Function MD5(sMessage)
          		m_lOnBits(0) = CLng(1)
          		m_lOnBits(1) = CLng(3)
          		m_lOnBits(2) = CLng(7)
          		m_lOnBits(3) = CLng(15)
          		m_lOnBits(4) = CLng(31)
          		m_lOnBits(5) = CLng(63)
          		m_lOnBits(6) = CLng(127)
          		m_lOnBits(7) = CLng(255)
          		m_lOnBits(8) = CLng(511)
          		m_lOnBits(9) = CLng(1023)
          		m_lOnBits(10) = CLng(2047)
          		m_lOnBits(11) = CLng(4095)
          		m_lOnBits(12) = CLng(8191)
          		m_lOnBits(13) = CLng(16383)
          		m_lOnBits(14) = CLng(32767)
          		m_lOnBits(15) = CLng(65535)
          		m_lOnBits(16) = CLng(131071)
          		m_lOnBits(17) = CLng(262143)
          		m_lOnBits(18) = CLng(524287)
          		m_lOnBits(19) = CLng(1048575)
          		m_lOnBits(20) = CLng(2097151)
          		m_lOnBits(21) = CLng(4194303)
          		m_lOnBits(22) = CLng(8388607)
          		m_lOnBits(23) = CLng(16777215)
          		m_lOnBits(24) = CLng(33554431)
          		m_lOnBits(25) = CLng(67108863)
          		m_lOnBits(26) = CLng(134217727)
          		m_lOnBits(27) = CLng(268435455)
          		m_lOnBits(28) = CLng(536870911)
          		m_lOnBits(29) = CLng(1073741823)
          		m_lOnBits(30) = CLng(2147483647)
          		
          		m_l2Power(0) = CLng(1)
          		m_l2Power(1) = CLng(2)
          		m_l2Power(2) = CLng(4)
          		m_l2Power(3) = CLng(8)
          		m_l2Power(4) = CLng(16)
          		m_l2Power(5) = CLng(32)
          		m_l2Power(6) = CLng(64)
          		m_l2Power(7) = CLng(128)
          		m_l2Power(8) = CLng(256)
          		m_l2Power(9) = CLng(512)
          		m_l2Power(10) = CLng(1024)
          		m_l2Power(11) = CLng(2048)
          		m_l2Power(12) = CLng(4096)
          		m_l2Power(13) = CLng(8192)
          		m_l2Power(14) = CLng(16384)
          		m_l2Power(15) = CLng(32768)
          		m_l2Power(16) = CLng(65536)
          		m_l2Power(17) = CLng(131072)
          		m_l2Power(18) = CLng(262144)
          		m_l2Power(19) = CLng(524288)
          		m_l2Power(20) = CLng(1048576)
          		m_l2Power(21) = CLng(2097152)
          		m_l2Power(22) = CLng(4194304)
          		m_l2Power(23) = CLng(8388608)
          		m_l2Power(24) = CLng(16777216)
          		m_l2Power(25) = CLng(33554432)
          		m_l2Power(26) = CLng(67108864)
          		m_l2Power(27) = CLng(134217728)
          		m_l2Power(28) = CLng(268435456)
          		m_l2Power(29) = CLng(536870912)
          		m_l2Power(30) = CLng(1073741824)
          		
          		
          		Dim x
          		Dim k
          		Dim AA
          		Dim BB
          		Dim CC
          		Dim DD
          		Dim a
          		Dim b
          		Dim c
          		Dim d
          		
          		Const S11 = 7
          		Const S12 = 12
          		Const S13 = 17
          		Const S14 = 22
          		Const S21 = 5
          		Const S22 = 9
          		Const S23 = 14
          		Const S24 = 20
          		Const S31 = 4
          		Const S32 = 11
          		Const S33 = 16
          		Const S34 = 23
          		Const S41 = 6
          		Const S42 = 10
          		Const S43 = 15
          		Const S44 = 21
          		
          		x = ConvertToWordArray(sMessage)
          		
          		a = &H67452301
          		b = &HEFCDAB89
          		c = &H98BADCFE
          		d = &H10325476
          		
          		For k = 0 To UBound(x) Step 16
          			AA = a
          			BB = b
          			CC = c
          			DD = d
          			
          			md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478
          			md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756
          			md5_FF c, d, a, b, x(k + 2), S13, &H242070DB
          			md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
          			md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
          			md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A
          			md5_FF c, d, a, b, x(k + 6), S13, &HA8304613
          			md5_FF b, c, d, a, x(k + 7), S14, &HFD469501
          			md5_FF a, b, c, d, x(k + 8), S11, &H698098D8
          			md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
          			md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
          			md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE
          			md5_FF a, b, c, d, x(k + 12), S11, &H6B901122
          			md5_FF d, a, b, c, x(k + 13), S12, &HFD987193
          			md5_FF c, d, a, b, x(k + 14), S13, &HA679438E
          			md5_FF b, c, d, a, x(k + 15), S14, &H49B40821
          			
          			md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562
          			md5_GG d, a, b, c, x(k + 6), S22, &HC040B340
          			md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51
          			md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
          			md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D
          			md5_GG d, a, b, c, x(k + 10), S22, &H2441453
          			md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681
          			md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
          			md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
          			md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6
          			md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87
          			md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED
          			md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905
          			md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
          			md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9
          			md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A
          			
          			md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942
          			md5_HH d, a, b, c, x(k + 8), S32, &H8771F681
          			md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122
          			md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C
          			md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
          			md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
          			md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
          			md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
          			md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6
          			md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA
          			md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085
          			md5_HH b, c, d, a, x(k + 6), S34, &H4881D05
          			md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039
          			md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
          			md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
          			md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665
          			
          			md5_II a, b, c, d, x(k + 0), S41, &HF4292244
          			md5_II d, a, b, c, x(k + 7), S42, &H432AFF97
          			md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7
          			md5_II b, c, d, a, x(k + 5), S44, &HFC93A039
          			md5_II a, b, c, d, x(k + 12), S41, &H655B59C3
          			md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92
          			md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D
          			md5_II b, c, d, a, x(k + 1), S44, &H85845DD1
          			md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F
          			md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
          			md5_II c, d, a, b, x(k + 6), S43, &HA3014314
          			md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1
          			md5_II a, b, c, d, x(k + 4), S41, &HF7537E82
          			md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235
          			md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
          			md5_II b, c, d, a, x(k + 9), S44, &HEB86D391
          			
          			a = AddUnsigned(a, AA)
          			b = AddUnsigned(b, BB)
          			c = AddUnsigned(c, CC)
          			d = AddUnsigned(d, DD)
          		Next
          		
          		MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
          	End Function
          %>
          


          歡迎大家訪問我的個人網(wǎng)站 萌萌的IT人
          posted on 2005-08-11 16:23 一天一點愛戀 閱讀(179) 評論(0)  編輯  收藏 所屬分類: java

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
          相關(guān)文章:
           
           
          Copyright © 一天一點愛戀 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 龙江县| 博湖县| 石阡县| 博爱县| 汕尾市| 英吉沙县| 紫金县| 治多县| 裕民县| 万盛区| 安庆市| 九龙坡区| 镇宁| 芦溪县| 临颍县| 曲水县| 丘北县| 施秉县| 乐都县| 资源县| 英德市| 吉水县| 五原县| 通道| 科技| 延长县| 册亨县| 满洲里市| 渭源县| 常州市| 三穗县| 三河市| 饶阳县| 浦江县| 荥经县| 洞头县| 枣庄市| 伊川县| 屯门区| 朔州市| 石城县|