VB实现的16位和32位md5加密代码分享
在各种登陆系统中,用户密码的md5加密是不可少的。
这么说吧,即使你通过各种手段看到了用户的登陆密码,但那一串古古怪怪的东西你也不可能知道它是什么,这就是保护。
md5加密运算是不可逆的,就是说你不能通过那一串古古怪怪的东西算出它原始的样子。
下面是完整的md5代码,不要去理解算法了,用到时拿去直接调用。
PrivateConstBITS_TO_A_BYTE=8 PrivateConstBYTES_TO_A_WORD=4 PrivateConstBITS_TO_A_WORD=32 Privatem_lOnBits(30) Privatem_l2Power(30) PrivateFunctionLShift(lValue,iShiftBits) IfiShiftBits=0Then LShift=lValue ExitFunction ElseIfiShiftBits=31Then IflValueAnd1Then LShift=&H80000000 Else LShift=0 EndIf ExitFunction ElseIfiShiftBits<0OriShiftBits>31Then Err.Raise6 EndIf If(lValueAndm_l2Power(31-iShiftBits))Then LShift=((lValueAndm_lOnBits(31-(iShiftBits+1)))*m_l2Power(iShiftBits))Or&H80000000 Else LShift=((lValueAndm_lOnBits(31-iShiftBits))*m_l2Power(iShiftBits)) EndIf EndFunction PrivateFunctionRShift(lValue,iShiftBits) IfiShiftBits=0Then RShift=lValue ExitFunction ElseIfiShiftBits=31Then IflValueAnd&H80000000Then RShift=1 Else RShift=0 EndIf ExitFunction ElseIfiShiftBits<0OriShiftBits>31Then Err.Raise6 EndIf RShift=(lValueAnd&H7FFFFFFE)\m_l2Power(iShiftBits) If(lValueAnd&H80000000)Then RShift=(RShiftOr(&H40000000\m_l2Power(iShiftBits-1))) EndIf EndFunction PrivateFunctionRotateLeft(lValue,iShiftBits) RotateLeft=LShift(lValue,iShiftBits)OrRShift(lValue,(32-iShiftBits)) EndFunction PrivateFunctionAddUnsigned(lX,lY) DimlX4 DimlY4 DimlX8 DimlY8 DimlResult lX8=lXAnd&H80000000 lY8=lYAnd&H80000000 lX4=lXAnd&H40000000 lY4=lYAnd&H40000000 lResult=(lXAnd&H3FFFFFFF)+(lYAnd&H3FFFFFFF) IflX4AndlY4Then lResult=lResultXor&H80000000XorlX8XorlY8 ElseIflX4OrlY4Then IflResultAnd&H40000000Then lResult=lResultXor&HC0000000XorlX8XorlY8 Else lResult=lResultXor&H40000000XorlX8XorlY8 EndIf Else lResult=lResultXorlX8XorlY8 EndIf AddUnsigned=lResult EndFunction PrivateFunctionmd5_F(x,y,z) md5_F=(xAndy)Or((Notx)Andz) EndFunction PrivateFunctionmd5_G(x,y,z) md5_G=(xAndz)Or(yAnd(Notz)) EndFunction PrivateFunctionmd5_H(x,y,z) md5_H=(xXoryXorz) EndFunction PrivateFunctionmd5_I(x,y,z) md5_I=(yXor(xOr(Notz))) EndFunction PrivateSubmd5_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) EndSub PrivateSubmd5_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) EndSub PrivateSubmd5_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) EndSub PrivateSubmd5_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) EndSub PrivateFunctionConvertToWordArray(sMessage) DimlMessageLength DimlNumberOfWords DimlWordArray() DimlBytePosition DimlByteCount DimlWordCount ConstMODULUS_BITS=512 ConstCONGRUENT_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) ReDimlWordArray(lNumberOfWords-1) lBytePosition=0 lByteCount=0 DoUntillByteCount>=lMessageLength lWordCount=lByteCount\BYTES_TO_A_WORD lBytePosition=(lByteCountModBYTES_TO_A_WORD)*BITS_TO_A_BYTE lWordArray(lWordCount)=lWordArray(lWordCount)OrLShift(Asc(Mid(sMessage,lByteCount+1,1)),lBytePosition) lByteCount=lByteCount+1 Loop lWordCount=lByteCount\BYTES_TO_A_WORD lBytePosition=(lByteCountModBYTES_TO_A_WORD)*BITS_TO_A_BYTE lWordArray(lWordCount)=lWordArray(lWordCount)OrLShift(&H80,lBytePosition) lWordArray(lNumberOfWords-2)=LShift(lMessageLength,3) lWordArray(lNumberOfWords-1)=RShift(lMessageLength,29) ConvertToWordArray=lWordArray EndFunction PrivateFunctionWordToHex(lValue) DimlByte DimlCount ForlCount=0To3 lByte=RShift(lValue,lCount*BITS_TO_A_BYTE)Andm_lOnBits(BITS_TO_A_BYTE-1) WordToHex=WordToHex&Right("0"&Hex(lByte),2) Next EndFunction PublicFunctionMD5(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) Dimx Dimk DimAA DimBB DimCC DimDD Dima Dimb Dimc Dimd ConstS11=7 ConstS12=12 ConstS13=17 ConstS14=22 ConstS21=5 ConstS22=9 ConstS23=14 ConstS24=20 ConstS31=4 ConstS32=11 ConstS33=16 ConstS34=23 ConstS41=6 ConstS42=10 ConstS43=15 ConstS44=21 x=ConvertToWordArray(sMessage) a=&H67452301 b=&HEFCDAB89 c=&H98BADCFE d=&H10325476 Fork=0ToUBound(x)Step16 AA=a BB=b CC=c DD=d md5_FFa,b,c,d,x(k+0),S11,&HD76AA478 md5_FFd,a,b,c,x(k+1),S12,&HE8C7B756 md5_FFc,d,a,b,x(k+2),S13,&H242070DB md5_FFb,c,d,a,x(k+3),S14,&HC1BDCEEE md5_FFa,b,c,d,x(k+4),S11,&HF57C0FAF md5_FFd,a,b,c,x(k+5),S12,&H4787C62A md5_FFc,d,a,b,x(k+6),S13,&HA8304613 md5_FFb,c,d,a,x(k+7),S14,&HFD469501 md5_FFa,b,c,d,x(k+8),S11,&H698098D8 md5_FFd,a,b,c,x(k+9),S12,&H8B44F7AF md5_FFc,d,a,b,x(k+10),S13,&HFFFF5BB1 md5_FFb,c,d,a,x(k+11),S14,&H895CD7BE md5_FFa,b,c,d,x(k+12),S11,&H6B901122 md5_FFd,a,b,c,x(k+13),S12,&HFD987193 md5_FFc,d,a,b,x(k+14),S13,&HA679438E md5_FFb,c,d,a,x(k+15),S14,&H49B40821 md5_GGa,b,c,d,x(k+1),S21,&HF61E2562 md5_GGd,a,b,c,x(k+6),S22,&HC040B340 md5_GGc,d,a,b,x(k+11),S23,&H265E5A51 md5_GGb,c,d,a,x(k+0),S24,&HE9B6C7AA md5_GGa,b,c,d,x(k+5),S21,&HD62F105D md5_GGd,a,b,c,x(k+10),S22,&H2441453 md5_GGc,d,a,b,x(k+15),S23,&HD8A1E681 md5_GGb,c,d,a,x(k+4),S24,&HE7D3FBC8 md5_GGa,b,c,d,x(k+9),S21,&H21E1CDE6 md5_GGd,a,b,c,x(k+14),S22,&HC33707D6 md5_GGc,d,a,b,x(k+3),S23,&HF4D50D87 md5_GGb,c,d,a,x(k+8),S24,&H455A14ED md5_GGa,b,c,d,x(k+13),S21,&HA9E3E905 md5_GGd,a,b,c,x(k+2),S22,&HFCEFA3F8 md5_GGc,d,a,b,x(k+7),S23,&H676F02D9 md5_GGb,c,d,a,x(k+12),S24,&H8D2A4C8A md5_HHa,b,c,d,x(k+5),S31,&HFFFA3942 md5_HHd,a,b,c,x(k+8),S32,&H8771F681 md5_HHc,d,a,b,x(k+11),S33,&H6D9D6122 md5_HHb,c,d,a,x(k+14),S34,&HFDE5380C md5_HHa,b,c,d,x(k+1),S31,&HA4BEEA44 md5_HHd,a,b,c,x(k+4),S32,&H4BDECFA9 md5_HHc,d,a,b,x(k+7),S33,&HF6BB4B60 md5_HHb,c,d,a,x(k+10),S34,&HBEBFBC70 md5_HHa,b,c,d,x(k+13),S31,&H289B7EC6 md5_HHd,a,b,c,x(k+0),S32,&HEAA127FA md5_HHc,d,a,b,x(k+3),S33,&HD4EF3085 md5_HHb,c,d,a,x(k+6),S34,&H4881D05 md5_HHa,b,c,d,x(k+9),S31,&HD9D4D039 md5_HHd,a,b,c,x(k+12),S32,&HE6DB99E5 md5_HHc,d,a,b,x(k+15),S33,&H1FA27CF8 md5_HHb,c,d,a,x(k+2),S34,&HC4AC5665 md5_IIa,b,c,d,x(k+0),S41,&HF4292244 md5_IId,a,b,c,x(k+7),S42,&H432AFF97 md5_IIc,d,a,b,x(k+14),S43,&HAB9423A7 md5_IIb,c,d,a,x(k+5),S44,&HFC93A039 md5_IIa,b,c,d,x(k+12),S41,&H655B59C3 md5_IId,a,b,c,x(k+3),S42,&H8F0CCC92 md5_IIc,d,a,b,x(k+10),S43,&HFFEFF47D md5_IIb,c,d,a,x(k+1),S44,&H85845DD1 md5_IIa,b,c,d,x(k+8),S41,&H6FA87E4F md5_IId,a,b,c,x(k+15),S42,&HFE2CE6E0 md5_IIc,d,a,b,x(k+6),S43,&HA3014314 md5_IIb,c,d,a,x(k+13),S44,&H4E0811A1 md5_IIa,b,c,d,x(k+4),S41,&HF7537E82 md5_IId,a,b,c,x(k+11),S42,&HBD3AF235 md5_IIc,d,a,b,x(k+2),S43,&H2AD7D2BB md5_IIb,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 Ifstype=32Then MD5=LCase(WordToHex(a)&WordToHex(b)&WordToHex(c)&WordToHex(d)) Else MD5=LCase(WordToHex(b)&WordToHex(c)) EndIf EndFunction Subtest() MsgBoxMD5("a",16)'16位加密 MsgBoxMD5("a",32)'32位加密 EndSub