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) 生成。 一些可能的错误代码随之而来。

返回代码 说明
ERROR_CALL_NOT_IMPLEMENTED
由于这是一个新函数,因此现有 CSP 无法实现它。 如果 CSP 不支持此函数,则返回此错误。
ERROR_INVALID_PARAMETER
其中一个参数包含无效的值。 这通常是无效的指针。
NTE_BAD_HASH
原始哈希的句柄无效。

注解

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

另请参阅

CryptDestroyHash

哈希和数字签名函数