// 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. 最小生成树+BFS J - Borg Maze

    The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. ...

  2. Cannot update identity column &#39;XXX&#39;

    Sqlserver -- 怎样改动设置主键的id能够手动更新? #1 打开表的设计界面 #2 将主键id的is Identity的属性改成No 这样就能够通过Update语句来更新表的主键id了. 怎 ...

  3. 苹果iOS手机后门的”诊断功能论“不攻自破

    7月23日.苹果公司公布公告,题为"iOS:About diagnostic capabilities"("iOS:关于诊断功能").当中声称:iOS offe ...

  4. iOS常用的正则表达式总结

    /* 正则表达式说明: . 匹配除换行符以外的任意字符 \\w 匹配字母或数字或下划线或汉字 \\s 匹配任意的空白符 \\d 匹配数字 \\b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字 ...

  5. hdu 2255奔小康赚大钱 KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=2255 一,KM算法:(借助这个题写一下个人对km的理解与km模板) KM算法主要是用来求解图的最优匹 ...

  6. dbms_metadata.get_ddl的用法

    --GET_DDL: Return the metadata for a single object as DDL. -- This interface is meant for casual bro ...

  7. 使用 Pascal 脚本编写网页, PWP 项目

    下载后得到 pwp.rar 文件. 解压到一个文件夹里面, 比方  e:\my_sys 文件夹下. 设计一下的脚本. 測试能否够执行. <%  uses sysutils; begin      ...

  8. Scroller的应用--滑屏实现

    1.Scroller源代码分析 以下是对Scroller源代码的分析,并附有源代码.例如以下: package android.widget; import android.content.Conte ...

  9. ping测试局域网内主机是否alive

    [root@zabbix ~]# cat alivehost.sh #!/bin/bash #Checks to see if hosts 192.168.1.100-192.168.1.200 ar ...

  10. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37407423 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...