[New - Windows NT]
[New - Windows 95, OEM Service Release 2]
CryptHashSessionKey函数用于计算密钥对象上的密码散列。可以使用相同的散列句柄多次调用此函数来计算多个键上的散列。致电CryptHashSessionKey可以穿插到CryptHashData的电话。
在调用此函数之前,必须调用CryptCreateHash函数来获取哈希对象的句柄。
BOOL CRYPTFUNC CryptHashSessionKey(
HCRYPTHASH【马】, | |
HCRYPTKEY【的hKeyru-Latn】, | |
DWORD【dwFlags中】 | |
); |
参数
【马】
[in]散列对象的句柄。应用程序使用CryptCreateHash函数获取此句柄。
【的hKeyru-Latn】
[in]要哈希的关键对象的句柄。
【dwFlags中】
[in]标志值。此参数保留供将来使用,并且应始终为零。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。
下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。
错误 | 描述 |
ERROR_INVALID_HANDLE | 其中一个参数指定一个无效句柄。 |
ERROR_INVALID_PARAMETER | 其中一个参数包含无效值。这通常是一个非法的指针。 |
NTE_BAD_ALGID | 【马】句柄指定此CSP不支持的算法。 |
NTE_BAD_FLAGS | 【dwFlags中】参数非零。 |
NTE_BAD_HASH | 由【马】参数指定的散列对象无效。 |
NTE_BAD_HASH_STATE | 尝试将数据添加到已标记为“已完成”的散列对象。 |
NTE_BAD_KEY | 正在使用密钥哈希算法,但会话密钥不再有效。如果在散列操作完成之前会话密钥被销毁,则会产生此错误。 |
NTE_BAD_UID | 创建哈希对象时指定的CSP上下文无法找到。 |
NTE_FAIL | 该函数以某种意想不到的方式失败。 |
例
#include < wincrypt.h >
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
//获取默认提供程序的句柄。
if(!CryptAcquireContext(& hProv,NULL,NULL,PROV_RSA_FULL,0)){
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}
//创建哈希对象。
IF(!CryptCreateHash(hProv,CALG_MD5,0,0,{} hHash 989796005)){
printf("Error %x during CryptBeginHash!\n", GetLastError());
goto done;
}
//创建随机会话密钥。
IF(!CryptGenKey(hProv,CALG_RC2,CRYPT_EXPORTABLE,{}的hKey 989796005)){
printf("Error %x during CryptGenKey!\n", GetLastError());
goto done;
}
//哈希会话密钥。
if(!CryptHashSessionKey(hHash,hKey,0)){
printf("Error %x during CryptHashSessionKey!\n", GetLastError());
goto done;
}
//使用哈希对象的东西。
...
完成:
//销毁哈希对象。
if(hHash) CryptDestroyHash(hHash);
//销毁会话密钥。
if(hKey) CryptDestroyKey(hKey);
//发布CSP句柄。
if(hProv) CryptReleaseContext(hProv,0);
也可以看看