【源码】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验证的,算法有错会出问题。其二,那些证书,不少是经过权威机构“公证”过的,你想下,微软的
这个算法库,它能够有错吗?它敢有错吗???
好了,别的不扯了,上代码:
(下面这段是在一个标准模块中的代码)
前几天,有网友发贴,求一个非对称加密的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数组)