VC使用Windows系统DLL实现MD5加密

2012-02-12 19:03:04|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 加密/解密, MFC|来源:唯设编程网

使用.NET或者Java编程,系统提供了方便的API可以实现字符串和文件的加密/解密工作,以保证数据的安全,但是在VC编程时,没有现成的API实现这些功能,网上很多方法都是自己编写代码实现DES、MD5等加密算法,种类繁多,良莠不齐,给实际使用带来了诸多不便。
本文试图采用最简单的方法实现高可靠性、正确性的VC加密实现,着重讨论了MD5算法对字符串进行加密,该方法使用了Window系统的动态链接库advapi32.dll,使用简单,正确性、可靠性和Window系统密码一致。

advapi32.dll提供以下MD5函数:
        MD5Init(&ctx);
       MD5Update(&ctx, buf, len);
       MD5Final(&ctx);

下面分三步讨论该方法实现MD5加密的具体方法:

第一步:定义MD5加密使用的数据结构和函数指针

/* Data structure for
* MD5 (Message-Digest) computation
*/
typedef struct {
    /* number of _bits_ handled mod 2^64 */
    ULONG i[2];
    /* scratch buffer */                        
    ULONG buf[4];    
    /* input buffer */                  
    unsigned char in[64]; 
    /* actual digest after MD5Final call */             
    unsigned char digest[16];           
} MD5_CTX;
 
#define MD5DIGESTLEN 16
#define PROTO_LIST(list)    list
/*
* MTS: Each of these assumes MD5_CTX
* is locked against simultaneous use.
*/
typedef void (WINAPI* PMD5Init) PROTO_LIST ((MD5_CTX *));
typedef void (WINAPI* PMD5Update) PROTO_LIST ((MD5_CTX *
                                              , const unsigned char *
                                              , unsigned int));
typedef void (WINAPI* PMD5Final )PROTO_LIST ((MD5_CTX *));

第二步:定义MD5加密的类

1.h文件:
class CMD5Encrypt
{
public:
    CMD5Encrypt();
    virtual ~CMD5Encrypt();
    const char * md5(const char * str);
    const char * Hex2ASC(const BYTE *Hex, int Len);
    PMD5Init MD5Init;
    PMD5Update MD5Update;
    PMD5Final MD5Final;
};
2.cpp文件:
CMD5Encrypt::CMD5Encrypt()
{
 
}
 
CMD5Encrypt::~CMD5Encrypt()
{
 
}
//将BYTE数组转换成字符串
const char * CMD5Encrypt::Hex2ASC(const BYTE *Hex, int Len)
{
    static char ASC[4096 * 2];
    int i;
 
    for (i = 0; i < Len; i++)
    {
        ASC[i*2] = "0123456789ABCDEF"[Hex[i] >> 4];
        ASC[i*2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
    }
    ASC[i*2] = '';
    return ASC;
}
//32位进行MD5加密
const char * CMD5Encrypt::md5(const char * str)
{
    MD5_CTX ctx;//MD5运算使用的数据结构
    const unsigned char * buf
        = reinterpret_cast<const unsigned char *>(str);
    //判断加密字符串的长度
    int len = strlen(str);
    HINSTANCE hDLL;
    if ((hDLL = LoadLibrary(_T("advapi32.dll"))) > 0)
    {
        MD5Init = (PMD5Init)GetProcAddress(hDLL,"MD5Init");
        MD5Update = (PMD5Update)GetProcAddress(hDLL,"MD5Update");
        MD5Final = (PMD5Final)GetProcAddress(hDLL,"MD5Final");
 
        MD5Init(&ctx);
        MD5Update(&ctx, buf, len);
        MD5Final(&ctx);
    }
    return Hex2ASC(ctx.digest, 16);
}

        备注:记得在.h文件增加第一步定义的数据结构的引用。

第三步:调用第二步定义的MD5加密类实现数据加密

void CMD5Dlg::OnBnClickedMd5()
{  
    //获取待加密的字符串
    CString str;
    GetDlgItem(IDC_EDIT3)->GetWindowTextW(str);
    //MD5加密
    CMD5Encrypt md5;
    USES_CONVERSION;
    const char* res=md5.md5(T2A(str));
    //显示结果
    GetDlgItem(IDC_EDIT4)->SetWindowTextW(A2T(res));
}

至此,VC对字符串进行MD5加密遍完成了,实现效果如下:

VC对字符串进行MD5加密
发表评论0条 】
网友评论(共?条评论)..
VC使用Windows系统DLL实现MD5加密