⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modmd5.bas

📁 一个用汇编、VC、VB联合写的破解QQ密码的工具
💻 BAS
字号:
Attribute VB_Name = "modMD5"
Option Explicit

'===========================================================================
'     Code Name:       MD5计算模块
'     First Built:     2001-12-18
'     Last Modify:     2003-10-10
'     Author:          赵斌(Binny)
'     Copyright:       Binny,转载请保留本声明
'===========================================================================

'2001年12月18日 根据 rfc1321.txt 编制VB代码
'2003年10月10日 修改函数 Public Function INNER_MD5(fsInput As String) As String --> _
                         Public Function INNER_MD5(fsInput As String, fbIsHex As Boolean) As String

'
'MD5("") = d41d8cd98f00b204e9800998ecf8427e
'MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
'MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
'MD5("message digest") = f96b697d7cb7938d525a2f31aaf161d0
'MD5("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
'MD5("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") = d174ab98d277d9f5a5611c2c9f419d9f
'MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a

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

Public Function INNER_MD5(fsInput As String, Optional fbIsHex As Boolean) As String
    Dim lLen      As Long, iTemp1 As Long, iTemp2 As Long
    Dim k         As Long, m As Long, n As Long
    Dim a         As Long, b As Long, c As Long, d As Long
    Dim sResult   As String
    Dim sInput    As String
    Dim byt()     As Byte

    ReDim lbuf(0 To 3) As Long
    ReDim x(0 To 15) As Long
    
    If fsInput <> "" Then
      If fbIsHex Then
        byt = INNER_Hex2ByteA(fsInput)
        lLen = Len(fsInput) / 2
      Else
        byt = INNER_Str2ByteA(fsInput, lLen)
      End If
    End If
    iTemp1 = lLen * 8
    iTemp2 = 56 - (lLen + 1) Mod 64

    If iTemp2 < 0 Then
        iTemp2 = 64 + iTemp2
    End If
    ReDim Preserve byt(lLen + iTemp2 + 8)
    byt(lLen) = 128 'Add binary 10000000

    For k = 1 To 8
        byt(lLen + iTemp2 + k) = iTemp1 Mod 256
        iTemp1 = iTemp1 - iTemp1 Mod 256
        iTemp1 = iTemp1 \ 256
    Next k
      
    lbuf(0) = &H67452301
    lbuf(1) = &HEFCDAB89
    lbuf(2) = &H98BADCFE
    lbuf(3) = &H10325476
    
    For m = 0 To (UBound(byt) + 1) \ 64 - 1
        a = lbuf(0)
        b = lbuf(1)
        c = lbuf(2)
        d = lbuf(3)

        For k = 0 To 15
            sInput = ""
