c++builder CryptoAPI md5
#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的更多相关文章
- c++Builder XE6 MD5 加密算法 BASE64 URL 编码
xe6,xe7 BASE64XE6 MD5 加密算法Delphifunction MD5(const texto: string): string; var idmd5: TIdHashMessage ...
- 跟开涛老师学shiro -- 编码/加密
在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...
- 将 Shiro 作为一个许可为基础的应用程序 五:password加密/解密Spring应用
考虑系统password的安全,眼下大多数系统都不会把password以明文的形式存放到数据库中. 一把会採取下面几种方式对password进行处理 password的存储 "编码" ...
- Shiro加密
在开发的时候,很多数据我们都希望是以加密过后的形式存储起来,而不是最原始的数据. 在shiro中也提供了编码,解码,加密,加密算法实现等等一系列的内容. 编码/解码 在org.apache.shiro ...
- shiro中编码/加密
在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...
- shrio 加密/编码
在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...
- 第五章 编码/加密——《跟我学Shiro》
转发地址:https://www.iteye.com/blog/jinnianshilongnian-2021439 目录贴:跟我学Shiro目录贴 在涉及到密码存储问题上,应该加密/生成密码摘要存储 ...
- (七)shiro之编码/加密
一.编码/解码 使用Base64编码/解码操作 public class TestMain { public static void main(String[] args) { SecurityMan ...
- Shiro学习(5)编码、加密
在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码.比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储. 5.1 编码/解码 Shir ...
随机推荐
- windows平台时间函数性能比较QueryPerformanceCounter,GetTickCount,ftime,time,GetLocalTime,GetSystemTimeAsFileTime
http://gmd20.blog.163.com/blog/static/168439232012113111759514/ 执行 10000000 次, 耗时 2258,369 微秒 Qu ...
- 转:ViewPager+Fragment基本使用方法(附源码)
ViewPager+Fragment可以做出多页面滑动效果,让我们的应用程序界面操作起来更加灵活 对于ViewPager和Fragment组件还不熟悉的朋友,可以先看看相关的资料 首先在activit ...
- Codeforces 500A - New Year Transportation【DFS】
题意:给出n个数,终点t 从第i点能够跳到i+a[i],问能否到达终点 #include<iostream> #include<cstdio> #include<cstr ...
- BZOJ 4408 神秘数
题解同各神犇的方法... #include<iostream> #include<cstdio> #include<cstring> #include<alg ...
- BZOJ 3754 Tree之最小方差树
枚举平均数. mdzz编译器. #include<iostream> #include<cstdio> #include<cstring> #include< ...
- UML和模式应用
引言 Applying UML and Patterns,以一个商店POS系统NextGen和一个掷骰子游戏Monopoly为例,围绕OOA/D的基本原则GRASP,以迭代作为基本方法.以UML为表达 ...
- 深入理解require/include的顺序
在大型的Web项目中, include_path是一个模块化设计的根本中的根本(当然,现在也有很多基于autoload的设计, 这个不影响本文的探讨), 但是正是因为include_path, 经常会 ...
- typedef 深入剖析
typedef是一个我们常常会用到的关键字,而这个关键字有许多陷阱或者说许多不为我们深入理解的地方.很多书上都是很简单地一笔代过,并没有真正地让我们理解这个关键字.本文对其进行详细地说明.综合网络上找 ...
- Linux/Unix shell 脚本中调用SQL,RMAN脚本
Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可 ...
- 收缩Mysql的ibdata1文件大小方法
ibdata1是mysql数据库中一个数据文件了,你会发现它来越大了,下面我来介绍收缩Mysql的ibdata1文件大小方法 如果你有使用InnoDB来存储你的Mysql表,使用默认设置应该会碰到个非 ...