MD5不可逆加密算法的ASP实现实例

------------------------------------

  1   
  2Private Const BITS_TO_A_BYTE = 8   
  3Private Const BYTES_TO_A_WORD = 4   
  4Private Const BITS_TO_A_WORD = 32 
  5
  6Private m_lOnBits(30)   
  7Private m_l2Power(30)   
  8  
  9Private Function LShift(lValue, iShiftBits)   
 10If iShiftBits = 0 Then   
 11LShift = lValue   
 12Exit Function   
 13ElseIf iShiftBits = 31 Then   
 14If lValue And 1 Then   
 15LShift = &H80000000   
 16Else   
 17LShift = 0   
 18End If   
 19Exit Function   
 20ElseIf iShiftBits < 0 Or iShiftBits > 31 Then   
 21Err.Raise 6   
 22End If 
 23
 24If (lValue And m_l2Power(31 - iShiftBits)) Then   
 25LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000   
 26Else   
 27LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))   
 28End If   
 29End Function 
 30
 31Private Function RShift(lValue, iShiftBits)   
 32If iShiftBits = 0 Then   
 33RShift = lValue   
 34Exit Function   
 35ElseIf iShiftBits = 31 Then   
 36If lValue And &H80000000 Then   
 37RShift = 1   
 38Else   
 39RShift = 0   
 40End If   
 41Exit Function   
 42ElseIf iShiftBits < 0 Or iShiftBits > 31 Then   
 43Err.Raise 6   
 44End If   
 45  
 46RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits) 
 47
 48If (lValue And &H80000000) Then   
 49RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))   
 50End If   
 51End Function 
 52
 53Private Function RotateLeft(lValue, iShiftBits)   
 54RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))   
 55End Function 
 56
 57Private Function AddUnsigned(lX, lY)   
 58Dim lX4   
 59Dim lY4   
 60Dim lX8   
 61Dim lY8   
 62Dim lResult   
 63  
 64lX8 = lX And &H80000000   
 65lY8 = lY And &H80000000   
 66lX4 = lX And &H40000000   
 67lY4 = lY And &H40000000   
 68  
 69lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)   
 70  
 71If lX4 And lY4 Then   
 72lResult = lResult Xor &H80000000 Xor lX8 Xor lY8   
 73ElseIf lX4 Or lY4 Then   
 74If lResult And &H40000000 Then   
 75lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8   
 76Else   
 77lResult = lResult Xor &H40000000 Xor lX8 Xor lY8   
 78End If   
 79Else   
 80lResult = lResult Xor lX8 Xor lY8   
 81End If   
 82  
 83AddUnsigned = lResult   
 84End Function 
 85
 86Private Function md5_F(x, y, z)   
 87md5_F = (x And y) Or ((Not x) And z)   
 88End Function 
 89
 90Private Function md5_G(x, y, z)   
 91md5_G = (x And z) Or (y And (Not z))   
 92End Function 
 93
 94Private Function md5_H(x, y, z)   
 95md5_H = (x Xor y Xor z)   
 96End Function 
 97
 98Private Function md5_I(x, y, z)   
 99md5_I = (y Xor (x Or (Not z)))   
