首页 > 编程语言 >VC中实现哈希Hash算法

VC中实现哈希Hash算法

时间:2023-04-28 17:41:37浏览次数:46  
标签:VC Hash hHash 哈希 szStr DWORD BYTE CALG


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

    

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

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

     

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,

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


   

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);


 

VC中实现哈希Hash算法_byte_02


VC中实现哈希Hash算法_byte_03


VC中实现哈希Hash算法_算法_04

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

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

标签:VC,Hash,hHash,哈希,szStr,DWORD,BYTE,CALG
From: https://blog.51cto.com/u_130277/6235015

相关文章

  • VC下Base64编码及解码程序源代码
    //Base64.h:interfacefortheCBase64class.////#if!defined(AFX_BASE64_H__8D85F486_CD10_4A0A_A689_2299C9DE52CB__INCLUDED_)#defineAFX_BASE64_H__8D85F486_CD10_4A0A_A689_2299C9DE52CB__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_V......
  • Shodan的http.favicon.hash语法详解与使用技巧
    本文转载自:https://www.cnblogs.com/miaodaren/p/9177379.html在Shodan搜索中有一个关于网站icon图标的搜索语法,http.favicon.hash,我们可以使用这个语法来搜索出使用了同一icon图标的网站,不知道怎么用的朋友请参考我上一篇文章。通过上一篇文章我们了解到,由于ha......
  • Spring 3.x MVC 入门1 -- 图解MVC整体流程
    Springmvc的生命周期开始使用springmvc之前,我们必须需要了解下SPRINGMVC的流程,如下图: 在看下图之前的一些说明:(下面介绍的HandlerMapping,HandlerAdapter,HandlerExceptionResovler,ViewResolver都有个order属性,因为这些接口每一个都可以注册多个实现,order代表他们的执行顺序......
  • 文件上传下载-SpringMvc
    进行文件上传时,表单需要做的准备:1.请求方式为POST:<formaction=”uploadServlet”method=”post”/>2.使用file的表单域:<inputtype=”file”name=”file”/>3.使用multipart/form-data的请求编码方式:<formaction=”uploadServlet”type=”file”name=”file”metho......
  • 【哈希表】LeetCode 895. 最大频率栈
    题目链接895.最大频率栈思路很容易想到使用map:valToFreq来记录每个值出现的频率,这是没问题的,但关键是如何通过频率寻找到应该返回的数。这时候我想到再加一个map:freqToVal来记录每个频率中出现的数字,为了符合题目返回最接近栈顶的元素的要求,freqToVal的键值对类型选择<......
  • List与HashMap区别,key,value,感谢火龙果,dgqbcht,awusoft帮助
    首先要感谢不想要妮称,dgqbcht,awusoft友情帮助Map是一个映射,是key-value值对.Map在java1.0以后进行了修改,使其能够与普通的集合相融.在Map的内部定义了内部接口Entry,主要就是要讲key和value以集合(Set)的形式来体现.List是集合的一个分支,是一个接口.List中的元素有顺序(输......
  • Redis - 存储对象信息是用 Hash 还是 String
    日常工作中存储对象信息时,一般有两种做法,一种是用String存储,另一种是Hash 存储。既然两种数据结构都可以存储结构体信息。到底哪种更加合适呢?String和Hash占用内存的比较 首先用代码先插入10000条数据,然后用可视化工具来看看内存的占用情况。constRedis=require("......
  • [ABC213E] Stronger Takahashi
    2023-01-17题目传送门翻译难度&重要性(1~10):4题目来源AtCoder题目算法bfs解题思路首先,这道题的问题是从家到鱼市摧毁障碍物的最少次数。我们很容易想到用广搜的方法来做。因为\(2\leH,W\le500\),数据很小,理论上我们可以对于每个障碍物都进行一次爆破。虽然爆破的范......
  • 【哈希表】LeetCode 767. 重构字符串
    题目链接767.重构字符串思路先用哈希表统计出出现次数最多的字符,如果这个次数大于一半,说明这个字符总会挨在一起,直接返回""。如果不超过一半,则先把字符填在偶数位置(先填出现次数最多的字符),偶数位置填满了再填奇数位置。代码classSolution{publicStringreorganize......
  • [转]前端传嵌套对象参数给spring mvc
    在使用springmvc开发web应用时,感觉springmvc的controller方法能自动将参数注入到方法的参数对象中,极大的方便了开发。但是,在遇到有嵌套对象的时候,比如订单对象有个属性是用户对象,就不好处理了。一种情况是,传递的参数都是作为post方法的请求体,我们可以用RequestBody注解。但是当条......