飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7974|回复: 19

[VB] MD5 转换模块~提取自《[PYG]算法分析入门第十一课》

[复制链接]
  • TA的每日心情
    开心
    2018-5-6 16:27
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2006-7-31 15:12:26 | 显示全部楼层 |阅读模式
    使用:Text2.Text = MD5(Text1.Text)
    方法:VB工程菜单-添加模块-现存,找到Module1.bas添加即可!
    以下为这个模块的源代码~Enjoy~
    1. Option Explicit

    2. ' Visual Basic MD5 Implementation
    3. ' Robert Hubley and David Midkiff ([email]mdj2023@hotmail.com[/email])
    4. ' modify by simonyan, Support chinese
    5. ' Standard MD5 implementation optimised for the Visual Basic environment.
    6. ' Conforms to all standards and can be used in digital signature or password
    7. ' protection related schemes.

    8. Private Const OFFSET_4 = 4294967296#
    9. Private Const MAXINT_4 = 2147483647
    10. Private State(4) As Long
    11. Private ByteCounter As Long
    12. Private ByteBuffer(63) As Byte
    13. Private Const S11 = 7
    14. Private Const S12 = 12
    15. Private Const S13 = 17
    16. Private Const S14 = 22
    17. Private Const S21 = 5
    18. Private Const S22 = 9
    19. Private Const S23 = 14
    20. Private Const S24 = 20
    21. Private Const S31 = 4
    22. Private Const S32 = 11
    23. Private Const S33 = 16
    24. Private Const S34 = 23
    25. Private Const S41 = 6
    26. Private Const S42 = 10
    27. Private Const S43 = 15
    28. Private Const S44 = 21
    29. Property Get RegisterA() As String
    30.     RegisterA = State(1)
    31. End Property
    32. Property Get RegisterB() As String
    33.     RegisterB = State(2)
    34. End Property

    35. Property Get RegisterC() As String
    36.     RegisterC = State(3)
    37. End Property

    38. Property Get RegisterD() As String
    39.     RegisterD = State(4)
    40. End Property
    41. Public Function MD5(SourceString As String) As String
    42.     MD5Init
    43.     MD5Update LenB(StrConv(SourceString, vbFromUnicode)), StringToArray(SourceString)
    44.     MD5Final
    45.     MD5 = GetValues
    46. End Function
    47. Public Function Md5_File_Calc(InFile As String) As String

    48. GoSub begin

    49. begin:
    50.     Dim FileO As Integer
    51.     FileO = FreeFile
    52.     Call FileLen(InFile)
    53.     Open InFile For Binary Access Read As #FileO
    54.     MD5Init
    55.     Do While Not EOF(FileO)
    56.         Get #FileO, , ByteBuffer
    57.         If Loc(FileO) < LOF(FileO) Then
    58.             ByteCounter = ByteCounter + 64
    59.             MD5Transform ByteBuffer
    60.         End If
    61.     Loop
    62.     ByteCounter = ByteCounter + (LOF(FileO) Mod 64)
    63.     Close #FileO
    64.     MD5Final
    65.     Md5_File_Calc = GetValues
    66. End Function
    67. Private Function StringToArray(InString As String) As Byte()
    68.     Dim I As Integer, bytBuffer() As Byte
    69.     ReDim bytBuffer(LenB(StrConv(InString, vbFromUnicode)))
    70.     bytBuffer = StrConv(InString, vbFromUnicode)
    71.     StringToArray = bytBuffer
    72. End Function
    73. Public Function GetValues() As String
    74.     GetValues = LongToString(State(1)) & LongToString(State(2)) & LongToString(State(3)) & LongToString(State(4))
    75. End Function
    76. Private Function LongToString(Num As Long) As String
    77.         Dim a As Byte, B As Byte, C As Byte, D As Byte
    78.         a = Num And &HFF&
    79.         If a < 16 Then LongToString = "0" & Hex(a) Else LongToString = Hex(a)
    80.         B = (Num And &HFF00&) \ 256
    81.         If B < 16 Then LongToString = LongToString & "0" & Hex(B) Else LongToString = LongToString & Hex(B)
    82.         C = (Num And &HFF0000) \ 65536
    83.         If C < 16 Then LongToString = LongToString & "0" & Hex(C) Else LongToString = LongToString & Hex(C)
    84.         If Num < 0 Then D = ((Num And &H7F000000) \ 16777216) Or &H80& Else D = (Num And &HFF000000) \ 16777216
    85.         If D < 16 Then LongToString = LongToString & "0" & Hex(D) Else LongToString = LongToString & Hex(D)
    86. End Function

    87. Public Sub MD5Init()
    88.     ByteCounter = 0
    89.     State(1) = UnsignedToLong(1732584193#)
    90.     State(2) = UnsignedToLong(4023233417#)
    91.     State(3) = UnsignedToLong(2562383102#)
    92.     State(4) = UnsignedToLong(271733878#)
    93. End Sub

    94. Public Sub MD5Final()
    95.     Dim dblBits As Double, padding(72) As Byte, lngBytesBuffered As Long
    96.     padding(0) = &H80
    97.     dblBits = ByteCounter * 8
    98.     lngBytesBuffered = ByteCounter Mod 64
    99.     If lngBytesBuffered <= 56 Then MD5Update 56 - lngBytesBuffered, padding Else MD5Update 120 - ByteCounter, padding
    100.     padding(0) = UnsignedToLong(dblBits) And &HFF&
    101.     padding(1) = UnsignedToLong(dblBits) \ 256 And &HFF&
    102.     padding(2) = UnsignedToLong(dblBits) \ 65536 And &HFF&
    103.     padding(3) = UnsignedToLong(dblBits) \ 16777216 And &HFF&
    104.     padding(4) = 0
    105.     padding(5) = 0
    106.     padding(6) = 0
    107.     padding(7) = 0
    108.     MD5Update 8, padding
    109. End Sub
    110. Public Sub MD5Update(InputLen As Long, InputBuffer() As Byte)
    111.     Dim II As Integer, I As Integer, J As Integer, K As Integer, lngBufferedBytes As Long, lngBufferRemaining As Long, lngRem As Long

    112.     lngBufferedBytes = ByteCounter Mod 64
    113.     lngBufferRemaining = 64 - lngBufferedBytes
    114.     ByteCounter = ByteCounter + InputLen

    115.     If InputLen >= lngBufferRemaining Then
    116.         For II = 0 To lngBufferRemaining - 1
    117.             ByteBuffer(lngBufferedBytes + II) = InputBuffer(II)
    118.         Next II
    119.         MD5Transform ByteBuffer
    120.         lngRem = (InputLen) Mod 64
    121.         For I = lngBufferRemaining To InputLen - II - lngRem Step 64
    122.             For J = 0 To 63
    123.                 ByteBuffer(J) = InputBuffer(I + J)
    124.             Next J
    125.             MD5Transform ByteBuffer
    126.         Next I
    127.         lngBufferedBytes = 0
    128.     Else
    129.       I = 0
    130.     End If
    131.     For K = 0 To InputLen - I - 1
    132.         ByteBuffer(lngBufferedBytes + K) = InputBuffer(I + K)
    133.     Next K
    134. End Sub
    135. Private Sub MD5Transform(Buffer() As Byte)
    136.     Dim X(16) As Long, a As Long, B As Long, C As Long, D As Long
    137.    
    138.     a = State(1)
    139.     B = State(2)
    140.     C = State(3)
    141.     D = State(4)
    142.     Decode 64, X, Buffer
    143.     FF a, B, C, D, X(0), S11, -680876936
    144.     FF D, a, B, C, X(1), S12, -389564586
    145.     FF C, D, a, B, X(2), S13, 606105819
    146.     FF B, C, D, a, X(3), S14, -1044525330
    147.     FF a, B, C, D, X(4), S11, -176418897
    148.     FF D, a, B, C, X(5), S12, 1200080426
    149.     FF C, D, a, B, X(6), S13, -1473231341
    150.     FF B, C, D, a, X(7), S14, -45705983
    151.     FF a, B, C, D, X(8), S11, 1770035416
    152.     FF D, a, B, C, X(9), S12, -1958414417
    153.     FF C, D, a, B, X(10), S13, -42063
    154.     FF B, C, D, a, X(11), S14, -1990404162
    155.     FF a, B, C, D, X(12), S11, 1804603682
    156.     FF D, a, B, C, X(13), S12, -40341101
    157.     FF C, D, a, B, X(14), S13, -1502002290
    158.     FF B, C, D, a, X(15), S14, 1236535329

    159.     GG a, B, C, D, X(1), S21, -165796510
    160.     GG D, a, B, C, X(6), S22, -1069501632
    161.     GG C, D, a, B, X(11), S23, 643717713
    162.     GG B, C, D, a, X(0), S24, -373897302
    163.     GG a, B, C, D, X(5), S21, -701558691
    164.     GG D, a, B, C, X(10), S22, 38016083
    165.     GG C, D, a, B, X(15), S23, -660478335
    166.     GG B, C, D, a, X(4), S24, -405537848
    167.     GG a, B, C, D, X(9), S21, 568446438
    168.     GG D, a, B, C, X(14), S22, -1019803690
    169.     GG C, D, a, B, X(3), S23, -187363961
    170.     GG B, C, D, a, X(8), S24, 1163531501
    171.     GG a, B, C, D, X(13), S21, -1444681467
    172.     GG D, a, B, C, X(2), S22, -51403784
    173.     GG C, D, a, B, X(7), S23, 1735328473
    174.     GG B, C, D, a, X(12), S24, -1926607734

    175.     HH a, B, C, D, X(5), S31, -378558
    176.     HH D, a, B, C, X(8), S32, -2022574463
    177.     HH C, D, a, B, X(11), S33, 1839030562
    178.     HH B, C, D, a, X(14), S34, -35309556
    179.     HH a, B, C, D, X(1), S31, -1530992060
    180.     HH D, a, B, C, X(4), S32, 1272893353
    181.     HH C, D, a, B, X(7), S33, -155497632
    182.     HH B, C, D, a, X(10), S34, -1094730640
    183.     HH a, B, C, D, X(13), S31, 681279174
    184.     HH D, a, B, C, X(0), S32, -358537222
    185.     HH C, D, a, B, X(3), S33, -722521979
    186.     HH B, C, D, a, X(6), S34, 76029189
    187.     HH a, B, C, D, X(9), S31, -640364487
    188.     HH D, a, B, C, X(12), S32, -421815835
    189.     HH C, D, a, B, X(15), S33, 530742520
    190.     HH B, C, D, a, X(2), S34, -995338651

    191.     II a, B, C, D, X(0), S41, -198630844
    192.     II D, a, B, C, X(7), S42, 1126891415
    193.     II C, D, a, B, X(14), S43, -1416354905
    194.     II B, C, D, a, X(5), S44, -57434055
    195.     II a, B, C, D, X(12), S41, 1700485571
    196.     II D, a, B, C, X(3), S42, -1894986606
    197.     II C, D, a, B, X(10), S43, -1051523
    198.     II B, C, D, a, X(1), S44, -2054922799
    199.     II a, B, C, D, X(8), S41, 1873313359
    200.     II D, a, B, C, X(15), S42, -30611744
    201.     II C, D, a, B, X(6), S43, -1560198380
    202.     II B, C, D, a, X(13), S44, 1309151649
    203.     II a, B, C, D, X(4), S41, -145523070
    204.     II D, a, B, C, X(11), S42, -1120210379
    205.     II C, D, a, B, X(2), S43, 718787259
    206.     II B, C, D, a, X(9), S44, -343485551

    207.     State(1) = LongOverflowAdd(State(1), a)
    208.     State(2) = LongOverflowAdd(State(2), B)
    209.     State(3) = LongOverflowAdd(State(3), C)
    210.     State(4) = LongOverflowAdd(State(4), D)
    211. End Sub

    212. Private Sub Decode(Length As Integer, OutputBuffer() As Long, InputBuffer() As Byte)
    213.     Dim intDblIndex As Integer, intByteIndex As Integer, dblSum As Double
    214.     For intByteIndex = 0 To Length - 1 Step 4
    215.         dblSum = InputBuffer(intByteIndex) + InputBuffer(intByteIndex + 1) * 256# + InputBuffer(intByteIndex + 2) * 65536# + InputBuffer(intByteIndex + 3) * 16777216#
    216.         OutputBuffer(intDblIndex) = UnsignedToLong(dblSum)
    217.         intDblIndex = intDblIndex + 1
    218.     Next intByteIndex
    219. End Sub
    220. 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
    221.     a = LongOverflowAdd4(a, (B And C) Or (Not (B) And D), X, ac)
    222.     a = LongLeftRotate(a, S)
    223.     a = LongOverflowAdd(a, B)
    224. End Function
    225. 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
    226.     a = LongOverflowAdd4(a, (B And D) Or (C And Not (D)), X, ac)
    227.     a = LongLeftRotate(a, S)
    228.     a = LongOverflowAdd(a, B)
    229. End Function
    230. 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
    231.     a = LongOverflowAdd4(a, B Xor C Xor D, X, ac)
    232.     a = LongLeftRotate(a, S)
    233.     a = LongOverflowAdd(a, B)
    234. End Function
    235. 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
    236.     a = LongOverflowAdd4(a, C Xor (B Or Not (D)), X, ac)
    237.     a = LongLeftRotate(a, S)
    238.     a = LongOverflowAdd(a, B)
    239. End Function

    240. Function LongLeftRotate(value As Long, Bits As Long) As Long
    241.     Dim lngSign As Long, lngI As Long
    242.     Bits = Bits Mod 32
    243.     If Bits = 0 Then LongLeftRotate = value: Exit Function
    244.     For lngI = 1 To Bits
    245.         lngSign = value And &HC0000000
    246.         value = (value And &H3FFFFFFF) * 2
    247.         value = value Or ((lngSign < 0) And 1) Or (CBool(lngSign And &H40000000) And &H80000000)
    248.     Next
    249.     LongLeftRotate = value
    250. End Function
    251. Private Function LongOverflowAdd(Val1 As Long, Val2 As Long) As Long
    252.     Dim lngHighWord As Long, lngLowWord As Long, lngOverflow As Long
    253.     lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&)
    254.     lngOverflow = lngLowWord \ 65536
    255.     lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + ((Val2 And &HFFFF0000) \ 65536) + lngOverflow) And &HFFFF&
    256.     LongOverflowAdd = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
    257. End Function
    258. Private Function LongOverflowAdd4(Val1 As Long, Val2 As Long, val3 As Long, val4 As Long) As Long
    259.     Dim lngHighWord As Long, lngLowWord As Long, lngOverflow As Long
    260.     lngLowWord = (Val1 And &HFFFF&) + (Val2 And &HFFFF&) + (val3 And &HFFFF&) + (val4 And &HFFFF&)
    261.     lngOverflow = lngLowWord \ 65536
    262.     lngHighWord = (((Val1 And &HFFFF0000) \ 65536) + ((Val2 And &HFFFF0000) \ 65536) + ((val3 And &HFFFF0000) \ 65536) + ((val4 And &HFFFF0000) \ 65536) + lngOverflow) And &HFFFF&
    263.     LongOverflowAdd4 = UnsignedToLong((lngHighWord * 65536#) + (lngLowWord And &HFFFF&))
    264. End Function

    265. Private Function UnsignedToLong(value As Double) As Long
    266.     If value < 0 Or value >= OFFSET_4 Then Error 6
    267.     If value <= MAXINT_4 Then UnsignedToLong = value Else UnsignedToLong = value - OFFSET_4
    268. End Function
    269. Private Function LongToUnsigned(value As Long) As Double
    270.     If value < 0 Then LongToUnsigned = value + OFFSET_4 Else LongToUnsigned = value
    271. End Function
    复制代码

    [ 本帖最后由 野猫III 于 2006-7-31 15:16 编辑 ]

    Module1.rar

    2.97 KB, 下载次数: 2057, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-7-31 21:14:56 | 显示全部楼层
    下了以备将来做注册机用,谢谢
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2016-8-5 17:44
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2006-8-2 08:54:49 | 显示全部楼层
    好东西正需要,猫兄有其它的加密算法模板吗?
    PYG19周年生日快乐!
    wxh9833 该用户已被删除
    发表于 2006-8-2 11:49:20 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-1-26 16:18:26 | 显示全部楼层
    最近学VB,下来收藏啊~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-2-12 10:47:59 | 显示全部楼层
    谢谢分享/:good
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-29 23:21:04 | 显示全部楼层

    求助!

    多谢楼主了,我现在想实现这个功能:用MD5对固定字符(假设为abcd)以及Text1(假设输入1234)和Text2(假设输入opq)所组成的新字符串(即abcd1234opq)进行加密,并在Text3中显示出来,请问该如何写?我试过Text3.Text = MD5(abcdText1.TextText2.Text),可是提示出错了.
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-5-16 14:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2008-3-30 08:27:46 | 显示全部楼层
    原帖由 cbcbcbbbc 于 2008-3-29 23:21 发表
    多谢楼主了,我现在想实现这个功能:用MD5对固定字符(假设为abcd)以及Text1(假设输入1234)和Text2(假设输入opq)所组成的新字符串(即abcd1234opq)进行加密,并在Text3中显示出来,请问该如何写?我试过Te ...


    好久没有用VB了,Text3.Text = MD5("abcd"&Text1.Text&Text2.Text),不知道对吗
    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2016-4-27 17:19
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-5-24 01:42:34 | 显示全部楼层
    辛苦了!!学习下`~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 11:36
  • 签到天数: 265 天

    [LV.8]以坛为家I

    发表于 2009-7-6 19:13:56 | 显示全部楼层
    VB的MD5模块。。不错!支持个
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表