Share via


CryptDuplicateHash 함수(wincrypt.h)

CryptDuplicateHash 함수는 중복이 수행되는 시점까지 해시의 정확한 복사본을 만듭니다. 중복 해시에는 해시 의 상태가 포함됩니다.

해시는 하나씩 만들 수 있습니다. CryptDuplicateHash 함수를 사용하여 동일한 콘텐츠로 시작하는 두 개의 서로 다른 콘텐츠에 대한 별도의 해시를 만들 수 있습니다.

구문

BOOL CryptDuplicateHash(
  [in]  HCRYPTHASH hHash,
  [in]  DWORD      *pdwReserved,
  [in]  DWORD      dwFlags,
  [out] HCRYPTHASH *phHash
);

매개 변수

[in] hHash

복제할 해시의 핸들입니다.

[in] pdwReserved

나중에 사용할 수 있으며 0이어야 합니다.

[in] dwFlags

나중에 사용할 수 있으며 0이어야 합니다.

[out] phHash

중복된 해시 핸들의 주소입니다. 해시 사용을 마쳤으면 CryptDestroyHash 함수를 호출하여 핸들을 해제합니다.

반환 값

함수가 성공하면 함수는 TRUE를 반환합니다.

함수가 실패하면 FALSE를 반환합니다. 확장된 오류 정보는 GetLastError를 호출합니다.

"NTE"가 앞에 있는 오류 코드는 사용 중인 특정 CSP( 암호화 서비스 공급자 )에서 생성됩니다. 몇 가지 가능한 오류 코드는 다음과 같습니다.

반환 코드 설명
ERROR_CALL_NOT_IMPLEMENTED
이 함수는 새 함수이므로 기존 CSP는 이를 구현할 수 없습니다. 이 오류는 CSP가 이 함수를 지원하지 않는 경우 반환됩니다.
ERROR_INVALID_PARAMETER
매개 변수 중 하나에는 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다.
NTE_BAD_HASH
원래 해시에 대한 핸들이 잘못되었습니다.

설명

CryptDuplicateHash는 해시의 복사본과 해시의 정확한 상태를 만듭니다. 호출 애플리케이션이 두 해시를 생성해야 하지만 두 해시가 모두 일부 일반적인 데이터 해시로 시작해야 하는 경우 이 함수를 사용할 수 있습니다. 예를 들어 해시가 만들어질 수 있고, 공통 데이터가 해시되고, CryptDuplicateHash 함수로 만든 중복된 데이터가 추가된 다음, 각 해시에 고유한 데이터가 추가될 수 있습니다.

CryptDuplicateHash를 사용하여 만든 해시를 삭제하려면 CryptDestroyHash 함수를 호출해야 합니다. 원래 해시를 삭제해도 중복 해시가 제거되지는 않습니다. 중복 해시가 만들어지면 원래 해시와는 별개입니다. 두 해시 사이에는 공유 상태가 없습니다.

예제

다음 예제에서는 해시의 정확한 복사본을 만드는 방법을 보여줍니다. 이 예제의 전체 컨텍스트를 포함하는 예제는 예제 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

해시 및 디지털 서명 함수