纯代码实现md5算法

 网上已经有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
    
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() {}

字节函数

    
Private 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() 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(ByRef Data As Byte(), ByVal StartIndex As LongAs 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(ByVal lngVal1 As IntegerByVal lngVal2 As IntegerAs 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(ByVal lngVal1 As IntegerByVal lngVal2 As IntegerByVal lngVal3 As IntegerByVal lngVal4 As IntegerAs 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(ByVal Value As IntegerByVal Shift As IntegerAs 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(ByVal Value As IntegerByVal Shift As IntegerAs Integer
        
'Return (Value << Shift) Or ((Value >> (32 - Shift)) And ((2 << Shift) - 1))
    End Function


    
Private Function F(ByVal x As IntegerByVal y As IntegerByVal z As IntegerAs Integer
        
Return (x And y) Or (Not (x) And z)
    
End Function


    
Private Function G(ByVal x As IntegerByVal y As IntegerByVal z As IntegerAs Integer
        
Return (x And z) Or (y And Not (z))
    
End Function


    
Private Function H(ByVal x As IntegerByVal y As IntegerByVal z As IntegerAs Integer
        
Return x Xor y Xor z
    
End Function


    
Private Function I(ByVal x As IntegerByVal y As IntegerByVal z As IntegerAs Integer
        
Return y Xor (x Or Not (z))
    
End Function


    
Private Function FF(ByVal a As IntegerByVal b As IntegerByVal c As IntegerByVal d As IntegerByVal Mj As IntegerByVal s As IntegerByVal Ti As IntegerAs 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(ByVal a As IntegerByVal b As IntegerByVal c As IntegerByVal d As IntegerByVal Mj As IntegerByVal s As IntegerByVal Ti As IntegerAs 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(ByVal a As IntegerByVal b As IntegerByVal c As IntegerByVal d As IntegerByVal Mj As IntegerByVal s As IntegerByVal Ti As IntegerAs 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(ByVal a As IntegerByVal b As IntegerByVal c As IntegerByVal d As IntegerByVal Mj As IntegerByVal s As IntegerByVal Ti As IntegerAs 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(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(ByVal strKey As StringAs 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做成静态方法使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值