当前位置:编程学习 > VB >>

MD5搞笑问题!虾米=什么!!!!看来做唯一性验证已经不行了。

md5("这是虾米回事啊")=6e807f8b1ec02fabe64fbbe4891ef252
md5("这是什么回事啊")=6e807f8b1ec02fabe64fbbe4891ef252
由上可证:虾米=什么
类似的很多都是相同的值,真是汗流浃背-_-!!! 您这也叫MD5么? 您确定您的MD5函数没有问题?
引用 1 楼 yiguangqiang88 的回复:
您这也叫MD5么?

+1 我也搜藏了一个md5函数模块,算出来的跟楼主一样啊,晕的。
引用 4 楼 sysdzw 的回复:
我也搜藏了一个md5函数模块,算出来的跟楼主一样啊,晕的。
果断推倒,弃之 貌似这个函数流传很广啊。
Option Explicit

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)

Public Function MD5(sMessage$) As String
    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
    
    MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
    'MD5=LCase(WordToHex(b) & WordToHex(c)) 'I crop this to fit 16byte database password :D
End Function
引用 6 楼 sysdzw 的回复:
貌似这个函数流传很广啊。
VB code
Option Explicit

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)

Public Funct……
续集:

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
    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
            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)
    
    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
        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
看那注释,貌似还是老外整的啊 对你的算法表示怀疑, 这是我算出来的.

这是虾米回事啊 = e74239943022c2517910a0ec5feb2cad

这是什么回事啊 = c4ac6c4de71977c801b719beed138fe5 04dbc250fafcd6d062f7158a4c099da7

aca483d35d9f95b2676f3cf70cec137e

你的MD5模块有大问题哦 我用的这个

Option Explicit
Private Const OFFSET_4 = 4294967296#
Private Const MAXINT_4 = 2147483647

Private Const S11 = 7
Private Const S12 = 12
Private Const S13 = 17
Private Const S14 = 22
Private Const S21 = 5
Private Const S22 = 9
Private Const S23 = 14
Private Const S24 = 20
Private Const S31 = 4
Private Const S32 = 11
Private Const S33 = 16
Private Const S34 = 23
Private Const S41 = 6
Private Const S42 = 10
Private Const S43 = 15
Private Const S44 = 21


'=
'= Class Variables
'=
Private State(4) As Long
Private ByteCounter As Long
Private ByteBuffer(63) As Byte


'=
'= Class Properties
'=
Property Get RegisterA() As String
    RegisterA = State(1)
End Property

Property Get RegisterB() As String
    RegisterB = State(2)
End Property

Property Get RegisterC() As String
    RegisterC = State(3)
End Property

Property Get RegisterD() As String
    RegisterD = State(4)
End Property


'=
'= Class Functions
'=

'
' Function to quickly digest a file into a hex string
'
Public Function DigestFileToHexStr(FileName As String) As String
    Open FileName For Binary Access Read As #1
    MD5Init
    Do While Not EOF(1)
        Get #1, , ByteBuffer
        If Loc(1) < LOF(1) Then
            ByteCounter = ByteCounter + 64
            MD5Transform ByteBuffer
        End If
    Loop
    ByteCounter = ByteCounter + (LOF(1) Mod 64)
    Close #1
    MD5Final
    DigestFileToHexStr = GetValues
End Function

'
' Function to digest a text string and output the result as a string
' of hexadecimal characters.
'
Public Function DigestStrToHexStr(SourceString As String) As String
    MD5Init
    MD5Update Len(SourceString), StringToArray(SourceString)
    MD5Final
    DigestStrToHexStr = GetValues
End Function

'
' A utility function which converts a string into an array of
' bytes.
'
Private Function StringToArray(InString As String) As Byte()
    Dim i As Integer
    Dim bytBuffer() As Byte
    ReDim bytBuffer(Len(InString))
    For i = 0 To Len(InString) - 1
        bytBuffer(i) = Asc(Mid(InString, i + 1, 1))
    Next i
    StringToArray = bytBuffer
End Function

'
' Concatenate the four state vaules into one string
'
Public Function GetValues() As String
    GetValues = LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4))
End Function

'
' Convert a Long to a Hex string
'
Private Function LongToString(Num As Long) As String
        Dim a As Byte
        Dim b As Byte
        Dim c As Byte
        Dim d As Byte
        
        a = Num And &HFF&
        If a < 16 Then
            LongToString = "0" & Hex(a)
        Else
            LongToString = Hex(a)
        End If
               
        b = (Num And &HFF00&) \ 256
        If b < 16 Then
            LongToString = LongToString & "0" & Hex(b)
        Else
            LongToString = LongToString & Hex(b)
        End If
        
        c = (Num And &HFF0000) \ 65536
        If c < 16 Then
            LongToString = LongToString & "0" & Hex(c)
        Else
            LongToString = LongToString & Hex(c)
        End If
       
        If Num < 0 Then
            d = ((Num And &H7F000000) \ 16777216) Or &H80&
        Else
            d = (Num And &HFF000000) \ 16777216
        End If
        
        If d < 16 Then
            LongToString = LongToString & "0" & Hex(d)
        Else
            LongToString = LongToString & Hex(d)
        End If
    
End Function

