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加密的类
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; };
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] = '