'            Debug.Assert k <> 14
            For n = 1 To 4
                sInput = Hex$(byt(64 * m + 4 * k + n - 1)) & sInput
                If Len(sInput) Mod 2 Then sInput = "0" & sInput
            Next n
            x(k) = CLng("&H" & sInput)
        Next k

        Call Lo_lFF(a, b, c, d, x(0), S11, &HD76AA478)    '; /* 1 */
        Call Lo_lFF(d, a, b, c, x(1), S12, &HE8C7B756)    '; /* 2 */
        Call Lo_lFF(c, d, a, b, x(2), S13, &H242070DB)    '; /* 3 */
        Call Lo_lFF(b, c, d, a, x(3), S14, &HC1BDCEEE)    '; /* 4 */
        Call Lo_lFF(a, b, c, d, x(4), S11, &HF57C0FAF)    '; /* 5 */
        Call Lo_lFF(d, a, b, c, x(5), S12, &H4787C62A)    '; /* 6 */
        Call Lo_lFF(c, d, a, b, x(6), S13, &HA8304613)    '; /* 7 */
        Call Lo_lFF(b, c, d, a, x(7), S14, &HFD469501)    '; /* 8 */
        Call Lo_lFF(a, b, c, d, x(8), S11, &H698098D8)    '; /* 9 */
        Call Lo_lFF(d, a, b, c, x(9), S12, &H8B44F7AF)    '; /* 10 */
        Call Lo_lFF(c, d, a, b, x(10), S13, &HFFFF5BB1)   '; /* 11 */
        Call Lo_lFF(b, c, d, a, x(11), S14, &H895CD7BE)   '; /* 12 */
        Call Lo_lFF(a, b, c, d, x(12), S11, &H6B901122)   '; /* 13 */
        Call Lo_lFF(d, a, b, c, x(13), S12, &HFD987193)   '; /* 14 */
        Call Lo_lFF(c, d, a, b, x(14), S13, &HA679438E)   '; /* 15 */
        Call Lo_lFF(b, c, d, a, x(15), S14, &H49B40821)   '; /* 16 */
        
        Call Lo_lGG(a, b, c, d, x(1), S21, &HF61E2562)    '; /* 17 */
        Call Lo_lGG(d, a, b, c, x(6), S22, &HC040B340)    '; /* 18 */
        Call Lo_lGG(c, d, a, b, x(11), S23, &H265E5A51)   '; /* 19 */
        Call Lo_lGG(b, c, d, a, x(0), S24, &HE9B6C7AA)    '; /* 20 */
        Call Lo_lGG(a, b, c, d, x(5), S21, &HD62F105D)    '; /* 21 */
        Call Lo_lGG(d, a, b, c, x(10), S22, &H2441453)    '; /* 22 */
        Call Lo_lGG(c, d, a, b, x(15), S23, &HD8A1E681)   '; /* 23 */
        Call Lo_lGG(b, c, d, a, x(4), S24, &HE7D3FBC8)    '; /* 24 */
        Call Lo_lGG(a, b, c, d, x(9), S21, &H21E1CDE6)    '; /* 25 */
        Call Lo_lGG(d, a, b, c, x(14), S22, &HC33707D6)   '; /* 26 */
        Call Lo_lGG(c, d, a, b, x(3), S23, &HF4D50D87)    '; /* 27 */
        Call Lo_lGG(b, c, d, a, x(8), S24, &H455A14ED)    '; /* 28 */
        Call Lo_lGG(a, b, c, d, x(13), S21, &HA9E3E905)   '; /* 29 */
        Call Lo_lGG(d, a, b, c, x(2), S22, &HFCEFA3F8)    '; /* 30 */
        Call Lo_lGG(c, d, a, b, x(7), S23, &H676F02D9)    '; /* 31 */
        Call Lo_lGG(b, c, d, a, x(12), S24, &H8D2A4C8A)   '; /* 32 */
      
        Call Lo_lHH(a, b, c, d, x(5), S31, &HFFFA3942)  '; /* 33 */
        Call Lo_lHH(d, a, b, c, x(8), S32, &H8771F681)  '; /* 34 */
        Call Lo_lHH(c, d, a, b, x(11), S33, &H6D9D6122) '; /* 35 */
        Call Lo_lHH(b, c, d, a, x(14), S34, &HFDE5380C) '; /* 36 */
        Call Lo_lHH(a, b, c, d, x(1), S31, &HA4BEEA44)  '; /* 37 */
        Call Lo_lHH(d, a, b, c, x(4), S32, &H4BDECFA9)  '; /* 38 */
        Call Lo_lHH(c, d, a, b, x(7), S33, &HF6BB4B60)  '; /* 39 */
        Call Lo_lHH(b, c, d, a, x(10), S34, &HBEBFBC70) '; /* 40 */
        Call Lo_lHH(a, b, c, d, x(13), S31, &H289B7EC6) '; /* 41 */
        Call Lo_lHH(d, a, b, c, x(0), S32, &HEAA127FA)  '; /* 42 */
        Call Lo_lHH(c, d, a, b, x(3), S33, &HD4EF3085)  '; /* 43 */
        Call Lo_lHH(b, c, d, a, x(6), S34, &H4881D05)   '; /* 44 */
        Call Lo_lHH(a, b, c, d, x(9), S31, &HD9D4D039)  '; /* 45 */
        Call Lo_lHH(d, a, b, c, x(12), S32, &HE6DB99E5) '; /* 46 */
        Call Lo_lHH(c, d, a, b, x(15), S33, &H1FA27CF8) '; /* 47 */
        Call Lo_lHH(b, c, d, a, x(2), S34, &HC4AC5665)  '; /* 48 */
      
        Call Lo_lII(a, b, c, d, x(0), S41, &HF4292244)  '; /* 49 */
        Call Lo_lII(d, a, b, c, x(7), S42, &H432AFF97)  '; /* 50 */
        Call Lo_lII(c, d, a, b, x(14), S43, &HAB9423A7) '; /* 51 */
        Call Lo_lII(b, c, d, a, x(5), S44, &HFC93A039)  '; /* 52 */
        Call Lo_lII(a, b, c, d, x(12), S41, &H655B59C3) '; /* 53 */
        Call Lo_lII(d, a, b, c, x(3), S42, &H8F0CCC92)  '; /* 54 */
        Call Lo_lII(c, d, a, b, x(10), S43, &HFFEFF47D) '; /* 55 */
        Call Lo_lII(b, c, d, a, x(1), S44, &H85845DD1)  '; /* 56 */
        Call Lo_lII(a, b, c, d, x(8), S41, &H6FA87E4F)  '; /* 57 */
        Call Lo_lII(d, a, b, c, x(15), S42, &HFE2CE6E0) '; /* 58 */
        Call Lo_lII(c, d, a, b, x(6), S43, &HA3014314)  '; /* 59 */
        Call Lo_lII(b, c, d, a, x(13), S44, &H4E0811A1) '; /* 60 */
        Call Lo_lII(a, b, c, d, x(4), S41, &HF7537E82)  '; /* 61 */
        Call Lo_lII(d, a, b, c, x(11), S42, &HBD3AF235) '; /* 62 */
        Call Lo_lII(c, d, a, b, x(2), S43, &H2AD7D2BB)  '; /* 63 */
        Call Lo_lII(b, c, d, a, x(9), S44, &HEB86D391)  '; /* 64 */
  
        lbuf(0) = Lo_Add2Value(lbuf(0), a)
        lbuf(1) = Lo_Add2Value(lbuf(1), b)
        lbuf(2) = Lo_Add2Value(lbuf(2), c)
        lbuf(3) = Lo_Add2Value(lbuf(3), d)
    Next m

    sResult = ""
    For k = 0 To 3
        sInput = INNER_Format(Hex$(lbuf(k)), "00000000")
        For n = 3 To 0 Step -1
            sResult = sResult & Mid$(sInput, 1 + 2 * n, 2)
        Next n
    Next k

    INNER_MD5 = sResult
