利用CryptoAPI实现Hash算法..docx
文本预览下载声明
利用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,却省名称的容器就会被删除。此容器里的所有密钥对也会被删除。CRYPT_SLIENT应用程序要求CSP 不显示任何用户界面。功能:这个函数是用来取得指定CSP 密钥容器句柄,以后的任何加密操作就是针对此CSP 句
显示全部