今天因为要做个东西要用到md5算法。就在网上找vb版的md5加密代码。结果出来的都是一大串一大串的代码,基本上都是用vb代码去实现md5算法。
由于代码过长于长,看到就心烦(其实不用看,复制过去就可以用)。由于本身过于追求简洁代码,所以决定放弃这些超长代码。
记得曾经听说windows有未公开的md5算法的API。于是又在网上搜了一下。结果还真找到了这些API:MD5Init,MD5Update,MD5Final。可惜找了很久都没见有VB的版的代码,都是VC的代码。只好自己抄他们的版,改成VB版就OK了。哈哈,省心啊~~~
三个函数原型:
void WINAPI MD5Init( MD5_CTX *context);
void WINAPI MD5Update(MD5_CTX* lpCtx, const void * lpBuf, unsigned int nLen);
void WINAPI MD5Final(MD5_CTX* lpCtx);
一个结构体原型:
typedef struct {
ULONG i[2];
ULONG buf[4];
unsigned char in[64];
unsigned char digest[16];
} MD5_CTX;
转换成VB API声明就是:
Declare Sub MD5Init Lib "ADVAPI32.dll" (ByRef lpMD5Type As MD5_CTX)
Declare Sub MD5Update Lib "ADVAPI32.dll" (ByRef lpMD5Type As MD5_CTX, ByRef lpBuf As Byte, ByVal nLen As Integer)
Declare Sub MD5Final Lib "ADVAPI32.dll" (ByRef lpMD5Type As MD5_CTX)
Type MD5_CTX
num(1) As Long
buf(3) As Long
inputBuf(63) As Byte
outputBuf(15) As Byte
End Type
这样四个东东,转换完就OK了~有些VC代码说这些API是在Cryptdll.dll中,我当于转换时看的是在ADVAPI32.dll中。后来测试,两个Dll都可以用。没有认真是分析他们谁是真身。不罗嗦了,再写一小段VB函数就可以完成md5运算了。
Public Function md5(vData As String)
Dim md5Stur As MD5_CTX
Dim bin() As Byte, nLen As Long
MD5Init md5Stur
bin = StrConv(vData, vbFromUnicode)
nLen = UBound(bin) + 1
MD5Update md5Stur, bin(0), nLen
MD5Final md5Stur
Dim i As Long, t As Byte
Dim ret As String
For i = 0 To 15
t = md5Stur.outputBuf(i)
If (t < 16) Then
ret = ret & "0" & Hex(t)
Else
ret = ret & Hex(t)
End If
Next
md5 = ret
End Function
经常测试,对中文做MD5运算都没问题。字符就不用说啦。哈哈