VC 使用CryptoAPI计算Hash值:MD5, SHA

本文介绍了一个使用C++实现的计算文件Hash值的方法,包括MD5和SHA两种算法。该方法通过调用Windows Crypto API来完成Hash值的计算,并将结果转换为16进制字符串形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdafx.h"
#define _WIN32_WINNT 0x0400
#include 
<tchar.h>
#include 
<wincrypt.h>

// 计算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
// 
DWORD GetHash(CONST 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, 00&hHash)) 
  {
    dwReturn 
= GetLastError();
    CryptReleaseContext(hProv, 
0);
    
return dwReturn;
  }

  
if(!CryptHashData(hHash, pbData, dwDataLen, 0))
  {
    dwReturn 
= GetLastError();
    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 
0);
    
return dwReturn;
  }
  
  DWORD dwSize;
  DWORD dwLen 
= sizeof(dwSize);
  CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE
*)(&dwSize), &dwLen, 0);

  BYTE
* pHash = new BYTE[dwSize];
  dwLen 
= dwSize;
  CryptGetHashParam(hHash, HP_HASHVAL, pHash, 
&dwLen, 0);

  lstrcpy(pszHash, _T(
""));
  TCHAR szTemp[
3];
  
for (DWORD i = 0; i < dwLen; ++i)
  {
    
//wsprintf(szTemp, _T("%X%X"), pHash[i] >> 4, pHash[i] & 0xf);
    wsprintf(szTemp, "%02X", pHash[i]);
    lstrcat(pszHash, szTemp);
  }
  delete [] pHash;

  CryptDestroyHash(hHash);
  CryptReleaseContext(hProv, 
0);
  
return dwReturn;
}

//=======================================================
// Test
int HashTest()
{
  TCHAR szStr[
20= {0};
  TCHAR szHash[
41= {0};

  strcpy(szStr,
"测试MD5");
  GetHash((BYTE
*)szStr, strlen(szStr), CALG_MD5,szHash);
  MessageBox(NULL, szHash, szStr, MB_OK);

  strcpy(szStr,
"测试SHA");
  GetHash((BYTE
*)szStr, strlen(szStr),CALG_SHA,szHash);
  MessageBox(NULL, szHash, szStr, MB_OK);
  
return 0
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值