【源码】VB6.0 调用Windows系统的API计算MD5码,该怎么解决

【源码】VB6.0 调用Windows系统的API计算MD5码
前几天,有网友发贴,求一个非对称加密的VB算法代码。
  当时自然就想到了RSA加密算法。本想在系统中找RSA加密算法的API,却没找到。
  在网上搜索算法代码,几乎就是找到一些千篇一律的“理论介绍”,C/C++代码倒是有一些,但我还没有试验效
果如何。费了很大的劲翻出的VB代码,一试,结果根本不行……

  RSA的没什么收获,但却意外的找到了MD5的函数库。

  当然,你也许会说,MD5的算法代码,网上一堆堆的,多的是…………
  这个我也不否认。网上一出来点好东西,往往就会你抄我、他抄你的,不管看没看懂、不管有没有什么问题,只
管 Copy & Paste 。内容千篇一律,有的还说明“出处”,有的干脆就“据为已出”!如果“源头”有什么错误,
后面的基本都是跟着错的。
  对此放下不谈,再说下这些源码问题。这些MD5计算的源码,不管是C/C++的也好,还是VB的也好,或者是其它语
言的,都是把具体计算过程,用代码实现了的。那个代码模块,无论他是否进行过“封装”,面临的也是一大堆的代
码、十几个甚至近20个的函数。VB6.0的代码,就拿网上比较流行的版本来说吧,整个模块约12K代码(什么注释也不
要写),全部函数约20个。这里面不少的函数就几行代码而已,但有几个主要过程的代码是极长的。如果把这个模块
加入自己的工程代码中,在自己的工程代码编写或维护过程中,万一不小心把哪改动了一点,或不小心删除了某行,
那问题就大了,要找起来那可是累死人(当然也可以用备份的模块来全部还原)。再者,在VB6中,不支持移位运算,
整数是带符号的,运算中还可能有“溢出”问题。移位运算是用算术运算来“模拟”的,效率自然低了很多。 还有
就是算法过程,基本上就是第一个人出来之后,代码过程就是那样了,代码质量基本就是取决于“第一人”的编写水
平,即使这里面有需要优化的地方,也基本上没人去改它。一大堆的代码,写得很不规范,看着都晕……

  相比之下,我这个用系统API来计算MD5码的模块,就比较有优越性了。
  ① 代码量少,维护容易。我这个模块,如果去掉全部注释,不足3KB了。
      (并且基本上没什么“优化”的必要了,我自认为写得还不错! ^_^)
  ② 不用担心算法出错,或不能使用。
    ⑴微软的Windows系统自己在用,这个无论哪个版本的Windows系统,都会有这个库的。
    ⑵具体的核心计算过程是系统API实现的,不用担心有错:其一,他不能有错,系统中有那么多的证书,需
  要进行MD5验证的,算法有错会出问题。其二,那些证书,不少是经过权威机构“公证”过的,你想下,微软的
  这个算法库,它能够有错吗?它敢有错吗???

  好了,别的不扯了,上代码:
(下面这段是在一个标准模块中的代码)
'        ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
'        ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'        :::::                                              :::::
'        :::::         使用 Windows API 来计算 MD5          :::::
'        :::::                                              :::::
'        ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'        ````````````````````````````````````````````````````````
'
'  * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
'           -=  函 数 清 单  =-
'     GetMD5Text        获取上次计算的MD5码文本
'     MD5Bytes          计算一个字节数组的MD5码
'     MD5String         计算一个字符串(ANSI编码)的MD5码
'     MD5File           计算一个文件的MD5码
'  * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
'
Option Explicit

' ==============================
' ≡     自定义 数据类型      ≡
' ==============================
Type MD5_CTX
      dwNUMa      As Long
      dwNUMb      As Long
      Buffer(15)  As Byte
      cIN(63)     As Byte
      cDig(15)    As Byte
End Type

' ==============================
' ≡     API 函 数 声 明      ≡
' ==============================
Private Declare Sub MD5Init Lib "advapi32" (lpContext As MD5_CTX)
Private Declare Sub MD5Final Lib "advapi32" (lpContext As MD5_CTX)
Private Declare Sub MD5Update Lib "advapi32" (lpContext As MD5_CTX, _
                           ByRef lpBuffer As Any, ByVal BufSize As Long)

Private stcContext   As MD5_CTX


' ==============================
' ≡     通用 函数 & 过程     ≡
' ==============================
' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
' 功    能:计算一个字符串(ANSI编码)的MD5码
' 入口参数:
'  strText     字符串文本
' 返回参数:   MD5码 (16字节的Byte数组)