CryptDuplicateKey 함수(wincrypt.h)

중요 이 API는 더 이상 사용되지 않습니다. 신규 및 기존 소프트웨어는 Cryptography Next Generation API 사용을 시작해야 합니다. Microsoft는 향후 릴리스에서 이 API를 제거할 수 있습니다.
 
CryptDuplicateKey 함수는 키의 정확한 복사본과 키 상태를 만듭니다.

구문

BOOL CryptDuplicateKey(
  [in]  HCRYPTKEY hKey,
  [in]  DWORD     *pdwReserved,
  [in]  DWORD     dwFlags,
  [out] HCRYPTKEY *phKey
);

매개 변수

[in] hKey

복제할 키에 대한 핸들입니다.

[in] pdwReserved

나중에 사용하도록 예약되며 NULL이어야 합니다.

[in] dwFlags

나중에 사용하도록 예약되며 0이어야 합니다.

[out] phKey

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

반환 값

함수가 성공하면 반환 값은 0이 아닌 값(TRUE)입니다.

함수가 실패하면 반환 값은 0(FALSE)입니다. 확장 오류 정보는 GetLastError를 호출합니다.

"NTE"가 앞에 있는 오류 코드는 사용 중인 특정 CSP에 의해 생성됩니다. 다음 표에는 몇 가지 가능한 오류 코드가 나열되어 있습니다.

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

설명

CryptDuplicateKey 는 키의 복사본과 키의 정확한 상태를 만듭니다. 이 함수를 사용할 수 있는 한 가지 시나리오는 애플리케이션이 동일한 키를 사용하지만 솔트 값이 다른 두 개의 개별 메시지를 암호화해야 하는 경우입니다. 원래 키가 생성된 다음 CryptDuplicateKey 함수를 사용하여 중복 키를 만듭니다. 그런 다음 CryptSetKeyParam 함수에 대한 별도의 호출을 사용하여 원래 키와 중복 키에 서로 다른 솔트 값이 설정됩니다.

CryptDuplicateKey 를 사용하여 만든 모든 키를 삭제하려면 CryptDestroyKey를 호출해야 합니다. 원래 키를 삭제해도 중복 키가 제거되지는 않습니다. 중복 키를 만든 후에는 원래 키와 분리됩니다. 두 키 사이에 공유 상태가 없습니다.

예제

다음 예제에서는 기존 세션 키의 중복 세션 키 만들기를 보여 집니다. 이 예제의 전체 컨텍스트를 포함하는 예제는 예제 C 프로그램: 세션 키 복제를 참조하세요.

//--------------------------------------------------------------------
// Declare and initialize variables.

HCRYPTKEY    hDuplicateKey;

// Duplicate the key. hOriginalKey is a previously 
// assigned HCRYPTKEY variable.

if (CryptDuplicateKey(
     hOriginalKey, 
     NULL, 
     0, 
     &hDuplicateKey))
{
   printf("The session key has been duplicated. \n");
}
else
{
   printf("Error using CryptDuplicateKey.\n");
   exit(1);
}

// Insert code that uses the duplicate key here.

// When you have finished using the key, the handle must be released.

if (CryptDestroyKey(hDuplicateKey))
{
  printf("The handle has been released.\n");
}
else
{
  printf("The handle could not be released.\n");
}

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 wincrypt.h
라이브러리 Advapi32.lib
DLL Advapi32.dll

추가 정보

CryptDestroyKey

CryptSetKeyParam

키 생성 및 Exchange 함수