使用Crypto API运算CString的MD5/SHA1 Hash
应用在MFC程序下代码,在VS2008 SP1下编译通过。如果需要通用,改起来的成本也应该是不大的。
#include <wincrypt.h>
CString MD5(CString &inData)
{
CString outData;
//CSP指针
HCRYPTPROV hProv = 0;
//MD5 HASH
HCRYPTHASH hHash = 0;
BYTE bHash[32];
DWORD dwHashLen = 16; // The MD5 algorithm always returns 16 bytes.
DWORD cbContent = inData.GetLength();
BYTE* pbContent = (BYTE*)inData.GetBuffer(cbContent);
if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
return "";
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
return "";
if(!CryptHashData(hHash, pbContent, cbContent, 0))
return "";
if(!CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
return "";
CString tmp;
for (unsigned int i = 0; i < dwHashLen; i += 4)
{
tmp.Format("%02x%02x%02x%02x", bHash[i], bHash[i+1],bHash[i+2],bHash[i+3]);
outData += tmp;
}
if(hHash)
CryptDestroyHash(hHash);
if(hProv)
CryptReleaseContext(hProv, 0);
return outData;
}
CString SHA1(CString &inData)
{
CString outData;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
BYTE bHash[32];
DWORD dwHashLen = 20; // The SHA1 algorithm always returns 20 bytes.
DWORD cbContent = inData.GetLength();
BYTE* pbContent = (BYTE*)inData.GetBuffer(cbContent);
if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
return "";
if(!CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
return "";
if(!CryptHashData(hHash, pbContent, cbContent, 0))
return "";
if(!CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
return "";
CString tmp;
for (unsigned int i = 0; i < dwHashLen; i += 4)
{
tmp.Format("%02x%02x%02x%02x", bHash[i], bHash[i+1],bHash[i+2],bHash[i+3]);
outData += tmp;
}
if(hHash)
CryptDestroyHash(hHash);
if(hProv)
CryptReleaseContext(hProv, 0);
return outData;
}
------------------------------
文章的授權使用CC BY-ND2.5協議。凡是標示“轉載”的文章,均來源於網絡並儘可能標註作者。如果有侵犯您的權益,請及時聯繫刪除或者署名、授權。
Gtalk/Email: cmd4shell [at] gmail.com