End Function

Private Function Lo_lAddMD5(ByVal fsInput As Long, ByVal a As Long, ByVal b As Long, ByVal x As Long, ByVal ac As Long, ByVal s As Integer) As Long
' (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
' (a) = ROTATE_LEFT ((a), (s)); \
' (a) += (b); \
'  }
  Lo_lAddMD5 = Lo_Add2Value(Lo_lRotLeft(Lo_Add2Value(Lo_Add2Value(a, fsInput), Lo_Add2Value(x, ac)), s), b)
End Function

'#define LoFF(a, b, c, d, x, s, ac) { \
' (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
' (a) = ROTATE_LEFT ((a), (s)); \
' (a) += (b); \
'  }
Private Sub Lo_lFF(a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Integer, ByVal ac As Long)
    a = Lo_lAddMD5(Lo_lF(b, c, d), a, b, x, ac, s)
End Sub

'#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
Private Function Lo_lF(x As Long, y As Long, z As Long) As String
  Lo_lF = (x And y) Or (z And (&HFFFFFFFF - x))
End Function

'#define LoGG(a, b, c, d, x, s, ac) { \
' (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
' (a) = ROTATE_LEFT ((a), (s)); \
' (a) += (b); \
'  }
Private Sub Lo_lGG(a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Integer, ByVal ac As Long)
    a = Lo_lAddMD5(Lo_lG(b, c, d), a, b, x, ac, s)
End Sub

'#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
Private Function Lo_lG(x As Long, y As Long, z As Long) As String
  Lo_lG = (x And z) Or (y And (&HFFFFFFFF - z))
End Function

'#define LoHH(a, b, c, d, x, s, ac) { \
' (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
' (a) = ROTATE_LEFT ((a), (s)); \
' (a) += (b); \
'  }
Private Sub Lo_lHH(a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Integer, ByVal ac As Long)
    a = Lo_lAddMD5(Lo_lH(b, c, d), a, b, x, ac, s)
End Sub

'#define H(x, y, z) ((x) ^ (y) ^ (z))
Private Function Lo_lH(x As Long, y As Long, z As Long) As String
  Lo_lH = y Xor x Xor z
End Function

'#define LoII(a, b, c, d, x, s, ac) { \
' (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
' (a) = ROTATE_LEFT ((a), (s)); \
' (a) += (b); \
'  }
Private Sub Lo_lII(a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Integer, ByVal ac As Long)
    a = Lo_lAddMD5(Lo_lI(b, c, d), a, b, x, ac, s)
End Sub

'#define I(x, y, z) ((y) ^ ((x) | (~z)))
Private Function Lo_lI(x As Long, y As Long, z As Long) As String
  Lo_lI = y Xor (x Or (&HFFFFFFFF - z))
End Function

Private Function Lo_Add2Value(flValueA As Long, flValueB As Long) As Long
    Dim lValueLoA As Long
    Dim lValueLoB As Long
    Dim lValueHiA  As Long
    Dim lValueHiB  As Long
 
    lValueHiA = flValueA And &H80000000
    lValueHiB = flValueB And &H80000000
    lValueLoA = flValueA And &H40000000
    lValueLoB = flValueB And &H40000000
 
    Lo_Add2Value = (flValueA And &H3FFFFFFF) + (flValueB And &H3FFFFFFF)
 
    If lValueLoA And lValueLoB Then
        Lo_Add2Value = Lo_Add2Value Xor &H80000000 Xor lValueHiA Xor lValueHiB
    ElseIf lValueLoA Or lValueLoB Then
        If Lo_Add2Value And &H40000000 Then
            Lo_Add2Value = Lo_Add2Value Xor &HC0000000 Xor lValueHiA Xor lValueHiB
        Else
            Lo_Add2Value = Lo_Add2Value Xor &H40000000 Xor lValueHiA Xor lValueHiB
        End If
    Else
        Lo_Add2Value = Lo_Add2Value Xor lValueHiA Xor lValueHiB
    End If
End Function

'#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
Private Function Lo_lRotLeft(ByVal flInput As Long, ByVal flRots As Long) As Long
    Dim lTempLeft As Long, lTempRight As Long
    If flInput = 0 Then Exit Function
    flRots = flRots Mod 32
    If flRots = 0 Then
        Lo_lRotLeft = flInput
        Exit Function
    End If
    lTempLeft = flInput And (2 ^ (32 - flRots) - 1)
    If lTempLeft > 2 ^ (31 - flRots) - 1 Then
      lTempLeft = lTempLeft - 2 ^ (31 - flRots)
      lTempLeft = lTempLeft * (2 ^ flRots)
      lTempLeft = lTempLeft Or &H80000000
    Else
      lTempLeft = lTempLeft * (2 ^ flRots)
    End If
    If flInput < 0 Then
      lTempRight = flInput And &H7FFFFFFF
      lTempRight = lTempRight \ 2 ^ (32 - flRots)
      lTempRight = lTempRight Or (2 ^ (flRots - 1))
    Else
      lTempRight = flInput \ 2 ^ (32 - flRots)
    End If
    Lo_lRotLeft = CLng(lTempLeft) Or lTempRight
End Function

Public Function INNER_Format(InputStr As String, FormatStr As String) As String
  If Len(InputStr) >= Len(FormatStr) Then
    INNER_Format = Left(InputStr, Len(FormatStr))
  Else
    INNER_Format = Left(FormatStr, Len(FormatStr) - Len(InputStr)) & InputStr
  End If
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -