使用Crypto API運算CString的MD5/SHA1 Hash

  • 4007
  • 0
  • 2011-10-27

使用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