yehao's Blog

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

http://www.vcsos.com/article/pageSource/120212/20120212070304.shtml 
使用.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加密使用的数据结构和函数指针 
 1 /* Data structure for
 2 * MD5 (Message-Digest) computation
 3 */
 4 typedef struct {
 5     /* number of _bits_ handled mod 2^64 */
 6     ULONG i[2];
 7     /* scratch buffer */                       
 8     ULONG buf[4];    
 9     /* input buffer */                 
10     unsigned char in[64]; 
11     /* actual digest after MD5Final call */            
12     unsigned char digest[16];           
13 } MD5_CTX;
14   
15 #define MD5DIGESTLEN 16
16 #define PROTO_LIST(list)    list
17 /*
18 * MTS: Each of these assumes MD5_CTX
19 * is locked against simultaneous use.
20 */
21 typedef void (WINAPI* PMD5Init) PROTO_LIST ((MD5_CTX *));
22 typedef void (WINAPI* PMD5Update) PROTO_LIST ((MD5_CTX *
23                                               , const unsigned char *
24                                               , unsigned int));
25 typedef void (WINAPI* PMD5Final )PROTO_LIST ((MD5_CTX *));

第二步:定义MD5加密的类
1.h文件: 

 1 class CMD5Encrypt
 2 {
 3 public:
 4     CMD5Encrypt();
 5     virtual ~CMD5Encrypt();
 6     const char * md5(const char * str);
 7     const char * Hex2ASC(const BYTE *Hex, int Len);
 8     PMD5Init MD5Init;
 9     PMD5Update MD5Update;
10     PMD5Final MD5Final;
11 };
2.cpp文件: 
 1 CMD5Encrypt::CMD5Encrypt()
 2 {
 3   
 4 }
 5   
 6 CMD5Encrypt::~CMD5Encrypt()
 7 {
 8   
 9 }
10 //将BYTE数组转换成字符串
11 const char * CMD5Encrypt::Hex2ASC(const BYTE *Hex, int Len)
12 {
13     static char ASC[4096 * 2];
14     int i;
15   
16     for (i = 0; i < Len; i++)
17     {
18         ASC[i*2] = "0123456789ABCDEF"[Hex[i] >> 4];
19         ASC[i*2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
20     }
21     ASC[i*2] = '\0';
22     return ASC;
23 }
24 //32位进行MD5加密
25 const char * CMD5Encrypt::md5(const char * str)
26 {
27     MD5_CTX ctx;//MD5运算使用的数据结构
28     const unsigned char * buf
29         = reinterpret_cast<const unsigned char *>(str);
30     //判断加密字符串的长度
31     int len = strlen(str);
32     HINSTANCE hDLL;
33     if ((hDLL = LoadLibrary(_T("advapi32.dll"))) > 0)
34     {
35         MD5Init = (PMD5Init)GetProcAddress(hDLL,"MD5Init");
36         MD5Update = (PMD5Update)GetProcAddress(hDLL,"MD5Update");
37         MD5Final = (PMD5Final)GetProcAddress(hDLL,"MD5Final");
38   
39         MD5Init(&ctx);
40         MD5Update(&ctx, buf, len);
41         MD5Final(&ctx);
42     }
43     return Hex2ASC(ctx.digest, 16);
44 }

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

第三步:调用第二步定义的MD5加密类实现数据加密 
 1 void CMD5Dlg::OnBnClickedMd5()
 2 {  
 3     //获取待加密的字符串
 4     CString str;
 5     GetDlgItem(IDC_EDIT3)->GetWindowTextW(str);
 6     //MD5加密
 7     CMD5Encrypt md5;
 8     USES_CONVERSION;
 9     const char* res=md5.md5(T2A(str));
10     //显示结果
11     GetDlgItem(IDC_EDIT4)->SetWindowTextW(A2T(res));
12 }

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

posted on 2012-09-10 22:24 厚积薄发 阅读(1253) 评论(0)  编辑 收藏 引用 所属分类: Windows编程


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

常用链接

留言簿

随笔分类

文章分类

文章档案

搜索

最新评论