网上已经有C,C++,VB6,java的MD5算法源代码了,甚至已经有了C#的MD5算法代码,唯独VB.NET的MD5算法代码是在是少而又少,因此贴出下列代码供大家雅正。
有人说了,.NET自带MD5算法,何必多此一举呢?如下所示:
'MD5 Public Shared Function MD5(ByVal strKey As String) As String Dim sPwd As String Dim bytPwd As [Byte]() = ConStrArr(strKey) Dim hashPwd As Byte() = CType(System.Security.Cryptography.CryptoConfig.CreateFromName("MD5"), _ System.Security.Cryptography.HashAlgorithm).ComputeHash(bytPwd) sPwd = BitConverter.ToString(hashPwd) sPwd = LCase(sPwd.Replace("-", "")) '去掉中间的"-"符号并转换为小写字母 Return sPwd End Function
Public Shared Function MD5(ByVal Key As Byte()) As Byte() Return CType(System.Security.Cryptography.CryptoConfig.CreateFromName("MD5"), _ System.Security.Cryptography.HashAlgorithm).ComputeHash(Key) End Function
当初写这代码是为了将用了.NET的MD5验证的程序能够用于没有MD5算法的Windows 2000 SP4以下版本,另外也可以更好的了解MD5算法的原理和步骤。
代码如下:
Public
Class MD5
Class MD5 Private Const AA As Integer = & H67452301 Private Const BB As Integer = & HEFCDAB89 Private Const CC As Integer = & H98BADCFE Private Const DD As Integer = & H10325476 Private Const Ts As Long = & H100000000 Private Const S11 As Integer = 7 Private Const S12 As Integer = 12 Private Const S13 As Integer = 17 Private Const S14 As Integer = 22 Private Const S21 As Integer = 5 Private Const S22 As Integer = 9 Private Const S23 As Integer = 14 Private Const S24 As Integer = 20 Private Const S31 As Integer = 4 Private Const S32 As Integer = 11 Private Const S33 As Integer = 16 Private Const S34 As Integer = 23 Private Const S41 As Integer = 6 Private Const S42 As Integer = 10 Private Const S43 As Integer = 15 Private Const S44 As Integer = 21 Private Si As Integer () = New Integer () {} 字节函数 #Region " 字节函数 " Private Shared Function Int64ToBytes() Function Int64ToBytes( ByVal IntValue As Int64) As Byte () Return New Byte () {(IntValue >> 0 ) And & HFF, _ (IntValue >> 8 ) And & HFF, _ (IntValue >> 16 ) And & HFF, _ (IntValue >> 24 ) And & HFF, _ (IntValue >> 32 ) And & HFF, _ (IntValue >> 40 ) And & HFF, _ (IntValue >> 48 ) And & HFF, _ (IntValue >> 56 ) And & HFF _ } End Function Public Shared Function Int32ToBytes() Function Int32ToBytes( ByVal IntValue As Int32) As Byte () Return New Byte () {(IntValue >> 0 ) And & HFF, _ (IntValue >> 8 ) And & HFF, _ (IntValue >> 16 ) And & HFF, _ (IntValue >> 24 ) And & HFF _ } End Function Public Shared Function BytesToInt32() Function BytesToInt32( ByVal Buff As Byte (), Optional ByVal StartIndex As Integer = 0 ) As Int32 If Buff Is Nothing OrElse Buff.Length = 0 Then Return 0 If StartIndex >= Buff.Length Then Return 0 Dim cValue As Int32 = 0 ' 正常转换 For i As Integer = Math.Min(StartIndex + 3 , Buff.Length - 1 ) To StartIndex Step - 1 cValue = (cValue << 8 ) Or Buff(i) Next Return cValue End Function Public Shared Function BytesToInt64() Function BytesToInt64( ByVal Buff As Byte (), Optional ByVal StartIndex As Integer = 0 ) As Int64 If Buff Is Nothing OrElse Buff.Length = 0 Then Return 0 If StartIndex >= Buff.Length Then Return 0 Dim cValue As Int32 = 0 ' 正常转换 For i As Integer = Math.Min(StartIndex + 7 , Buff.Length - 1 ) To StartIndex Step - 1 cValue = (cValue << 8 ) Or Buff(i) Next Return cValue End Function #End Region Private Function InitByte() Function InitByte( ByRef Data As Byte ()) As Byte () Dim kl As ArrayList = New ArrayList(Data) Dim dbLength As Int64 = Data.GetLongLength( 0 ) If dbLength Mod 56 <> 0 OrElse dbLength = 0 Then Dim i As Integer = 56 - (kl.Count Mod 56 ) - 1 kl.Add(CByte ( & H80)) ' 补1 If i > 0 Then kl.AddRange(New Byte (i - 1 ) {}) ' 补0 End If End If kl.AddRange(Int64ToBytes(dbLength << 3 )) ' 添加长度 Dim buffout As Byte () = kl.ToArray( GetType ( Byte )) kl.Clear() Return buffout End Function Private Function InitT() Function InitT() As Int32() Dim T As Int32() = New Int32( 63 ) {} For i As Integer = 0 To 63 T(i) = BytesToInt32(Int64ToBytes( CLng (Ts * Math.Abs(Math.Sin(i + 1 ))) And & HFFFFFFFF & )) Next Return T End Function Private Function InitM() Function InitM( ByRef Data As Byte (), ByVal StartIndex As Long ) As Int32() Dim M As Int32() = New Int32( 15 ) {} For i As Integer = 0 To 15 M(i) = BytesToInt32(Data, i << 2 ) Next Return M End Function Private Function LongAdd() Function LongAdd( ByVal lngVal1 As Integer , ByVal lngVal2 As Integer ) As Integer Dim lngHighWord As Integer Dim lngLowWord As Integer Dim lngOverflow As Integer lngLowWord = (lngVal1 And & HFFFF & ) + (lngVal2 And & HFFFF & ) lngOverflow = lngLowWord 65536 lngHighWord = (((lngVal1 And & HFFFF0000) 65536 ) + ((lngVal2 And & HFFFF0000) 65536 ) + lngOverflow) And & HFFFF & Return lngHighWord << 16 Or (lngLowWord And & HFFFF) ' LongConversion((lngHighWord * 65536.0#) + (lngLowWord And &HFFFF&)) End Function Private Function LongAdd4() Function LongAdd4( ByVal lngVal1 As Integer , ByVal lngVal2 As Integer , ByVal lngVal3 As Integer , ByVal lngVal4 As Integer ) As Integer Dim lngHighWord As Integer Dim lngLowWord As Integer Dim lngOverflow As Integer lngLowWord = (lngVal1 And & HFFFF & ) + (lngVal2 And & HFFFF & ) + (lngVal3 And & HFFFF & ) + (lngVal4 And & HFFFF & ) lngOverflow = lngLowWord 65536 lngHighWord = (((lngVal1 And & HFFFF0000) 65536 ) + ((lngVal2 And & HFFFF0000) 65536 ) + ((lngVal3 And & HFFFF0000) 65536 ) + ((lngVal4 And & HFFFF0000) 65536 ) + lngOverflow) And & HFFFF & Return lngHighWord << 16 Or (lngLowWord And & HFFFF) ' LongConversion((lngHighWord * 65536.0#) + (lngLowWord And &HFFFF&)) End Function ' '' ----------------------------------------------------------------------------- ' '' <summary> ' '' 循环左移位指令 ' '' </summary> ' '' <param name="Value"></param> ' '' <param name="Shift"></param> ' '' <returns></returns> ' '' <remarks> ' '' </remarks> ' '' <history> ' '' [malingxian] 2007-1-8 Created ' '' </history> ' '' ----------------------------------------------------------------------------- Private Function RoundLeftShift() Function RoundLeftShift( ByVal Value As Integer , ByVal Shift As Integer ) As Integer Return (Value << Shift) Or ((Value >> ( 32 - Shift)) And (( 2 << (Shift - 1 )) - 1 )) End Function ' '' ----------------------------------------------------------------------------- ' '' <summary> ' '' 循环右移位指令 ' '' </summary> ' '' <param name="Value"></param> ' '' <param name="Shift"></param> ' '' <returns></returns> ' '' <remarks> ' '' </remarks> ' '' <history> ' '' [malingxian] 2007-1-8 Created ' '' </history> ' '' ----------------------------------------------------------------------------- Private Function RoundRightShift() Function RoundRightShift( ByVal Value As Integer , ByVal Shift As Integer ) As Integer ' Return (Value << Shift) Or ((Value >> (32 - Shift)) And ((2 << Shift) - 1)) End Function Private Function F() Function F( ByVal x As Integer , ByVal y As Integer , ByVal z As Integer ) As Integer Return (x And y) Or ( Not (x) And z) End Function Private Function G() Function G( ByVal x As Integer , ByVal y As Integer , ByVal z As Integer ) As Integer Return (x And z) Or (y And Not (z)) End Function Private Function H() Function H( ByVal x As Integer , ByVal y As Integer , ByVal z As Integer ) As Integer Return x Xor y Xor z End Function Private Function I() Function I( ByVal x As Integer , ByVal y As Integer , ByVal z As Integer ) As Integer Return y Xor (x Or Not (z)) End Function Private Function FF() Function FF( ByVal a As Integer , ByVal b As Integer , ByVal c As Integer , ByVal d As Integer , ByVal Mj As Integer , ByVal s As Integer , ByVal Ti As Integer ) As Integer Dim pa As Integer = F(b, c, d) pa = LongAdd4(a, pa, Mj, Ti) pa = RoundLeftShift(pa, s) ' 注意:此处不是循环移位,故出错 pa = LongAdd(b, pa) Return pa Return LongAdd(b, RoundLeftShift(LongAdd4(a, F(b, c, d), Mj, Ti), s)) End Function Private Function GG() Function GG( ByVal a As Integer , ByVal b As Integer , ByVal c As Integer , ByVal d As Integer , ByVal Mj As Integer , ByVal s As Integer , ByVal Ti As Integer ) As Integer ' a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s) ' Return b + ((a + G(b, c, d) + Mj + Ti) << s) Return LongAdd(b, RoundLeftShift(LongAdd4(a, G(b, c, d), Mj, Ti), s)) End Function Private Function HH() Function HH( ByVal a As Integer , ByVal b As Integer , ByVal c As Integer , ByVal d As Integer , ByVal Mj As Integer , ByVal s As Integer , ByVal Ti As Integer ) As Integer ' Return b + ((a + H(b, c, d) + Mj + Ti) << s) Return LongAdd(b, RoundLeftShift(LongAdd4(a, H(b, c, d), Mj, Ti), s)) End Function Private Function II() Function II( ByVal a As Integer , ByVal b As Integer , ByVal c As Integer , ByVal d As Integer , ByVal Mj As Integer , ByVal s As Integer , ByVal Ti As Integer ) As Integer ' Return b + ((a + (I(b, c, d) + Mj + Ti) << s)) Return LongAdd(b, RoundLeftShift(LongAdd4(a, I(b, c, d), Mj, Ti), s)) End Function Public Function MD5Conversion() Function MD5Conversion( ByVal Data As Byte ()) As Byte () Dim buff As Byte () = Me .InitByte(Data) ' Dim T As Integer() = InitT() Dim A As Integer = AA Dim B As Integer = BB Dim C As Integer = CC Dim D As Integer = DD For i As Integer = 0 To buff.Length - 63 Step 64 Dim M As Integer () = InitM(buff, i) A = FF(A, B, C, D, M( & H0), S11, & HD76AA478) D = FF(D, A, B, C, M( & H1), S12, & HE8C7B756) C = FF(C, D, A, B, M( & H2), S13, & H242070DB) B = FF(B, C, D, A, M( & H3), S14, & HC1BDCEEE) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = FF(A, B, C, D, M( & H4), S11, & HF57C0FAF) D = FF(D, A, B, C, M( & H5), S12, & H4787C62A) C = FF(C, D, A, B, M( & H6), S13, & HA8304613) B = FF(B, C, D, A, M( & H7), S14, & HFD469501) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = FF(A, B, C, D, M( & H8), S11, & H698098D8) D = FF(D, A, B, C, M( & H9), S12, & H8B44F7AF) C = FF(C, D, A, B, M( & HA), S13, & HFFFF5BB1) B = FF(B, C, D, A, M( & HB), S14, & H895CD7BE) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = FF(A, B, C, D, M( & HC), S11, & H6B901122) D = FF(D, A, B, C, M( & HD), S12, & HFD987193) C = FF(C, D, A, B, M( & HE), S13, & HA679438E) B = FF(B, C, D, A, M( & HF), S14, & H49B40821) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = GG(A, B, C, D, M( & H1), S21, & HF61E2562) D = GG(D, A, B, C, M( & H6), S22, & HC040B340) C = GG(C, D, A, B, M( & HB), S23, & H265E5A51) B = GG(B, C, D, A, M( & H0), S24, & HE9B6C7AA) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = GG(A, B, C, D, M( & H5), S21, & HD62F105D) D = GG(D, A, B, C, M( & HA), S22, & H2441453) C = GG(C, D, A, B, M( & HF), S23, & HD8A1E681) B = GG(B, C, D, A, M( & H4), S24, & HE7D3FBC8) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = GG(A, B, C, D, M( & H9), S21, & H21E1CDE6) D = GG(D, A, B, C, M( & HE), S22, & HC33707D6) C = GG(C, D, A, B, M( & H3), S23, & HF4D50D87) B = GG(B, C, D, A, M( & H8), S24, & H455A14ED) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = GG(A, B, C, D, M( & HD), S21, & HA9E3E905) D = GG(D, A, B, C, M( & H2), S22, & HFCEFA3F8) C = GG(C, D, A, B, M( & H7), S23, & H676F02D9) B = GG(B, C, D, A, M( & HC), S24, & H8D2A4C8A) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = HH(A, B, C, D, M( & H5), S31, & HFFFA3942) D = HH(D, A, B, C, M( & H8), S32, & H8771F681) C = HH(C, D, A, B, M( & HB), S33, & H6D9D6122) B = HH(B, C, D, A, M( & HE), S34, & HFDE5380C) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = HH(A, B, C, D, M( & H1), S31, & HA4BEEA44) D = HH(D, A, B, C, M( & H4), S32, & H4BDECFA9) C = HH(C, D, A, B, M( & H7), S33, & HF6BB4B60) B = HH(B, C, D, A, M( & HA), S34, & HBEBFBC70) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = HH(A, B, C, D, M( & HD), S31, & H289B7EC6) D = HH(D, A, B, C, M( & H0), S32, & HEAA127FA) C = HH(C, D, A, B, M( & H3), S33, & HD4EF3085) B = HH(B, C, D, A, M( & H6), S34, & H4881D05) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = HH(A, B, C, D, M( & H9), S31, & HD9D4D039) D = HH(D, A, B, C, M( & HC), S32, & HE6DB99E5) C = HH(C, D, A, B, M( & HF), S33, & H1FA27CF8) B = HH(B, C, D, A, M( & H2), S34, & HC4AC5665) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = II(A, B, C, D, M( & H0), S41, & HF4292244) D = II(D, A, B, C, M( & H7), S42, & H432AFF97) C = II(C, D, A, B, M( & HE), S43, & HAB9423A7) B = II(B, C, D, A, M( & H5), S44, & HFC93A039) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = II(A, B, C, D, M( & HC), S41, & H655B59C3) D = II(D, A, B, C, M( & H3), S42, & H8F0CCC92) C = II(C, D, A, B, M( & HA), S43, & HFFEFF47D) B = II(B, C, D, A, M( & H1), S44, & H85845DD1) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = II(A, B, C, D, M( & H8), S41, & H6FA87E4F) D = II(D, A, B, C, M( & HF), S42, & HFE2CE6E0) C = II(C, D, A, B, M( & H6), S43, & HA3014314) B = II(B, C, D, A, M( & HD), S44, & H4E0811A1) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = II(A, B, C, D, M( & H4), S41, & HF7537E82) D = II(D, A, B, C, M( & HB), S42, & HBD3AF235) C = II(C, D, A, B, M( & H2), S43, & H2AD7D2BB) B = II(B, C, D, A, M( & H9), S44, & HEB86D391) ' Console.WriteLine("{0},{1},{2},{3}", Hex(A), Hex(B), Hex(C), Hex(D)) A = LongAdd(A, AA) B = LongAdd(B, BB) C = LongAdd(C, CC) D = LongAdd(D, DD) Next Dim caa As New ArrayList( 16 ) caa.AddRange(Int32ToBytes(A)) caa.AddRange(Int32ToBytes(B)) caa.AddRange(Int32ToBytes(C)) caa.AddRange(Int32ToBytes(D)) Dim buffout As Byte () = caa.ToArray( GetType ( Byte )) caa.Clear() Return buffout End Function Public Function MD5Conversion() Function MD5Conversion( ByVal strKey As String ) As String Dim sPwd As String Dim bytPwd As [ Byte ]() = System.Text.Encoding.Default.GetBytes(strKey) Dim hashPwd As Byte () = MD5Conversion(bytPwd) sPwd = BitConverter.ToString(hashPwd) sPwd = LCase (sPwd.Replace( " - " , "" )) ' 去掉中间的"-"符号并转换为小写字母 Return sPwd End Function End Class
用法:
dim cc as new MD5
dim strOut as string=cc.MD5Conversion(待校验字符串)
dim byteOut as byte()=cc.MD5Conversion(字节数组)
另外可以将该MD5类的MD5Conversion做成静态方法使用。