纯代码实现md5算法

来源:百度文库 编辑:神马文学网 时间:2024/04/20 17:23:24
 纯代码实现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 MD5Class 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

    ‘‘‘ -----------------------------------------------------------------------------
    ‘‘‘ 
    ‘‘‘ 循环左移位指令
    ‘‘‘ 

    ‘‘‘ 
    ‘‘‘ 
    ‘‘‘ 
    ‘‘‘ 
    ‘‘‘ 

    ‘‘‘ 
    ‘‘‘     [malingxian]    2007-1-8    Created
    ‘‘‘ 

    ‘‘‘ -----------------------------------------------------------------------------
    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

    ‘‘‘ -----------------------------------------------------------------------------
    ‘‘‘ 
    ‘‘‘ 循环右移位指令
    ‘‘‘ 

    ‘‘‘ 
    ‘‘‘ 
    ‘‘‘ 
    ‘‘‘ 
    ‘‘‘ 

    ‘‘‘ 
    ‘‘‘     [malingxian]    2007-1-8    Created
    ‘‘‘ 

    ‘‘‘ -----------------------------------------------------------------------------
    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做成静态方法使用。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1477449


[收藏到我的网摘]   木头发表于 2007年01月08日 19:13:00


特别推荐:
  • 每天50元!百万用户等你来!
    广告价格高,预算有限,产品推不出去,怎么办? Tag广告-灵活控制成本,直达目标用户!经济、实惠 .net
  • 美女走光了 只有程序员
    程序员谈论程序员的视频节目 就在CSDN视频频道 .net
  • 用友软件急聘.NET开发工程师
    用友软件一直秉持“人才为重”的理念 我们盛情邀您加入…… .net
  • .Net程序员不得不看的C#经典书籍
    22本C#经典著作 部分图书提供连载 CSDN读书频道独家奉献 .net
  • 盛大网络诚聘技术人才!
    诚聘软件精英,携手与您共创盛大新传奇 .net

#  malingxian 发表于2007-03-05 16:56:28  IP: 218.58.145.*应ROSWELL兄指出本算法在计算超过55位的MD5值时会出错,现已改正:
改正1、InitByte方法的更改:
‘‘‘ -----------------------------------------------------------------------------
‘‘‘
‘‘‘ 初始化数据
‘‘‘

‘‘‘
‘‘‘
‘‘‘ 补足数据位数为k*64+56字节
‘‘‘

‘‘‘
‘‘‘ [malingxian] 2007-3-3 Created
‘‘‘

‘‘‘ -----------------------------------------------------------------------------
Private Function InitByte(ByRef Data As Byte()) As Byte()
Dim kl As ArrayList = New ArrayList(Data)
Dim dbLength As Int64 = Data.GetLongLength(0)

Dim j As Integer = dbLength Mod 64
If j >= 56 Then
j = 120 - j
Else
j = 56 - j
If j = 0 Then j = 56
End If

kl.Add(CByte(&H80)) ‘补1
kl.AddRange(New Byte(j - 1 - 1) {}) ‘补0
kl.AddRange(Int64ToBytes(dbLength << 3)) ‘添加长度
Dim buffout As Byte() = kl.ToArray(GetType(Byte))
kl.Clear()
Return buffout
End Function
改正2、InitM的更改:
‘‘‘ -----------------------------------------------------------------------------
‘‘‘
‘‘‘ 将分组数据按64字节为一组取出来,并转化32位整数数组<>< div="">
#  malingxian 发表于2007-03-05 16:57:07  IP: 218.58.145.*‘‘‘ -----------------------------------------------------------------------------
‘‘‘
‘‘‘ 将分组数据按64字节为一组取出来,并转化32位整数数组
‘‘‘

‘‘‘
‘‘‘
‘‘‘
‘‘‘
‘‘‘

‘‘‘
‘‘‘ [malingxian] 2007-3-3 Created
‘‘‘

‘‘‘ -----------------------------------------------------------------------------
Private 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, StartIndex + (i << 2))
Next
Return M
End Function
#  malingxian 发表于2007-03-05 16:57:49  IP: 218.58.145.*改正3、主循环方法的更改:
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
Dim AAA As Integer = AA
Dim BBB As Integer = BB
Dim CCC As Integer = CC
Dim DDD As Integer = DD

‘Console.WriteLine(BitConverter.ToString(buff))
For i As Integer = 0 To buff.Length - 63 Step 64
Dim M As Integer() = InitM(buff, i)
A = AAA : B = BBB : C = CCC : D = DDD

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, &H6980
#  malingxian 发表于2007-03-05 16:58:38  IP: 218.58.145.*98D8)
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
#  malingxian 发表于2007-03-05 16:59:06  IP: 218.58.145.*(&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))
Console.WriteLine("aaa:{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, &
#  malingxian 发表于2007-03-05 16:59:39  IP: 218.58.145.*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))
Console.WriteLine("aaa:{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))

#  malingxian 发表于2007-03-05 17:00:05  IP: 218.58.145.*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))

AAA = LongAdd(A, AAA)
BBB = LongAdd(B, BBB)
CCC = LongAdd(C, CCC)
DDD = LongAdd(D, DDD)
‘Console.WriteLine("AAA:{0},{1},{2},{3}", Hex(AAA), Hex(BBB), Hex(CCC), Hex(DDD))
Next

Dim caa As New ArrayList(16)
caa.AddRange(Int32ToBytes(AAA))
caa.AddRange(Int32ToBytes(BBB))
caa.AddRange(Int32ToBytes(CCC))
caa.AddRange(Int32ToBytes(DDD))
Dim buffout As Byte() = caa.ToArray(GetType(Byte))
caa.Clear()
Return buffout
End Function