使用windows的动态链接库advapi32.dll.
此动态链接库提供以下md5函数:
MD5Init(&ctx);
MD5Update(&ctx, buf, len);
MD5Final(&ctx);
具体使用如下
新建文件 common.h
#include <windows.h> /* Data structure for MD5 (Message-Digest) computation */ typedef struct { ULONG i[2]; /* number of _bits_ handled mod 2^64 */ ULONG buf[4]; /* scratch buffer */ unsigned char in[64]; /* input buffer */ unsigned char digest[16]; /* actual digest after MD5Final call */ } 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 *)); //end globle define class Ccommon { public: Ccommon(); virtual ~Ccommon(); const char * md5(const char * str); const char * Hex2ASC(const BYTE *Hex, int Len); PMD5Init MD5Init; PMD5Update MD5Update; PMD5Final MD5Final; };
新建文件 common.cpp
#include "stdafx.h" #include "common.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// Ccommon::Ccommon() { } Ccommon::~Ccommon() { } const char * Ccommon::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] = 0; return ASC; } const char * Ccommon::md5(const char * str) { MD5_CTX ctx; const unsigned char * buf = reinterpret_cast<const unsigned char *>(str); int len = strlen(str); HINSTANCE hDLL; if ( (hDLL = LoadLibraryA("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); }
调用方法
//引入头文件 #include "common.h" //声明类 Ccommon md5Class; name=md5Class.md5(name);
注意事项
MD5加密后的大小写是由 Hex2ASC函数里
ASC[i * 2] = "0123456789abcdef"[Hex[i] >> 4]; ASC[i * 2 + 1] = "0123456789abcdef"[Hex[i] & 0x0F];这两句代码控制的 这里我改为了小写 默认应该是大写 看大家需求而定
如果需要大写改为:
ASC[i * 2] = "0123456789ABCDEF"[Hex[i] >> 4]; ASC[i * 2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];