#include <wincrypt.h>

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, L"%02X", pHash[ i ] );
lstrcat( pszHash, szTemp );
}
delete[ ]pHash; CryptDestroyHash( hHash );
CryptReleaseContext( hProv, );
return dwReturn;
} void __fastcall TForm2::Button2Click( TObject * Sender )
{
char szStr[ ] = { } ;
TCHAR szHash[ ] = { } ; strcpy( szStr, "ww" ); // wcscpy
GetHash( ( BYTE * )szStr, strlen( szStr ), CALG_MD5, szHash );
Caption = szHash; strcpy( szStr, "ww" ); // wcscpy
GetHash( ( BYTE * )szStr, strlen( szStr ), CALG_MD5, szHash );
Caption = szHash;
//
// strwcpy( szStr, "测试SHA" );
// GetHash( ( BYTE * )szStr, strlen( szStr ), CALG_SHA, szHash );
// MessageBox( NULL, szHash, szStr, MB_OK );
}

多数时候这个函数的dwProvType使用PROV_RSA_FULL(网上的开源代码基本都是使用这个常数),这对MD5,SHA-1等都有效;但是却不是正确的SHA-256/512的provider type,所以使用这个常数创建的context会在之后创建SHA-256/512算法时发生错误。

正确的做法是使用PROV_RSA_AES。

from http://blog.kingsamchen.com/archives/tag/sha

c++builder CryptoAPI md5的更多相关文章

  1. c++Builder XE6 MD5 加密算法 BASE64 URL 编码

    xe6,xe7 BASE64XE6 MD5 加密算法Delphifunction MD5(const texto: string): string; var idmd5: TIdHashMessage ...

  2. 跟开涛老师学shiro -- 编码/加密

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...

  3. 将 Shiro 作为一个许可为基础的应用程序 五:password加密/解密Spring应用

    考虑系统password的安全,眼下大多数系统都不会把password以明文的形式存放到数据库中. 一把会採取下面几种方式对password进行处理 password的存储 "编码" ...

  4. Shiro加密

    在开发的时候,很多数据我们都希望是以加密过后的形式存储起来,而不是最原始的数据. 在shiro中也提供了编码,解码,加密,加密算法实现等等一系列的内容. 编码/解码 在org.apache.shiro ...

  5. shiro中编码/加密

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...

  6. shrio 加密/编码

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...

  7. 第五章 编码/加密——《跟我学Shiro》

    转发地址:https://www.iteye.com/blog/jinnianshilongnian-2021439 目录贴:跟我学Shiro目录贴 在涉及到密码存储问题上,应该加密/生成密码摘要存储 ...

  8. (七)shiro之编码/加密

    一.编码/解码 使用Base64编码/解码操作 public class TestMain { public static void main(String[] args) { SecurityMan ...

  9. Shiro学习(5)编码、加密

    在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...

随机推荐

  1. 《OD学hadoop》Hadoop前置

    一.Hadoop 前置课程 1. Linux系统,基本命令 2. Java语言,JavaSE相关知识 3. MySQL基本的DML和DDL SQL on Hadoop

  2. 编译Apache Hadoop2.2.0源代码

    Hadoop2的学习资料很少,只有官网的少数文档.如果想更深入的研究hadoop2,除了仅看官网的文档外,还要学习如何看源码,通过不断的调试跟踪源码,学习hadoop的运行机制. 1.安装CentOS ...

  3. HibernateTools的使用

    1. 到 Hibernate.org官网上 下载最新版的 Hibernate Tools,我用的是 HibernateTools-3.2.4.GA版 2. 将 下载下来的压缩包解压缩,里面会有 plu ...

  4. URAL1513. Lemon Tale(dp)

    1513 这题好久之前就看过了,悲催的是当时看题解都没看懂,今天又看了看so easy... n个B里不能出现超过连续k个L的情况 一维递推就可以 两种情况 1.dp[i] += dp[i-1] 在i ...

  5. Android应用主界面底部菜单实现

    介绍 现在绝大多数主流的应用主界面,都会包含一个底部菜单,就拿腾讯的QQ与微信来说,看起来是这样的  <---我是底部菜单 原理 在很久以前,可以通过TabActivity实现相关功能,自从Fr ...

  6. NET垃圾回收机制【Copy By Internet】

    尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection),但是我们还是应该了解它们,以优化我们的应用程序.同时,还需要具备一些基础的内存管理工作机 ...

  7. POJ2186 POPULAR COW

    链接:http://poj.org/problem?id=2186 题意:给你N个点,然后在给你N条有向边,然后让你找出这样的点S,S满足条件图上任意一点都能到达S. 要想满足任意一点都能到达,首先满 ...

  8. 详解Android动画之Frame Animation(转)

    在开始实例讲解之前,先引用官方文档中的一段话: Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,我们称为逐帧动画.Frame动画可以被定义在XML文件中,也可以完全编码实现. ...

  9. 隐藏 php apache 的版本号

    隐藏Apache版本信息 找到apache安装路径,譬如\Apache\conf\httpd.conf 修改httpd.conf ServerTokens ProductOnly ServerSign ...

  10. sysbench 安装

    sysbench源代码可以在https://launchpad.net/sysbench找到.也可以从本文件附件中下载. 先安装好mysql,记录下安装目录.默认为 /usr/local/mysql ...