文档介绍:踏雪无痕
VC中实现哈希Hash算法
分类: 技术摘录 2012-03-23 08:04 238人阅读评论(0) 收藏举报
    Hash函数我们可以自己用C来编写,但是如果在VC中就不必了,因为在VC中有实现hash算法的函数可以调用,
就是CryptAcquireContext函数,。下面是我在MFC中实现
的,因为想要结果输出到messagebox中,所以就在视类里定义和实现了GetHash函数来计算哈
希值。
首先是在View类的头文件中包含下列文件和内容:
#define _WIN32_WINNT 0x0400
#include <>
#include <>
。
然后我们在View类中定义GetHash函数,函数类型为DWORD类型,参数为:
GetHash(BYTE *pbData, DWORD dwDataLen, ALG_ID algId, LPTSTR pszHash)
先看一下这个函数几个参数的意义吧.
 // 计算Hash,成功返回0,失败返回GetLastError()
//  CONST BYTE *pbData, // 输入数据
//  DWORD dwDataLen,     // 输入数据字节长度
//  ALG_ID algId       // Hash 算法:CALG_MD5,CALG_SHA
//  LPTSTR pszHash,  // 输出16进制Hash字符串,MD5长度为32+1, SHA长度为40+1
    然后我们在View类中完成对GetHash函数的定义,如下:
DWORD CHash_testView::GetHash(BYTE *pbData, DWORD dwDataLen, ALG_ID algId, LPTSTR pszHash)
{
  DWORD dwReturn = 0;
  HCRYPTPROV hProv;
  if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
    return (dwReturn = GetLastError());
 
  HCRYPTHASH hHash;
  //Alg Id:CALG_MD5,CALG_SHA
  if(!CryptCreateHash(hProv, algId, 0, 0, &hHash))
  {
    dwReturn = GetLastError();
    CryptReleaseContext(hProv, 0);
    return dwReturn;
  }
 
  if(!CryptHashData(hHash, pbData, dwDataLen, 0))
  {
    dwReturn = GetLastError();
    CryptDestroyHash(hHash);
1
CryptDestroyHash(