共用方式為


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) 。 以下是一些可能的錯誤碼。

傳回碼 Description
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
程式庫 Advapi32.lib
Dll Advapi32.dll

另請參閱

CryptDestroyHash

哈希和數位簽名函式