//输入内容的缓冲区 输出内容的缓冲区 输入内容的长度
BOOL MD5Digest(PBYTE csBuffer,LPTSTR csOutBuffer,DWORD dwLen)
{
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE bHash[0x7f];
DWORD dwHashLen= 32; // The MD5 algorithm always returns 16 bytes.
DWORD cbContent=dwLen;
BYTE* pbContent= new BYTE[dwLen];
memcpy(pbContent,csBuffer,dwLen);
if(CryptAcquireContext(&hCryptProv,
NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv,
CALG_MD5, // algorithm identifier definitions see: wincrypt.h
0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, cbContent, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
{
// Make a string version of the numeric digest value
for (int i = 0; i<dwHashLen; i++)
{
_stprintf(csOutBuffer, _T("%s%02x") ,csOutBuffer,bHash[i]);
}
}
else
return false;
}
else
return false;
}
else
return false;
}
else
return false;
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
// CString str;
// str.Format(_T("%s"),csOutBuffer);
// AfxMessageBox(str);
delete[] pbContent;
return TRUE;
}
字符"abc"的ANSI编码和unicode编码计算的MD5值是不同的!