- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
利用Crypt API实现Hash算法
利用Crypto API实现Hash算法
之前偶尔看到了一篇论文里面提到微软的Crypto API库,可以实现加解密、Hash运算、密钥交换、证书认证等功能,于是就萌生了用该库实现DES、AES、RSA、MD5等算法的想法(以前都是人工实现,太麻烦了……)。
这里先介绍各种Hash算法的实现方法:
Step0:
环境配置,我这里用的是vs2010,貌似只需要添加#include wincrypt.h头文件和#pragma comment(lib, Crypt32.lib)代码就可以使用这些API了,不需要进行额外的工程设置。
Step1:
首先我们先看看这个函数,CryptHashData(看起来很靠谱的样子,其实只算一个中间函数吧。)
BOOL WINAPI CryptHashData(HCRYPTHASH hHash,
BYTE *pbData, //带哈希数据首地址
DWORD dwDataLen,//待哈希数据长度
DWORD dwFlags
);
参数:
hHash
[in]哈希对象句柄
pbData
[in]指向要加入到哈希对象的数据指针
dwDataLen
[in]数据长度
dwFlags
[in]标志
CRYPT_USERDATA 所有微软CSP 都忽略此参数。所有其他CSP 都不能忽略此参数,如果置此参数,CSP 提示用户直接传入数据。
函数功能:
此函数把一段数据加入到指定的哈希对象中去。
e.g.
CryptHashData(hCryptHash, (BYTE*)hash_data, data_len, 0);
好吧,为了调用这个函数,我们需要一个HCRYPTHASH类型的哈希句柄,那么这个句柄怎么来呢……
Step2:
不难发现,生成哈希句柄的函数为CryptCreateHash,同样看看他的参数说明:
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv,
ALG_ID Algid, //想使用的哈希算法
HCRYPTKEY hKey,
DWORD dwFlags,
HCRYPTHASH *phHash
//获得的哈希句柄
);
参数:
hProv
[in]CSP 句柄
Algid
[in]哈希算法的标示符。
hKey
[in]如果哈希算法是密钥哈希,如HMAC、MAC 算法,就用此密钥句柄传递密钥。对于非密钥算法,此参数为NULL。
dwFlags
[in]保留。必须为0。
phHash
[out]哈希对象的句柄。
功能:
此函数初始化哈希数据流。它创建并返回了一个CSP 哈希对象的句柄。此句柄由CryptHashData 和CryptHashSessionKey 来调用。
e.g.
CryptCreateHash(hCryptProv,CALG_MD5,0,0,hCryptHash)
这里可以通过Algid参数设置你需要的哈希算法对应的预编译常量,就可以获取哈希句柄。但是……获取哈希句柄需要传入一个CSP句柄(密钥容器),所以需要一个获取该句柄的函数。
Step3:
直接利用函数CryptAcquireContext就可以获取HCRYPTPROV类型的密钥容器句柄了,该函数参数声明如下:
BOOL WINAPI CryptAcquireContext(HCRYPTPROV *phProv,//返回的CSP句柄
LPCTSTR pszContainer,
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags
);
参数:
phProv
[out] CSP 句柄指针
pszContainer
[in] 密钥容器名称, 指向密钥容器的字符串指针。如果dwFlags 为
CRYPT_VERIFYCONTEXT,pszContainer 必须为NULL。
pszProvider
[in]指向CSP 名称的字符串指针。如果为NULL,就使用却省的CSP。
dwProvType
[in]CSP 类型。
dwFlags
[in]标志。
CRYPT_VERIFYCONTEXT
此选项指出应用程序不需要使用公钥/私钥对,如程序只执行哈希和对称加密。
只有程序需要创建签名和解密消息时才需要访问私钥。
CRYPT_NEWKEYSET
使用指定的密钥容器名称创建一个新的密钥容器。如果pszContainer 为NULL,
密钥容器就使用却省的名称创建。
CRYPT_MACHINE_KEYSET
由此标志创建的密钥容器只能由创建者本人或有系统管理员身份的人使用。
CRYPT_DELETEKEYSET
删除由pszContainer 指定的密钥容器。如果pszContainer 为NULL,却省名称
的容器就
文档评论(0)