请选择 进入手机版 | 继续访问电脑版

玩酷之家

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 309|回复: 0

调用API计算MD5码

[复制链接]

92

主题

97

帖子

361

积分

中级会员

Rank: 3Rank: 3

积分
361
发表于 2018-9-9 19:52:21 | 显示全部楼层 |阅读模式

  1. '模块代码
  2. '        ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
  3. '        ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4. '        :::::                                              :::::
  5. '        :::::         使用 Windows API 来计算 MD5          :::::
  6. '        :::::                                              :::::
  7. '        ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  8. '        ````````````````````````````````````````````````````````
  9. '
  10. '  * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
  11. '           -=  函 数 清 单  =-
  12. '     GetMD5Text        获取上次计算的MD5码文本
  13. '     MD5Bytes          计算一个字节数组的MD5码
  14. '     MD5String         计算一个字符串(ANSI编码)的MD5码
  15. '     MD5File           计算一个文件的MD5码
  16. '  * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
  17. '
  18. Option Explicit

  19. ' ==============================
  20. ' ≡     自定义 数据类型      ≡
  21. ' ==============================
  22. Type MD5_CTX
  23.       dwNUMa      As Long
  24.       dwNUMb      As Long
  25.       Buffer(15)  As Byte
  26.       cIN(63)     As Byte
  27.       cDig(15)    As Byte
  28. End Type

  29. ' ==============================
  30. ' ≡     API 函 数 声 明      ≡
  31. ' ==============================
  32. Private Declare Sub MD5Init Lib "advapi32" (lpContext As MD5_CTX)
  33. Private Declare Sub MD5Final Lib "advapi32" (lpContext As MD5_CTX)
  34. Private Declare Sub MD5Update Lib "advapi32" (lpContext As MD5_CTX, _
  35.                            ByRef lpBuffer As Any, ByVal BufSize As Long)

  36. Private stcContext   As MD5_CTX


  37. ' ==============================
  38. ' ≡     通用 函数 & 过程     ≡
  39. ' ==============================
  40. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  41. ' 功    能:计算一个字符串(ANSI编码)的MD5码
  42. ' 入口参数:
  43. '  strText     字符串文本
  44. ' 返回参数:   MD5码 (16字节的Byte数组)
  45. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  46. Public Function MD5String(strText As String) As Byte()
  47.       Dim aBuffer()     As Byte

  48.    Call MD5Init(stcContext)
  49.    If (Len(strText) > 0) Then
  50.       aBuffer = StrConv(strText, vbFromUnicode)
  51.       Call MD5Update(stcContext, aBuffer(0), UBound(aBuffer) + 1)
  52.    Else
  53.       Call MD5Update(stcContext, 0, 0)
  54.    End If
  55.    Call MD5Final(stcContext)
  56.    MD5String = stcContext.cDig
  57. End Function

  58. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  59. ' 功    能:计算一个字节流的MD5码
  60. ' 入口参数:
  61. '  Buffer      Byte数组
  62. '  size        长度(可选,默认计算整个长度)
  63. ' 返回参数:   MD5码 (16字节的Byte数组)
  64. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  65. Public Function MD5Bytes(Buffer() As Byte, _
  66.                         Optional ByVal size As Long = -1) As Byte()
  67.       Dim U As Long, pBase   As Long

  68.    pBase = LBound(Buffer)
  69.    U = UBound(Buffer) - pBase
  70.    If (-1 = size) Then size = U + 1
  71.    Call MD5Init(stcContext)
  72.    If (-1 = U) Then
  73.       Call MD5Update(stcContext, 0, 0)
  74.    Else
  75.       Call MD5Update(stcContext, Buffer(pBase), size)
  76.    End If
  77.    Call MD5Final(stcContext)
  78.    MD5Bytes = stcContext.cDig
  79. End Function

  80. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  81. ' 功    能:计算一个文件的MD5码
  82. ' 入口参数:
  83. '  FileName    磁盘文件名(完整路径)
  84. ' 返回参数:   MD5码 (16字节的Byte数组)
  85. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  86. Public Function MD5File(ByVal FileName As String) As Byte()
  87.    Const BUFFERSIZE  As Long = 1024& * 512      ' 缓冲区 512KB
  88.       Dim DataBuff() As Byte
  89.       Dim lFileSize  As Long
  90.       Dim iFn        As Long

  91.    On Error GoTo E_Handle_MD5
  92.    If (Len(Dir$(FileName)) = 0) Then Err.Raise 5      '文件不存在
  93.    ReDim DataBuff(BUFFERSIZE - 1)
  94.    iFn = FreeFile()
  95.    Open FileName For Binary As #iFn
  96.    lFileSize = LOF(iFn)
  97.    Call MD5Init(stcContext)
  98.    If (lFileSize = 0) Then
  99.       Call MD5Update(stcContext, 0, 0)
  100.    Else
  101.       Do While (lFileSize > 0)
  102.          Get iFn, , DataBuff
  103.          If (lFileSize > BUFFERSIZE) Then
  104.             Call MD5Update(stcContext, DataBuff(0), BUFFERSIZE)
  105.          Else
  106.             Call MD5Update(stcContext, DataBuff(0), lFileSize)
  107.          End If
  108.          lFileSize = lFileSize - BUFFERSIZE
  109.       Loop
  110.    End If
  111.    Close iFn
  112.    Call MD5Final(stcContext)
  113. E_Handle_MD5:
  114.    MD5File = stcContext.cDig
  115. End Function

  116. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  117. ' 功    能:获取上次计算的MD5码文本
  118. ' 入口参数:   < 无 >
  119. ' 返回参数:   MD5码文本字符串(没有MD5数据 返回空串)
  120. ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  121. Public Function GetMD5Text() As String
  122.       Dim sResult As String, i&
  123.    If (stcContext.dwNUMa = 0) Then
  124.       sResult = vbNullString
  125.    Else
  126.       sResult = Space$(32)
  127.       For i = 0 To 15
  128.          Mid$(sResult, i + i + 1) = Right$("0" & Hex$(stcContext.cDig(i)), 2)
  129.       Next
  130.    End If
  131.    GetMD5Text = sResult       ' LCase$(sResult) '字母小写
  132. End Function
复制代码


  1. ‘窗体代码
  2. Option Explicit

  3. Private Sub Command1_Click()
  4.    Dim aBuffer() As Byte
  5.    
  6.    Cls
  7.    '字符串MD5
  8.    Print "MD5("""") ="
  9.    Call MD5String("")
  10.    Print GetMD5Text() & vbLf
  11.    Print "MD5(""abc"") ="
  12.    Call MD5String("abc")
  13.    Print GetMD5Text() & vbLf
  14.    Print "MD5(""中秋快乐!"") ="
  15.    Call MD5String("中秋快乐!")
  16.    Print GetMD5Text() & vbLf
  17.    '字节数组MD5
  18.    Print "字节数组 MD5(""abc"") ="
  19.    Call MD5Bytes(StrConv("abc", vbFromUnicode))
  20.    Print GetMD5Text() & vbLf
  21.    
  22.    Print "字节数组 MD5(""中秋快乐!"") ="
  23.    Call MD5Bytes(StrConv("中秋快乐!", vbFromUnicode))
  24.    Print GetMD5Text() & vbLf
  25.    '文件MD5
  26.    Print "文件:Explorer.exe MD5 = "
  27.    Call MD5File("c:\windows\explorer.exe")
  28.    Print GetMD5Text(); vbLf
  29. End Sub
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|玩酷之家 ( 鄂ICP备14012049号-1 )

GMT+8, 2018-12-12 16:13 , Processed in 0.157503 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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