// md5.h
#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 = ;
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, , , &hHash))
{
dwReturn = GetLastError();
CryptReleaseContext(hProv, );
return dwReturn;
} if(!CryptHashData(hHash, pbData, dwDataLen, ))
{
dwReturn = GetLastError();
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, );
return dwReturn;
} DWORD dwSize;
DWORD dwLen = sizeof(dwSize);
CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)(&dwSize), &dwLen, ); BYTE* pHash = new BYTE[dwSize];
dwLen = dwSize;
CryptGetHashParam(hHash, HP_HASHVAL, pHash, &dwLen, ); lstrcpy(pszHash, _T(""));
TCHAR szTemp[];
for (DWORD i = ; i < dwLen; ++i)
{
//wsprintf(szTemp, _T("%X%X"), pHash[i] >> 4, pHash[i] & 0xf);
wsprintf(szTemp, _T("%02X"), pHash[i]);
lstrcat(pszHash, szTemp);
}
delete []pHash; CryptDestroyHash(hHash);
CryptReleaseContext(hProv, ); return dwReturn;
} BOOL GetFileMd5(LPCTSTR lpFileName, LPTSTR pszHash)
{
HANDLE hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL);
if (hFile == INVALID_HANDLE_VALUE) //如果CreateFile调用失败
{
//提示CreateFile调用失败,并输出错误号。visual studio中可在“工具”>“错误查找”中利用错误号得到错误信息。
CloseHandle(hFile);
return FALSE;
} DWORD dwFileSize = GetFileSize(hFile,); //获取文件的大小
if (dwFileSize == 0xFFFFFFFF) //如果获取文件大小失败
{
return FALSE;
} BYTE* lpReadFileBuffer = new BYTE[dwFileSize];
DWORD lpReadNumberOfBytes;
if (ReadFile(hFile,lpReadFileBuffer,dwFileSize,&lpReadNumberOfBytes,NULL) == ) //读取文件
{
return FALSE;
}
if (GetHash(lpReadFileBuffer, dwFileSize, CALG_MD5, pszHash))
{
return FALSE;
} delete[]lpReadFileBuffer;
CloseHandle(hFile); //关闭文件句柄 return TRUE;
} BOOL GetStringMd5(TCHAR* pszStr, LPTSTR pszHash)
{
if (GetHash((BYTE*)pszStr, _tcslen(pszStr), CALG_MD5, pszHash))
{
return FALSE;
} return TRUE;
}
#include <windows.h>
#include "stdio.h"
#include "md5.h"
#include <locale.h> int main()
{
// 测试MD5
TCHAR szMD5[] = {};
setlocale(LC_ALL, "chs"); // 测试字符串MD5
TCHAR szStr[_MAX_FNAME] = _T("这是一段字符串");
GetStringMd5(szStr, szMD5);
wprintf(L"字符串: %s 的MD5值为: %s\n", szStr, szMD5); // 测试文件MD5
TCHAR szFile[MAX_PATH] = _T("D:\\temp\\settings.db");
GetFileMd5(szFile, szMD5);
wprintf(L"文件: %s 的MD5值为: %s\n", szFile, szMD5);
}

VC使用CryptoAPI计算MD5的更多相关文章

  1. 最简单的计算MD5方法

    原来写过一个计算MD5的程序,是用了一个叫MD5.pas的单元,使用起来还算简单,但还有更简单的办法,安装了indy就会有IdHashMessageDigest单元(delphi 7默认安装indy) ...

  2. 用python计算md5,sha1,crc32

    Linux下计算md5sum,sha1sum,crc: 命令 输出 $md5sum hello f19dd746bc6ab0f0155808c388be8ff0  hello $sha1sum hel ...

  3. shell 批量计算MD5值

    #!/bin/sh #需要计算MD5文件列表 # list=`ls` list="file list" for file in $list do file1=`` echo &qu ...

  4. Linux快速计算MD5和Sha1命令

    Linux计算MD5和Sha1的命令 MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法 ...

  5. postman使用pre-request script计算md5

    接口加了验签逻辑,具体是md5(salt+时间戳).被某君吐槽说测试不方便啊能不能先关掉.其实没有必要打开又关闭验签功能,postman的pre-request script功能完全可以模拟客户端加密 ...

  6. Windows下计算md5值

    目录 Windows下计算md5值 1.linux 下计算md5值 2.Windows下计算md5值 Windows下计算md5值 1.linux 下计算md5值 [root@master yl]# ...

  7. 不要对md5file.read()计算md5值

    最近遇到的一个问题,我使用以下代码对备份文件计算MD5值: # md5file=open("%s" % outputpath, 'rb') # md5=hashlib.md5(md ...

  8. 开发工具-在线计算MD5

    更新记录: 2022年6月8日 更新标题. 2022年6月1日 开始. 都记在这以后就不用到处找了. 在线计算MD5 https://www.sojson.com/md5/ http://www.ip ...

  9. 计算 MD5值

    // // MD5Value.h // iOSEdu // // Created by littest on 16/2/26. // Copyright © 2016年 littest. All ri ...

随机推荐

  1. 洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing

    P3063 [USACO12DEC]牛奶的路由Milk Routing 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 Farmer John's farm ...

  2. 用 Arduino Uno 给 Arduino Mini(Pro)烧录程序

    用 Arduino Uno 给 Arduino Mini(Pro)烧录程序 准备 Arduino Uno Arduino Mini(Pro) 杜邦线若干 接线 首先去掉 Arduino 上的芯片ATM ...

  3. Ubuntu 10.04.3 挂载NTFS移动硬盘

    1: fdisk -l #查看所有连接到电脑上的储存设备 2:  mkdir -p /mnt/需要掛的分區 #在mnt裏建立準備掛載分區的目錄 3:  mount -t ntfs /dev/需要掛的分 ...

  4. Behavioral模式之Interpreter模式

    1.意图 给定一个语言,定义它的文法的一种表示.并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 2.别名 无 3.动机 假设一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种 ...

  5. BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树

    题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...

  6. com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$Mis

    为什么会出现这个错误? 我使用了Maven配置Struts,所以改动Struts配置文件的默认路径,例如以下: <!-- 配置struts --> <filter> <f ...

  7. node.js应用Redis初步

    node.js下使用Redis,首先: 1.有一台安装了Redis的服务器,当然,安装在本机也行 2.本机,也就是客户端,要装node.js 3.项目要安装nodejs_redis模块 注意第 3 点 ...

  8. luogu2744 量取牛奶

    题目大意 给出一个整数集合$A$,总数$N$,规定一个整数序列$\{a_n\}, \forall i, a_i\in A$满足条件:存在一个正整数序列$\{k_n\}$,使得$\sum_{i=1}^n ...

  9. TeX中的引号

    #include <stdio.h> #include <math.h> // 算法竞赛的目标是编程对任意输入均得到正确的结果. // 请先独立完成,如果有困难可以翻阅本书代码 ...

  10. C#中的文件导出大全

    s 得到 radiobuttonlist和CheckBoxList 选中值 得到radiobuttonlist 选中值:var CheckBoxList=document.all.optButtonL ...