Shotgun' blog

欢迎进入Shogtun的blog。

« 无意中的发现无题 »

vb6最简单的MD5加密运算

今天因为要做个东西要用到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运算都没问题。字符就不用说啦。哈哈

  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2010 www.yangtuotuo.com . All Rights Reserved.