CryptDuplicateHash 函数 (wincrypt.h)
CryptDuplicateHash 函数将哈希的精确副本复制到复制完成时。 重复哈希包括哈希 的状态 。
可以逐个创建哈希。 CryptDuplicateHash 函数可用于创建以相同内容开头的两个不同内容的单独哈希。
语法
BOOL CryptDuplicateHash(
[in] HCRYPTHASH hHash,
[in] DWORD *pdwReserved,
[in] DWORD dwFlags,
[out] HCRYPTHASH *phHash
);
参数
[in] hHash
要复制的哈希的句柄。
[in] pdwReserved
保留供将来使用,必须为零。
[in] dwFlags
保留供将来使用,必须为零。
[out] phHash
重复哈希句柄的地址。 使用完哈希后,通过调用 CryptDestroyHash 函数释放句柄。
返回值
如果该函数成功,则函数返回 TRUE。
如果函数失败,则返回 FALSE。 有关扩展的错误信息,请调用 GetLastError。
“NTE”开头的错误代码由你正在使用的特定 加密服务提供程序 (CSP) 生成。 一些可能的错误代码随之而来。
返回代码 | 说明 |
---|---|
|
由于这是一个新函数,因此现有 CSP 无法实现它。 如果 CSP 不支持此函数,则返回此错误。 |
|
其中一个参数包含无效的值。 这通常是无效的指针。 |
|
原始哈希的句柄无效。 |
注解
CryptDuplicateHash 会复制 哈希 和哈希的确切 状态 。 如果调用应用程序需要生成两个哈希,但两个哈希都必须从一些常见的哈希数据开始,则可以使用此函数。 例如,可以创建一个哈希,对常用数据进行哈希处理,使用 CryptDuplicateHash 函数创建一个重复项,然后将添加每个哈希的唯一数据。
必须调用 CryptDestroyHash 函数来销毁使用 CryptDuplicateHash 创建的任何哈希。 销毁原始哈希不会导致销毁重复哈希。 创建重复哈希后,它将与原始哈希分开。 两个哈希之间没有共享 状态 。
示例
以下示例演示如何创建哈希的确切副本。 有关包含此示例的完整上下文的示例,请参阅 示例 C 程序:复制哈希。
//-------------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hCryptProv = NULL;
HCRYPTHASH hOriginalHash = NULL;
HCRYPTHASH hDuplicateHash = NULL;
//-------------------------------------------------------------------
// Acquire a CSP context.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
printf("CryptAcquireContext succeeded. \n");
}
else
{
printf("Error during CryptAcquireContext.\n");
exit(1);
}
//-------------------------------------------------------------------
// Create a hash.
if (CryptCreateHash(
hCryptProv,
CALG_SHA1,
0,
0,
&hOriginalHash))
{
printf("An empty hash object has been created. \n");
}
else
{
printf("Error during CryptCreateHash.\n");
exit(1);
}
//-------------------------------------------------------------------
// Hash a BYTE string.
if (CryptHashData(
hOriginalHash,
(BYTE*)"Some Common Data",
sizeof("Some Common Data"), 0))
{
printf("An original hash has been created. \n");
}
else
{
printf("Error during CryptHashData.\n");
exit(1);
}
//-------------------------------------------------------------------
// Duplicate the hash.
if (CryptDuplicateHash(
hOriginalHash,
NULL,
0,
&hDuplicateHash))
{
printf("The hash has been duplicated. \n");
}
else
{
printf("Error during CryptDuplicateHash.\n");
exit(1);
}
//-------------------------------------------------------------------
// At this point, the two hash objects are exactly the same.
// The two hash objects can be handled separately.
// When all processing on the hash object is completed,
// both objects should be destroyed, and the cryptographic
// context should be released.
//-------------------------------------------------------------------
// Destroy the original hash.
if(CryptDestroyHash(hOriginalHash))
{
printf("The original hash has been destroyed. \n");
}
else
{
printf("Error during CryptDestroyHash on the original "
"hash object.\n");
exit(1);
}
//-------------------------------------------------------------------
// Destroy the duplicate hash.
if (CryptDestroyHash(hDuplicateHash))
{
printf("The duplicate hash has been destroyed. \n");
}
else
{
printf("Error during CryptDestroyHash on the duplicated hash object.\n");
exit(1);
}
//-------------------------------------------------------------------
// Release the CSP.
if(hCryptProv)
CryptReleaseContext(hCryptProv,0);
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | wincrypt.h |
Library | Advapi32.lib |
DLL | Advapi32.dll |