<%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'only::":butseeis}::another::}did:":
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'more^intohis"some:these:are:":after;same"manycome
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)'asmany:*mostbein::gether'himmytheymake&asbe
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'anothercome::'take::.areboth{such::it="or
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,stype):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'_|ithave'can::couldmost:beforethenat:'our'being
if stype=32 then
MD5=LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
else:MD5=LCase(WordToHex(b) & WordToHex(c)) 
end if:End Function:Function MD6(str1,str2):Md6=md5(md5(str1,16) & md5(str2,16),16):End Function
%>
