VC中实现哈希Hash算法

原创 2012年03月23日 08:04:25

    Hash函数我们可以自己用C来编写,但是如果在VC中就不必了,因为在VC中有实现hash算法的 函数可以调用,就是CryptAcquireContext函数,这个函数的定义在wincrypt.h头文件中。下面是我在MFC中实现的,因为想要结果输出到messagebox中,所以就在视类里定义和实现了GetHash函数来计算哈希值。

      首先是在View类的头文件中包含下列文件和内容:

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

       其中我们用到的CryptAcquireContex函数就在wincrypy.h中定义了。

       然后我们在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);
    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;


}
    有了这个GetHash函数之后,我们就可以通过调用它而计算一些字符串或者Char类型的数据的hash值了。像我们经常在网上见得一些hash校验器也可以比较容易的实现了,如下面的:

VC中实现哈希Hash算法

   这里为了简单的验证一下,我们就测试一个字符串,然后它的hash值我们用一个messagebox输出,看看结果,我们测试的字符串是“Hello,Hash!你好,哈希!”其中没有空格,标点符号为英文状态。我们在OnDraw函数中加入测试代码:
  TCHAR szStr[20] = {0};
  TCHAR szHash[41] = {0};
 
  strcpy(szStr,"Hello,Hash!你好,哈希!");
  GetHash((BYTE*)szStr, strlen(szStr), CALG_MD5,szHash);
  MessageBox(szHash,MB_OK);

  结果如下:

  VC中实现哈希Hash算法

  然后我们用上面的hash计算工具算一下是不是对。

 VC中实现哈希Hash算法

  可以看出结果相同,证明对了。当然用python实现也是相当的简单,我们看一下:

VC中实现哈希Hash算法

  当然上面都是实现的MD5算法,如果想用SHA算法,可以修改调用GetHash((BYTE*)szStr, strlen(szStr), CALG_MD5,szHash);的第三个参数为CALG_SHA

  有兴趣的就可以自己编写一个hash计算工具了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

什么是哈希Hash算法

ReVanTis,程序猿;游戏爱好者;图像处理入门中;吃货; 许奋旭、御宅暴君、马迅 等人赞同 谐妖。 通俗点讲吧 哈希算法是用来解决数据和数据之间对应关系的一种算法。它的...

有关hash算法 及 哈希表的应用

前言:当被问到请举个能体现HASH算法的例子时,脑海中瞬间闪过无数个:what ! 哈希算法? 我只隐约记得hash函数、解决冲突的方法,从何蹦出来个hash算法呢?好吧,肯定是由于自己的才疏学浅、理...

libmemcached一致性hash算法详解(1)----php-memcached客户端一致性哈希与crc算法共用产生的bug分析

author: selfimpr blog: http://blog.csdn.net/lgg201 mail: lgg860911@yahoo.com.cn 事情的起源, 是同事使用下...
  • lgg201
  • lgg201
  • 2011-10-09 17:09
  • 7674

VC++网络安全编程范例(7)-实现哈希摘要算法

哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不...

一种hash算法的实现

hash算法 (hashmap 实现原理)

Hash ,一般翻译做“ 散列” ,也有直接音译为“ 哈希” 的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)