'
' Initialize the class
'   This must be called before a digest calculation is started
'
Public Sub MD5Init()
    ByteCounter = 0
    State(1) = UnsignedToLong(1521202315#)
    State(2) = UnsignedToLong(3955441410#)
    State(3) = UnsignedToLong(2403335523#)
    State(4) = UnsignedToLong(158972221#)
End Sub

'
' MD5 Final
'
Public Sub MD5Final()
    Dim dblBits As Double
    
    Dim padding(72) As Byte
    Dim lngBytesBuffered As Long
    
    padding(0) = &H80
    
    dblBits = ByteCounter * 8
    
    ' Pad out
    lngBytesBuffered = ByteCounter Mod 64
    If lngBytesBuffered <= 56 Then
        MD5Update 56 - lngBytesBuffered, padding
    Else
        MD5Update 120 - ByteCounter, padding
    End If
    
    
    padding(0) = UnsignedToLong(dblBits) And &HFF&
    padding(1) = UnsignedToLong(dblBits) \ 256 And &HFF&
    padding(2) = UnsignedToLong(dblBits) \ 65536 And &HFF&
    padding(3) = UnsignedToLong(dblBits) \ 16777216 And &HFF&
    padding(4) = 0
    padding(5) = 0
    padding(6) = 0
    padding(7) = 0
    
    MD5Update 8, padding
End Sub

续上


'
' Break up input stream into 64 byte chunks
'
Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte)
    Dim II As Integer
    Dim i As Integer
    Dim j As Integer
    Dim K As Integer
    Dim lngBufferedBytes As Long
    Dim lngBufferRemaining As Long
    Dim lngRem As Long
    
    lngBufferedBytes = ByteCounter Mod 64
    lngBufferRemaining = 64 - lngBufferedBytes
    ByteCounter = ByteCounter + InputLen
    ' Use up old buffer results first
    If InputLen >= lngBufferRemaining Then
        For II = 0 To lngBufferRemaining - 1
            ByteBuffer(lngBufferedBytes + II) = InputBuffer(II)
        Next II
        MD5Transform ByteBuffer
        
        lngRem = (InputLen) Mod 64
        ' The transfer is a multiple of 64 lets do some transformations
        For i = lngBufferRemaining To InputLen - II - lngRem Step 64
            For j = 0 To 63
                ByteBuffer(j) = InputBuffer(i + j)
            Next j
            MD5Transform ByteBuffer
        Next i
        lngBufferedBytes = 0
    Else
      i = 0
    End If
    
    ' Buffer any remaining input
    For K = 0 To InputLen - i - 1
        ByteBuffer(lngBufferedBytes + K) = InputBuffer(i + K)
    Next K
    
End Sub

'
' MD5 Transform
'
Private Sub MD5Transform(Buffer() As Byte)
    Dim X(16) As Long
    Dim a As Long
    Dim b As Long
    Dim c As Long
    Dim d As Long
    
    a = State(1)
    b = State(2)
    c = State(3)
    d = State(4)
    
    Decode 64, X, Buffer

    ' Round 1
    FF a, b, c, d, X(0), S11, -680876936
    FF d, a, b, c, X(1), S12, -389564586
    FF c, d, a, b, X(2), S13, 606105819
    FF b, c, d, a, X(3), S14, -1044525330
    FF a, b, c, d, X(4), S11, -176418897
    FF d, a, b, c, X(5), S12, 1200080426
    FF c, d, a, b, X(6), S13, -1473231341
    FF b, c, d, a, X(7), S14, -45705983
    FF a, b, c, d, X(8), S11, 1770035416
    FF d, a, b, c, X(9), S12, -1958414417
    FF c, d, a, b, X(10), S13, -42063
    FF b, c, d, a, X(11), S14, -1990404162
    FF a, b, c, d, X(12), S11, 1804603682
    FF d, a, b, c, X(13), S12, -40341101
    FF c, d, a, b, X(14), S13, -1502002290
    FF b, c, d, a, X(15), S14, 1236535329
    
    ' Round 2
    GG a, b, c, d, X(1), S21, -165796510
    GG d, a, b, c, X(6), S22, -1069501632
    GG c, d, a, b, X(11), S23, 643717713
    GG b, c, d, a, X(0), S24, -373897302
    GG a, b, c, d, X(5), S21, -701558691
    GG d, a, b, c, X(10), S22, 38016083
    GG c, d, a, b, X(15), S23, -660478335
    GG b, c, d, a, X(4), S24, -405537848
    GG a, b, c, d, X(9), S21, 568446438
    GG d, a, b, c, X(14), S22, -1019803690
    GG c, d, a, b, X(3), S23, -187363961
    GG b, c, d, a, X(8), S24, 1163531501
    GG a, b, c, d, X(13), S21, -1444681467
    GG d, a, b, c, X(2), S22, -51403784
    GG c, d, a, b, X(7), S23, 1735328473
    GG b, c, d, a, X(12), S24, -1926607734
    
    ' Round 3
    HH a, b, c, d, X(5), S31, -378558
    HH d, a, b, c, X(8), S32, -2022574463
    HH c, d, a, b, X(11), S33, 1839030562
    HH b, c, d, a, X(14), S34, -35309556
    HH a, b, c, d, X(1), S31, -1530992060
    HH d, a, b, c, X(4), S32, 1272893353
    HH c, d, a, b, X(7), S33, -155497632
    HH b, c, d, a, X(10), S34, -1094730640
    HH a, b, c, d, X(13), S31, 681279174
    HH d, a, b, c, X(0), S32, -358537222
    HH c, d, a, b, X(3), S33, -722521979
    HH b, c, d, a, X(6), S34, 76029189
    HH a, b, c, d, X(9), S31, -640364487
    HH d, a, b, c, X(12), S32, -421815835
    HH c, d, a, b, X(15), S33, 530742520
    HH b, c, d, a, X(2), S34, -995338651
    
    ' Round 4
    II a, b, c, d, X(0), S41, -198630844
    II d, a, b, c, X(7), S42, 1126891415
    II c, d, a, b, X(14), S43, -1416354905
    II b, c, d, a, X(5), S44, -57434055
    II a, b, c, d, X(12), S41, 1700485571
    II d, a, b, c, X(3), S42, -1894986606
    II c, d, a, b, X(10), S43, -1051523
    II b, c, d, a, X(1), S44, -2054922799
    II a, b, c, d, X(8), S41, 1873313359
    II d, a, b, c, X(15), S42, -30611744
    II c, d, a, b, X(6), S43, -1560198380
    II b, c, d, a, X(13), S44, 1309151649
    II a, b, c, d, X(4), S41, -145523070
    II d, a, b, c, X(11), S42, -1120210379
    II c, d, a, b, X(2), S43, 718787259
    II b, c, d, a, X(9), S44, -343485551
    
    
    State(1) = LongOverflowAdd(State(1), a)
    State(2) = LongOverflowAdd(State(2), b)
    State(3) = LongOverflowAdd(State(3), c)
    State(4) = LongOverflowAdd(State(4), d)

'  /* Zeroize sensitive information.
'*/
'  MD5_memset ((POINTER)x, 0, sizeof (x));
    
End Sub

Private Sub Decode(Length As Integer, OutputBuffer() As Long, InputBuffer() As Byte)
    Dim intDblIndex As Integer
    Dim intByteIndex As Integer
    Dim dblSum As Double
    
    intDblIndex = 0
    For intByteIndex = 0 To Length - 1 Step 4
        dblSum = InputBuffer(intByteIndex) + _
                                    InputBuffer(intByteIndex + 1) * 256# + _
                                    InputBuffer(intByteIndex + 2) * 65536# + _
                                    InputBuffer(intByteIndex + 3) * 16777216#
        OutputBuffer(intDblIndex) = UnsignedToLong(dblSum)
        intDblIndex = intDblIndex + 1
    Next intByteIndex
End Sub

'
' FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
' Rotation is separate from addition to prevent recomputation.
'
Private Function FF(a As Long, _
                    b As Long, _
                    c As Long, _
                    d As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    a = LongOverflowAdd4(a, (b And c) Or (Not (b) And d), X, ac)
    a = LongLeftRotate(a, s)
    a = LongOverflowAdd(a, b)
End Function

Private Function GG(a As Long, _
                    b As Long, _
                    c As Long, _
                    d As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    a = LongOverflowAdd4(a, (b And d) Or (c And Not (d)), X, ac)
    a = LongLeftRotate(a, s)
    a = LongOverflowAdd(a, b)
End Function

Private Function HH(a As Long, _
                    b As Long, _
                    c As Long, _
                    d As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    a = LongOverflowAdd4(a, b Xor c Xor d, X, ac)
    a = LongLeftRotate(a, s)
    a = LongOverflowAdd(a, b)
End Function

Private Function II(a As Long, _
                    b As Long, _
                    c As Long, _
                    d As Long, _
                    X As Long, _
                    s As Long, _
                    ac As Long) As Long
    a = LongOverflowAdd4(a, c Xor (b Or Not (d)), X, ac)
    a = LongLeftRotate(a, s)
    a = LongOverflowAdd(a, b)
End Function

'
' Rotate a long to the right
'
Function LongLeftRotate(value As Long, bits As Long) As Long
    Dim lngSign As Long
    Dim lngI As Long
    bits = bits Mod 32
    If bits = 0 Then LongLeftRotate = value: Exit Function
    For lngI = 1 To bits
        lngSign = value And &HC0000000
        value = (value And &H3FFFFFFF) * 2
        value = value Or ((lngSign < 0) And 1) Or (CBool(lngSign And _
                &H40000000) And &H80000000)
    Next
    LongLeftRotate = value
End Function

'
' Function to add two unsigned numbers together as in C.
' Overflows are ignored!
'
Private Function LongOverflowAdd(Val1 As Long, Val2 As Long) As Long
    Dim lngHighWord As Long
    Dim lngLowWord As Long
    Dim lngOverflow As Long

    lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&)
    lngOverflow = lngLowWord \ 65536
    lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + ((Val2 And &HFFFF0000) \ 65536) + lngOverflow) And &HFFFF&
    LongOverflowAdd = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
End Function

'
' Function to add two unsigned numbers together as in C.
' Overflows are ignored!
'
Private Function LongOverflowAdd4(Val1 As Long, Val2 As Long, val3 As Long, val4 As Long) As Long
    Dim lngHighWord As Long
    Dim lngLowWord As Long
    Dim lngOverflow As Long

    lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&) + (val3 And &HFFFF&) + (val4 And &HFFFF&)
    lngOverflow = lngLowWord \ 65536
    lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + _
                   ((Val2 And &HFFFF0000) \ 65536) + _
                   ((val3 And &HFFFF0000) \ 65536) + _
                   ((val4 And &HFFFF0000) \ 65536) + _
                   lngOverflow) And &HFFFF&
    LongOverflowAdd4 = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
End Function

'
' Convert an unsigned double into a long
'
Private Function UnsignedToLong(value As Double) As Long
        If value < 0 Or value >= OFFSET_4 Then Error 6 ' Overflow
        If value <= MAXINT_4 Then
          UnsignedToLong = value
        Else
          UnsignedToLong = value - OFFSET_4
        End If
      End Function

'
' Convert a long to an unsigned Double
'
Private Function LongToUnsigned(value As Long) As Double
        If value < 0 Then
          LongToUnsigned = value + OFFSET_4
        Else
          LongToUnsigned = value
        End If
End Function

'*******************************************************
'获取系统目录
'正常应显示:C:\WINDOWS
'先 "工程" - "引用" - "Microsoft Scripting Runtime"
Private Sub Command1_Click()
Dim ABC
Set ABC = New FileSystemObject
MsgBox ABC.GetSpecialFolder(0)
End Sub


修改

State(1) = UnsignedToLong(1521202315#)
    State(2) = UnsignedToLong(3955441410#)
    State(3) = UnsignedToLong(2403335523#)
    State(4) = UnsignedToLong(158972221#)

可以得到不同的结果 朕用一破解dll实现~
04DBC250FAFCD6D062F7158A4C099DA7
ACA483D35D9F95B2676F3CF70CEC137E
调戏我吗 04DBC250FAFCD6D062F7158A4C099DA7
ACA483D35D9F95B2676F3CF70CEC137E

用这个模块计算的:

[下载][分享]一个MD5类,可以实现文件的MD5值计算(VB6.0代码)  本来就有碰撞这回事啊,散列算法本来就会有这样的问题的,只不过很少的。 MD5里是有不同值相同加密结果的,只是,看到加密结果,你并不能知道原值是什么,除非用暴力破解. COPY别人的代码前还是得谨慎测试啊 现在网上有很多版本的MD5函数 且不提楼主的MD5算法是不是出错了
关键问题是MD5是用来防篡改的,并不适用于唯一性验证。
你中文编码不一样,结果也不一样啊。 MD5不是用来加密的,只能用作数据指纹算法,验证数据是否被修改过。 这是虾米回事啊(md5):
44415e6e10a6d5355c5d95d583badcb1
这是什么回事啊(md5):
31d6bce518f467cc048bb0a59c7f8322 LZ的MD5肯定是算法出现了问题导致的哇 算法问题,或者编码问题 楼主简直就是骗子~~~
下面是PHP版本的输入
md5("这是虾米回事啊")
8d90f600f73bd2db701e885695960f84
md5("这是什么回事啊")
8a8344f1429aa0cd538bb69a5b10106a   MD5要连这点事都搞不定,还叫MD5吗?
  
 我把两个字串输入MD5函数得到的结果是完全不同的:

 这是虾米回事啊 -> D5C866ECC84AE442F9C4940EA270C31C

 这是什么回事啊 -> 22CCB44B137AF6774D0D88E36CCAFF5D 

  
引用 23 楼 windyou 的回复:
MD5不是用来加密的,只能用作数据指纹算法,验证数据是否被修改过。


如果修改后结果仍然是一样的,怎么来验证是否修改过呢。
LZ的md5明显有问题撒~ 惊出一身冷汗,读到后面发现上虚惊一场。我的程序中,N多的MD5校验呀。 MD5的运算结果是128bit,即全世界所有数据MD5之后,只有2^128种可能性,大约是3.4e+38(如果我记得没错,应该是后面有38个0)个。这个数值和IPV6的IP量的总数是一样的。
换个说法,就是把现在全世界的所有IP(v4)都拿来MD5一次,也不太可能碰撞。
当然,上面说的都是理论值。
不过,按照MD5的算法,在相邻的数值(按BYTE算)之间出现碰撞的可能性不大。所以,对楼主的算法的准确性表示怀疑。
此外,所有的密码学算法都是基于二进制的,也就是说,不论英文还是中文还是其它文字,不同的编码得到的byte是不一样的,MD5的结果也不尽相同。 求MD5算法C++版... 经亲自验证,楼主的代码肯定有问题!!!!(明知这是不可能的,我还逼自己验证一下,感觉真2) md5函数也不可靠 这个算法的实现上有问题。MD5在密码学中单向散列函数算法的一种,用于数据的防篡改。由于MD5算法本身存在缺陷,存在可以逆向的可能性,现在已经不推荐使用了,现在用得比较多的是SHA1。
数据的加解密可以用对称和非对称算法来实现比如3DES,AES,RSA,ECC等算法。
开源的OpenSSL,BouncyCastle,CryptoLib有正确的实现源代码,有兴趣的TX可以下载来学习。 同一个字符串的MD5我看到了最少四种答案 看到这个帖子很开心。大家真认真。
MD5现在已经被我们中国人破解了,好像是个女的,山东的 md5只能单向加密,并不能往回解
所以两个字符串加密出来的密文一样,也没什么好奇怪的 不管对错,顶个。 MD5 ("这是虾米回事啊") = 04dbc250fafcd6d062f7158a4c099da7
MD5 ("这是什么回事啊") = aca483d35d9f95b2676f3cf70cec137e 这么多不同的答案??? 这下可热闹了,一人一个版本!!!
引用 40 楼 zhao4zhong1 的回复:
MD5 ("这是虾米回事啊") = 04dbc250fafcd6d062f7158a4c099da7
MD5 ("这是什么回事啊") = aca483d35d9f95b2676f3cf70cec137e


正解 http://www.cmd5.com/
自己验证一下。 MD5String('这是虾米回事啊') =
   04dbc250fafcd6d062f7158a4c099da7
uMD5 = 
   04dbc250fafcd6d062f7158a4c099da7

MD5String('这是什么回事啊') =
   aca483d35d9f95b2676f3cf70cec137e
uMD5 = 
   aca483d35d9f95b2676f3cf70cec137e
Option Explicit

Private Const OFFSET_4 = 4294967296#
Private Const MAXINT_4 = 2147483647
Private State(4) As Long
Private ByteCounter As Long
Private ByteBuffer(63) As Byte
Private Const S11 = 7
Private Const S12 = 12
Private Const S13 = 17
Private Const S14 = 22
Private Const S21 = 5
Private Const S22 = 9
Private Const S23 = 14
Private Const S24 = 20
Private Const S31 = 4
Private Const S32 = 11
Private Const S33 = 16
Private Const S34 = 23
Private Const S41 = 6
Private Const S42 = 10
Private Const S43 = 15
Private Const S44 = 21
Property Get RegisterA() As String
    RegisterA = State(1)
End Property
Property Get RegisterB() As String
    RegisterB = State(2)
End Property

Property Get RegisterC() As String
    RegisterC = State(3)
End Property

Property Get RegisterD() As String
    RegisterD = State(4)
End Property
Public Function Md5_String_Calc(SourceString As String) As String
    MD5Init
    MD5Update LenB(StrConv(SourceString, vbFromUnicode)), StringToArray(SourceString)
    MD5Final
    Md5_String_Calc = GetValues
End Function
Public Function Md5_File_Calc(InFile As String) As String
On Error GoTo errorhandler
GoSub begin

errorhandler:
    Md5_File_Calc = ""
    Exit Function
    
begin:
    Dim FileO As Integer
    FileO = FreeFile
    Call FileLen(InFile)
    Open InFile For Binary Access Read As #FileO
    MD5Init
    Do While Not EOF(FileO)
        Get #FileO, , ByteBuffer
        If Loc(FileO) < LOF(FileO) Then
            ByteCounter = ByteCounter + 64
            MD5Transform ByteBuffer
        End If
    Loop
    ByteCounter = ByteCounter + (LOF(FileO) Mod 64)
    Close #FileO
    MD5Final
    Md5_File_Calc = GetValues
End Function
Private Function StringToArray(InString As String) As Byte()
    Dim I As Integer, bytBuffer() As Byte
    ReDim bytBuffer(LenB(StrConv(InString, vbFromUnicode)))
    bytBuffer = StrConv(InString, vbFromUnicode)
    StringToArray = bytBuffer
End Function
Public Function GetValues() As String
    GetValues = LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4))
End Function
Private Function LongToString(Num As Long) As String
        Dim A As Byte, B As Byte, C As Byte, d As Byte
        A = Num And &HFF&
        If A < 16 Then LongToString = "0" & Hex(A) Else LongToString = Hex(A)
        B = (Num And &HFF00&) \ 256
        If B < 16 Then LongToString = LongToString & "0" & Hex(B) Else LongToString = LongToString & Hex(B)
        C = (Num And &HFF0000) \ 65536
        If C < 16 Then LongToString = LongToString & "0" & Hex(C) Else LongToString = LongToString & Hex(C)
        If Num < 0 Then d = ((Num And &H7F000000) \ 16777216) Or &H80& Else d = (Num And &HFF000000) \ 16777216
        If d < 16 Then LongToString = LongToString & "0" & Hex(d) Else LongToString = LongToString & Hex(d)
End Function

Public Sub MD5Init()
    ByteCounter = 0
    State(1) = UnsignedToLong(1732584193#)
    State(2) = UnsignedToLong(4023233417#)
    State(3) = UnsignedToLong(2562383102#)
    State(4) = UnsignedToLong(271733878#)
End Sub

Public Sub MD5Final()
    Dim dblBits As Double, padding(72) As Byte, lngBytesBuffered As Long
    padding(0) = &H80
    dblBits = ByteCounter * 8
    lngBytesBuffered = ByteCounter Mod 64
    If lngBytesBuffered <= 56 Then MD5Update 56 - lngBytesBuffered, padding Else MD5Update 120 - ByteCounter, padding
    padding(0) = UnsignedToLong(dblBits) And &HFF&
    padding(1) = UnsignedToLong(dblBits) \ 256 And &HFF&
    padding(2) = UnsignedToLong(dblBits) \ 65536 And &HFF&
    padding(3) = UnsignedToLong(dblBits) \ 16777216 And &HFF&
    padding(4) = 0
    padding(5) = 0
    padding(6) = 0
    padding(7) = 0
    MD5Update 8, padding
End Sub

续上,俺用的是这个
Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte)
    Dim II As Integer, I As Integer, J As Integer, K As Integer, lngBufferedBytes As Long, lngBufferRemaining As Long, lngRem As Long

    lngBufferedBytes = ByteCounter Mod 64
    lngBufferRemaining = 64 - lngBufferedBytes
    ByteCounter = ByteCounter + InputLen

    If InputLen >= lngBufferRemaining Then
        For II = 0 To lngBufferRemaining - 1
            ByteBuffer(lngBufferedBytes + II) = InputBuffer(II)
        Next II
        MD5Transform ByteBuffer
        lngRem = (InputLen) Mod 64
        For I = lngBufferRemaining To InputLen - II - lngRem Step 64
            For J = 0 To 63
                ByteBuffer(J) = InputBuffer(I + J)
            Next J
            MD5Transform ByteBuffer
        Next I
        lngBufferedBytes = 0
    Else
      I = 0
    End If
    For K = 0 To InputLen - I - 1
        ByteBuffer(lngBufferedBytes + K) = InputBuffer(I + K)
    Next K
End Sub
Private Sub MD5Transform(Buffer() As Byte)
    Dim X(16) As Long, A As Long, B As Long, C As Long, d As Long
    
    A = State(1)
    B = State(2)
    C = State(3)
    d = State(4)
    Decode 64, X, Buffer
    FF A, B, C, d, X(0), S11, -680876936
    FF d, A, B, C, X(1), S12, -389564586
    FF C, d, A, B, X(2), S13, 606105819
    FF B, C, d, A, X(3), S14, -1044525330
    FF A, B, C, d, X(4), S11, -176418897
    FF d, A, B, C, X(5), S12, 1200080426
    FF C, d, A, B, X(6), S13, -1473231341
    FF B, C, d, A, X(7), S14, -45705983
    FF A, B, C, d, X(8), S11, 1770035416
    FF d, A, B, C, X(9), S12, -1958414417
    FF C, d, A, B, X(10), S13, -42063
    FF B, C, d, A, X(11), S14, -1990404162
    FF A, B, C, d, X(12), S11, 1804603682
    FF d, A, B, C, X(13), S12, -40341101
    FF C, d, A, B, X(14), S13, -1502002290
    FF B, C, d, A, X(15), S14, 1236535329

    GG A, B, C, d, X(1), S21, -165796510
    GG d, A, B, C, X(6), S22, -1069501632
    GG C, d, A, B, X(11), S23, 643717713
    GG B, C, d, A, X(0), S24, -373897302
    GG A, B, C, d, X(5), S21, -701558691
    GG d, A, B, C, X(10), S22, 38016083
    GG C, d, A, B, X(15), S23, -660478335
    GG B, C, d, A, X(4), S24, -405537848
    GG A, B, C, d, X(9), S21, 568446438
    GG d, A, B, C, X(14), S22, -1019803690
    GG C, d, A, B, X(3), S23, -187363961
    GG B, C, d, A, X(8), S24, 1163531501
    GG A, B, C, d, X(13), S21, -1444681467
    GG d, A, B, C, X(2), S22, -51403784
    GG C, d, A, B, X(7), S23, 1735328473
    GG B, C, d, A, X(12), S24, -1926607734

    HH A, B, C, d, X(5), S31, -378558
    HH d, A, B, C, X(8), S32, -2022574463
    HH C, d, A, B, X(11), S33, 1839030562
    HH B, C, d, A, X(14), S34, -35309556
    HH A, B, C, d, X(1), S31, -1530992060
    HH d, A, B, C, X(4), S32, 1272893353
    HH C, d, A, B, X(7), S33, -155497632
    HH B, C, d, A, X(10), S34, -1094730640
    HH A, B, C, d, X(13), S31, 681279174
    HH d, A, B, C, X(0), S32, -358537222
    HH C, d, A, B, X(3), S33, -722521979
    HH B, C, d, A, X(6), S34, 76029189
    HH A, B, C, d, X(9), S31, -640364487
    HH d, A, B, C, X(12), S32, -421815835
    HH C, d, A, B, X(15), S33, 530742520
    HH B, C, d, A, X(2), S34, -995338651

    II A, B, C, d, X(0), S41, -198630844
    II d, A, B, C, X(7), S42, 1126891415
    II C, d, A, B, X(14), S43, -1416354905
    II B, C, d, A, X(5), S44, -57434055
    II A, B, C, d, X(12), S41, 1700485571
    II d, A, B, C, X(3), S42, -1894986606
    II C, d, A, B, X(10), S43, -1051523
    II B, C, d, A, X(1), S44, -2054922799
    II A, B, C, d, X(8), S41, 1873313359
    II d, A, B, C, X(15), S42, -30611744
    II C, d, A, B, X(6), S43, -1560198380
    II B, C, d, A, X(13), S44, 1309151649
    II A, B, C, d, X(4), S41, -145523070
    II d, A, B, C, X(11), S42, -1120210379
    II C, d, A, B, X(2), S43, 718787259
    II B, C, d, A, X(9), S44, -343485551

    State(1) = LongOverflowAdd(State(1), A)
    State(2) = LongOverflowAdd(State(2), B)
    State(3) = LongOverflowAdd(State(3), C)
    State(4) = LongOverflowAdd(State(4), d)
End Sub

Private Sub Decode(Length As Integer, OutputBuffer() As Long, InputBuffer() As Byte)
    Dim intDblIndex As Integer, intByteIndex As Integer, dblSum As Double
    For intByteIndex = 0 To Length - 1 Step 4
        dblSum = InputBuffer(intByteIndex) + InputBuffer(intByteIndex + 1) * 256# + InputBuffer(intByteIndex + 2) * 65536# + InputBuffer(intByteIndex + 3) * 16777216#
        OutputBuffer(intDblIndex) = UnsignedToLong(dblSum)
        intDblIndex = intDblIndex + 1
    Next intByteIndex
End Sub
Private Function FF(A As Long, B As Long, C As Long, d As Long, X As Long, S As Long, ac As Long) As Long
    A = LongOverflowAdd4(A, (B And C) Or (Not (B) And d), X, ac)
    A = LongLeftRotate(A, S)
    A = LongOverflowAdd(A, B)
End Function
Private Function GG(A As Long, B As Long, C As Long, d As Long, X As Long, S As Long, ac As Long) As Long
    A = LongOverflowAdd4(A, (B And d) Or (C And Not (d)), X, ac)
    A = LongLeftRotate(A, S)
    A = LongOverflowAdd(A, B)
End Function
Private Function HH(A As Long, B As Long, C As Long, d As Long, X As Long, S As Long, ac As Long) As Long
    A = LongOverflowAdd4(A, B Xor C Xor d, X, ac)
    A = LongLeftRotate(A, S)
    A = LongOverflowAdd(A, B)
End Function
Private Function II(A As Long, B As Long, C As Long, d As Long, X As Long, S As Long, ac As Long) As Long
    A = LongOverflowAdd4(A, C Xor (B Or Not (d)), X, ac)
    A = LongLeftRotate(A, S)
    A = LongOverflowAdd(A, B)
End Function

Function LongLeftRotate(value As Long, Bits As Long) As Long
    Dim lngSign As Long, lngI As Long
    Bits = Bits Mod 32
    If Bits = 0 Then LongLeftRotate = value: Exit Function
    For lngI = 1 To Bits
        lngSign = value And &HC0000000
        value = (value And &H3FFFFFFF) * 2
        value = value Or ((lngSign < 0) And 1) Or (CBool(lngSign And &H40000000) And &H80000000)
    Next
    LongLeftRotate = value
End Function
Private Function LongOverflowAdd(Val1 As Long, Val2 As Long) As Long
    Dim lngHighWord As Long, lngLowWord As Long, lngOverflow As Long
    lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&)
    lngOverflow = lngLowWord \ 65536
    lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + ((Val2 And &HFFFF0000) \ 65536) + lngOverflow) And &HFFFF&
    LongOverflowAdd = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
End Function
Private Function LongOverflowAdd4(Val1 As Long, Val2 As Long, val3 As Long, val4 As Long) As Long
    Dim lngHighWord As Long, lngLowWord As Long, lngOverflow As Long
    lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&) + (val3 And &HFFFF&) + (val4 And &HFFFF&)
    lngOverflow = lngLowWord \ 65536
    lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + ((Val2 And &HFFFF0000) \ 65536) + ((val3 And &HFFFF0000) \ 65536) + ((val4 And &HFFFF0000) \ 65536) + lngOverflow) And &HFFFF&
    LongOverflowAdd4 = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
End Function

Private Function UnsignedToLong(value As Double) As Long
    If value < 0 Or value >= OFFSET_4 Then Error 6
    If value <= MAXINT_4 Then UnsignedToLong = value Else UnsignedToLong = value - OFFSET_4
End Function
Private Function LongToUnsigned(value As Long) As Double
    If value < 0 Then LongToUnsigned = value + OFFSET_4 Else LongToUnsigned = value
End Function
引用 40 楼 zhao4zhong1 的回复:
MD5 ("这是虾米回事啊") = 04dbc250fafcd6d062f7158a4c099da7
MD5 ("这是什么回事啊") = aca483d35d9f95b2676f3cf70cec137e

正解 charset = UTF-8:
MD5('这是虾米回事啊');
8d90f600f73bd2db701e885695960f84
MD5('这是什么回事啊');
8a8344f1429aa0cd538bb69a5b10106a

charset = GB2312:
MD5('这是虾米回事啊');
04dbc250fafcd6d062f7158a4c099da7
MD5('这是什么回事啊');
ca483d35d9f95b2676f3cf70cec137e
引用 37 楼 yflk 的回复:
看到这个帖子很开心。大家真认真。
MD5现在已经被我们中国人破解了,好像是个女的,山东的

王小云。

用百度搜索吧。GOOGLE里面一搜索含“王”的就易做图掉了,不知道又是啥事。

亏了王小云还给她老公打赌,说“用GOOGLE搜索王小云,一定能有上千条记录”。现在一条也没有了,哈哈。
引用 50 楼 myjian 的回复:
引用 37 楼 yflk 的回复:
看到这个帖子很开心。大家真认真。
MD5现在已经被我们中国人破解了,好像是个女的,山东的

王小云。

用百度搜索吧。GOOGLE里面一搜索含“王”的就易做图掉了,不知道又是啥事。

亏了王小云还给她老公打赌,说“用GOOGLE搜索王小云,一定能有上千条记录”。现在一条也没有了,哈哈。


以前想搜胡萝卜,结果因为胡这个字,挂了
然后各种姓氏就接踵而至,现在google基本上大部分的常用字都会易做图掉
毕竟天朝最不缺的就是各种灵道,今天这个觉得自己要名讳,明天那个觉得自己要名讳…… 我也来贴一个
Option Explicit
Private Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" (ByRef phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptReleaseContext Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptCreateHash Lib "advapi32.dll" (ByVal hProv As Long, ByVal Algid As Long, ByVal hKey As Long, ByVal dwFlags As Long, ByRef phHash As Long) As Long
Private Declare Function CryptDestroyHash Lib "advapi32.dll" (ByVal hHash As Long) As Long
Private Declare Function CryptHashData Lib "advapi32.dll" (ByVal hHash As Long, pbData As Any, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long
Private Declare Function CryptGetHashParam Lib "advapi32.dll" (ByVal hHash As Long, ByVal dwParam As Long, pbData As Any, pdwDataLen As Long, ByVal dwFlags As Long) As Long
Private Const PROV_RSA_FULL = 1
Private Const CRYPT_NEWKEYSET = &H8
Private Const ALG_CLASS_HASH = 32768
Private Const ALG_TYPE_ANY = 0
Private Const ALG_SID_MD2 = 1
Private Const ALG_SID_MD4 = 2
Private Const ALG_SID_MD5 = 3
Private Const ALG_SID_SHA1 = 4
Enum HashAlgorithm
    MD2 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2
    MD4 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4
    MD5 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5
    sha1 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
End Enum
Private Const HP_HASHVAL = 2
Private Const HP_HASHSIZE = 4

Private Function HashString(ByVal Str As String, Optional ByVal Algorithm As HashAlgorithm = sha1) As String
    Dim hCtx As Long
    Dim hHash As Long
    Dim lRes As Long
    Dim lLen As Long
    Dim lIdx As Long
    Dim abData() As Byte

   lRes = CryptAcquireContext(hCtx, vbNullString, vbNullString, PROV_RSA_FULL, 0)

   If lRes <> 0 Then
      lRes = CryptCreateHash(hCtx, Algorithm, 0, 0, hHash)
      If lRes <> 0 Then
         lRes = CryptHashData(hHash, ByVal Str, Len(Str), 0)
         If lRes <> 0 Then
            lRes = CryptGetHashParam(hHash, HP_HASHSIZE, lLen, 4, 0)
            If lRes <> 0 Then
                ReDim abData(0 To lLen - 1)
                lRes = CryptGetHashParam(hHash, HP_HASHVAL, abData(0), lLen, 0)
                If lRes <> 0 Then
                    For lIdx = 0 To UBound(abData)
                        HashString = HashString & Right$("0" & Hex$(abData(lIdx)), 2)
                    Next
                End If
            End If
         End If
         CryptDestroyHash hHash
      End If
   End If
   CryptReleaseContext hCtx, 0
End Function
这是虾米回事啊=8d90f600f73bd2db701e885695960f84
这是什么回事啊=8a8344f1429aa0cd538bb69a5b10106a

对你的算法表示很大的怀疑 04dbc250fafcd6d062f7158a4c099da7

aca483d35d9f95b2676f3cf70cec137e


我的也是这个 木有研究,看个热闹 http://download.csdn.net/detail/zzhgb/3735043
引用 48 楼 zhlexiao 的回复:
引用 40 楼 zhao4zhong1 的回复:
MD5 ("这是虾米回事啊") = 04dbc250fafcd6d062f7158a4c099da7
MD5 ("这是什么回事啊") = aca483d35d9f95b2676f3cf70cec137e

正解


你贴的把md5转回的调用是哪个? 很多方法调用出来都是这个结果,
那2个不对的人不知道怎么生成出来的
估计核心算法本身问题不大。差异是由于“串”转“数”造成的。看看各自的串转数的结果。


说 MD5 被“破解”有点夸大其词。实际上山大王晓云教授的工作,是找到一种方法,可以比穷举方式低几个数量级找到碰撞消息。但是,要使碰撞消息有意义怕是很难。

给一个通俗的例子,假设你用 MD5 给一份合同做了摘要,以便数字签名。用王晓云的方法可以更快地找出一个生成同样摘要的消息。不过,最可能的是,找到的消息是一堆乱码,跟原来的合同风马牛不相及。

你想找到生成同样摘要的篡改过的合同版本,还是非常困难的。

不过,MD5 的确已经过时了。很多商用规范都已经指定采用安全 SHA 了。
SHA1计算速度比较慢,但抗穷举行能也更好.
一般md5已经够了,另外加上逻辑,
基本上无法破解
引用 28 楼 belfast 的回复:
  MD5要连这点事都搞不定,还叫MD5吗?
  
 我把两个字串输入MD5函数得到的结果是完全不同的:

 这是虾米回事啊 -> D5C866ECC84AE442F9C4940EA270C31C

 这是什么回事啊 -> 22CCB44B137AF6774D0D88E36CCAFF5D


这个是CAPICOM的结果,也不知道这东西怎么出来的
是否够用,要看是什么实际应用。

例如,对程序代码的签名,就很不可靠了。

已经有人做过,在一段恶意代码后面缀上选定的垃圾数据,使之与某一商用程序代码的 MD5 摘要及数字签名相同。还好他们仅仅是研究实验。如果真的用于传播病毒,问题就大了。

美国的商用标准,规定 2010 年之后的商用安全应用,只能使用安全 SHA 了。即至少是 SHA-1,根据需要可能是 SHA-224/256, SHA-384, SHA-512。

至于快慢问题,与安全相比只能退居其次了。

MD 家族,算法上一直备受争议,屡被报道攻破,还不仅仅是摘要位长的问题。跌跌撞撞走到 MD5,已经走到头了。目前的使用,主要是在兼容旧的产品。
上次看过俩图片,MD5是一样的,图片内容是一张合同,其中一张的内容被篡改了 md5("这是虾米回事啊")= 3a1dc3cc7a6cc1bd5b38843aa8081b7e
md5("这是什么回事啊")=c5ddfff478bdea2b0f892e2dc1a47d29
引用 63 楼 of123 的回复:
是否够用,要看是什么实际应用。

例如,对程序代码的签名,就很不可靠了。

已经有人做过,在一段恶意代码后面缀上选定的垃圾数据,使之与某一商用程序代码的 MD5 摘要及数字签名相同。还好他们仅仅是研究实验。如果真的用于传播病毒,问题就大了。

美国的商用标准,规定 2010 年之后的商用安全应用,只能使用安全 SHA 了。即至少是 SHA-1,根据需要可能是 SHA-224/256, ……


不用md5用什么,sha1吗 有关 MD5 的安全性,看看 Wikipedia 的评论:

The security of the MD5 hash function is severely compromised. A collision attack exists that can find collisions within seconds on a computer with a 2.6Ghz Pentium4 processor (complexity of 224.1).[18] Further, there is also a chosen-prefix collision attack that can produce a collision for two chosen arbitrarily different inputs within hours, using off-the-shelf computing hardware (complexity 239).[19] The ability to find collisions has been greatly aided by the use of off-the-shelf GPUs. On an NVIDIA GeForce 8400GS graphics processor, 16-18 million hashes per second can be computed. An NVIDIA GeForce 8800 Ultra can calculate more than 200 million hashes per second.[20]

These hash and collision attacks have been demonstrated in the public in various situations, including colliding document files[21][22] and digital certificates.[7]

有兴趣的可以看看这篇,有攻击的细节,和各种 Hash 安全性的评估:

http://www.win.tue.nl/hashclash/rogue-ca/

实际上,关于何种安全需求使用何种 Hash 工具,NIST 是有标准的:FIPS 140-2 Security Requirements for Cryptographic Modules。

由于 MD5 的已知弱点,它是被这个标准排除在外的。

中国的商密标准 Hash 算法是 SM3,是一种 256-bit 摘要的算法。
我在想,用一种算法的话,还是有可能被构造出碰撞

而如果同时用两种算法的话,同时被构造出碰撞的机率就真的几乎为零了,虽然这个计算效率会低点 我得看看自己抄的那个MD5是否也这样 http://download.csdn.net/detail/zzhgb/3738359 王小云不是sha-1也破了么? LZ的MD5肯定是算法出现了问题 “这是怎么回事啊”  也=6e807f8b1ec02fabe64fbbe4891ef252
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,