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] = '