100End Function 
101
102Private Sub md5_FF(a, b, c, d, x, s, ac)   
103a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac))   
104a = RotateLeft(a, s)   
105a = AddUnsigned(a, b)   
106End Sub 
107
108Private Sub md5_GG(a, b, c, d, x, s, ac)   
109a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac))   
110a = RotateLeft(a, s)   
111a = AddUnsigned(a, b)   
112End Sub 
113
114Private Sub md5_HH(a, b, c, d, x, s, ac)   
115a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac))   
116a = RotateLeft(a, s)   
117a = AddUnsigned(a, b)   
118End Sub 
119
120Private Sub md5_II(a, b, c, d, x, s, ac)   
121a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac))   
122a = RotateLeft(a, s)   
123a = AddUnsigned(a, b)   
124End Sub 
125
126Private Function ConvertToWordArray(sMessage)   
127Dim lMessageLength   
128Dim lNumberOfWords   
129Dim lWordArray()   
130Dim lBytePosition   
131Dim lByteCount   
132Dim lWordCount   
133  
134Const MODULUS_BITS = 512   
135Const CONGRUENT_BITS = 448   
136  
137lMessageLength = Len(sMessage)   
138  
139lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ 
140
141BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)   
142ReDim lWordArray(lNumberOfWords - 1)   
143  
144lBytePosition = 0   
145lByteCount = 0   
146Do Until lByteCount >= lMessageLength   
147lWordCount = lByteCount \ BYTES_TO_A_WORD   
148lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE   
149lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), 
150
151lBytePosition)   
152lByteCount = lByteCount + 1   
153Loop 
154
155lWordCount = lByteCount \ BYTES_TO_A_WORD   
156lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE 
157
158lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition) 
159
160lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)   
161lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)   
162  
163ConvertToWordArray = lWordArray   
164End Function 
165
166Private Function WordToHex(lValue)   
167Dim lByte   
168Dim lCount   
169  
170For lCount = 0 To 3   
171lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)   
172WordToHex = WordToHex & Right("0" & Hex(lByte), 2)   
173Next   
174End Function 
175
176Public Function MD5(sMessage)   
177m_lOnBits(0) = CLng(1)   
178m_lOnBits(1) = CLng(3)   
179m_lOnBits(2) = CLng(7)   
180m_lOnBits(3) = CLng(15)   
181m_lOnBits(4) = CLng(31)   
182m_lOnBits(5) = CLng(63)   
183m_lOnBits(6) = CLng(127)   
184m_lOnBits(7) = CLng(255)   
185m_lOnBits(8) = CLng(511)   
186m_lOnBits(9) = CLng(1023)   
187m_lOnBits(10) = CLng(2047)   
188m_lOnBits(11) = CLng(4095)   
189m_lOnBits(12) = CLng(8191)   
190m_lOnBits(13) = CLng(16383)   
191m_lOnBits(14) = CLng(32767)   
192m_lOnBits(15) = CLng(65535)   
193m_lOnBits(16) = CLng(131071)   
194m_lOnBits(17) = CLng(262143)   
195m_lOnBits(18) = CLng(524287)   
196m_lOnBits(19) = CLng(1048575)   
197m_lOnBits(20) = CLng(2097151)   
198m_lOnBits(21) = CLng(4194303)   
199m_lOnBits(22) = CLng(8388607)   
200m_lOnBits(23) = CLng(16777215)   
201m_lOnBits(24) = CLng(33554431)   
202m_lOnBits(25) = CLng(67108863)   
203m_lOnBits(26) = CLng(134217727)   
204m_lOnBits(27) = CLng(268435455)   
205m_lOnBits(28) = CLng(536870911)   
206m_lOnBits(29) = CLng(1073741823)   
207m_lOnBits(30) = CLng(2147483647)   
208  
209m_l2Power(0) = CLng(1)   
210m_l2Power(1) = CLng(2)   
211m_l2Power(2) = CLng(4)   
212m_l2Power(3) = CLng(8)   
213m_l2Power(4) = CLng(16)   
214m_l2Power(5) = CLng(32)   
215m_l2Power(6) = CLng(64)   
216m_l2Power(7) = CLng(128)   
217m_l2Power(8) = CLng(256)   
218m_l2Power(9) = CLng(512)   
219m_l2Power(10) = CLng(1024)   
220m_l2Power(11) = CLng(2048)   
221m_l2Power(12) = CLng(4096)   
222m_l2Power(13) = CLng(8192)   
223m_l2Power(14) = CLng(16384)   
224m_l2Power(15) = CLng(32768)   
225m_l2Power(16) = CLng(65536)   
226m_l2Power(17) = CLng(131072)   
227m_l2Power(18) = CLng(262144)   
228m_l2Power(19) = CLng(524288)   
229m_l2Power(20) = CLng(1048576)   
230m_l2Power(21) = CLng(2097152)   
231m_l2Power(22) = CLng(4194304)   
232m_l2Power(23) = CLng(8388608)   
233m_l2Power(24) = CLng(16777216)   
234m_l2Power(25) = CLng(33554432)   
235m_l2Power(26) = CLng(67108864)   
236m_l2Power(27) = CLng(134217728)   
237m_l2Power(28) = CLng(268435456)   
238m_l2Power(29) = CLng(536870912)   
239m_l2Power(30) = CLng(1073741824) 
240
241  
242Dim x   
243Dim k   
244Dim AA   
245Dim BB   
246Dim CC   
247Dim DD   
248Dim a   
249Dim b   
250Dim c   
251Dim d   
252  
253Const S11 = 7   
254Const S12 = 12   
255Const S13 = 17   
256Const S14 = 22   
257Const S21 = 5   
258Const S22 = 9   
259Const S23 = 14   
260Const S24 = 20   
261Const S31 = 4   
262Const S32 = 11   
263Const S33 = 16   
264Const S34 = 23   
265Const S41 = 6   
266Const S42 = 10   
267Const S43 = 15   
268Const S44 = 21 
269
270x = ConvertToWordArray(sMessage)   
271  
272a = &H67452301   
273b = &HEFCDAB89   
274c = &H98BADCFE   
275d = &H10325476 
276
277For k = 0 To UBound(x) Step 16   
278AA = a   
279BB = b   
280CC = c   
281DD = d   
282  
283md5_FF a, b, c, d, x(k + 0), S11, &HD76AA478   
284md5_FF d, a, b, c, x(k + 1), S12, &HE8C7B756   
285md5_FF c, d, a, b, x(k + 2), S13, &H242070DB   
286md5_FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE   
287md5_FF a, b, c, d, x(k + 4), S11, &HF57C0FAF   
288md5_FF d, a, b, c, x(k + 5), S12, &H4787C62A   
289md5_FF c, d, a, b, x(k + 6), S13, &HA8304613   
290md5_FF b, c, d, a, x(k + 7), S14, &HFD469501   
291md5_FF a, b, c, d, x(k + 8), S11, &H698098D8   
292md5_FF d, a, b, c, x(k + 9), S12, &H8B44F7AF   
293md5_FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1   
294md5_FF b, c, d, a, x(k + 11), S14, &H895CD7BE   
295md5_FF a, b, c, d, x(k + 12), S11, &H6B901122   
296md5_FF d, a, b, c, x(k + 13), S12, &HFD987193   
297md5_FF c, d, a, b, x(k + 14), S13, &HA679438E   
298md5_FF b, c, d, a, x(k + 15), S14, &H49B40821   
299  
300md5_GG a, b, c, d, x(k + 1), S21, &HF61E2562   
301md5_GG d, a, b, c, x(k + 6), S22, &HC040B340   
302md5_GG c, d, a, b, x(k + 11), S23, &H265E5A51   
303md5_GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA   
304md5_GG a, b, c, d, x(k + 5), S21, &HD62F105D   
305md5_GG d, a, b, c, x(k + 10), S22, &H2441453   
306md5_GG c, d, a, b, x(k + 15), S23, &HD8A1E681   
307md5_GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8   
308md5_GG a, b, c, d, x(k + 9), S21, &H21E1CDE6   
309md5_GG d, a, b, c, x(k + 14), S22, &HC33707D6   
310md5_GG c, d, a, b, x(k + 3), S23, &HF4D50D87   
311md5_GG b, c, d, a, x(k + 8), S24, &H455A14ED   
312md5_GG a, b, c, d, x(k + 13), S21, &HA9E3E905   
313md5_GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8   
314md5_GG c, d, a, b, x(k + 7), S23, &H676F02D9   
315md5_GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A   
316  
317md5_HH a, b, c, d, x(k + 5), S31, &HFFFA3942   
318md5_HH d, a, b, c, x(k + 8), S32, &H8771F681   
319md5_HH c, d, a, b, x(k + 11), S33, &H6D9D6122   
320md5_HH b, c, d, a, x(k + 14), S34, &HFDE5380C   
321md5_HH a, b, c, d, x(k + 1), S31, &HA4BEEA44   
322md5_HH d, a, b, c, x(k + 4), S32, &H4BDECFA9   
323md5_HH c, d, a, b, x(k + 7), S33, &HF6BB4B60   
324md5_HH b, c, d, a, x(k + 10), S34, &HBEBFBC70   
325md5_HH a, b, c, d, x(k + 13), S31, &H289B7EC6   
326md5_HH d, a, b, c, x(k + 0), S32, &HEAA127FA   
327md5_HH c, d, a, b, x(k + 3), S33, &HD4EF3085   
328md5_HH b, c, d, a, x(k + 6), S34, &H4881D05   
329md5_HH a, b, c, d, x(k + 9), S31, &HD9D4D039   
330md5_HH d, a, b, c, x(k + 12), S32, &HE6DB99E5   
331md5_HH c, d, a, b, x(k + 15), S33, &H1FA27CF8   
332md5_HH b, c, d, a, x(k + 2), S34, &HC4AC5665   
333  
334md5_II a, b, c, d, x(k + 0), S41, &HF4292244   
335md5_II d, a, b, c, x(k + 7), S42, &H432AFF97   
336md5_II c, d, a, b, x(k + 14), S43, &HAB9423A7   
337md5_II b, c, d, a, x(k + 5), S44, &HFC93A039   
338md5_II a, b, c, d, x(k + 12), S41, &H655B59C3   
339md5_II d, a, b, c, x(k + 3), S42, &H8F0CCC92   
340md5_II c, d, a, b, x(k + 10), S43, &HFFEFF47D   
341md5_II b, c, d, a, x(k + 1), S44, &H85845DD1   
342md5_II a, b, c, d, x(k + 8), S41, &H6FA87E4F   
343md5_II d, a, b, c, x(k + 15), S42, &HFE2CE6E0   
344md5_II c, d, a, b, x(k + 6), S43, &HA3014314   
345md5_II b, c, d, a, x(k + 13), S44, &H4E0811A1   
346md5_II a, b, c, d, x(k + 4), S41, &HF7537E82   
347md5_II d, a, b, c, x(k + 11), S42, &HBD3AF235   
348md5_II c, d, a, b, x(k + 2), S43, &H2AD7D2BB   
349md5_II b, c, d, a, x(k + 9), S44, &HEB86D391   
350  
351a = AddUnsigned(a, AA)   
352b = AddUnsigned(b, BB)   
353c = AddUnsigned(c, CC)   
354d = AddUnsigned(d, DD)   
355Next   
356  
357'MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))   
358MD5=LCase(WordToHex(b) & WordToHex(c)) 'I crop this to fit 16byte database password :D   
359End Function 
360
361Response.Write "123456的加密结果为[" & md5 ("123456") & "]"   
Published At
Categories with Web编程
Tagged with
comments powered by Disqus