CryptImportKey 함수(wincrypt.h)
구문
BOOL CryptImportKey(
[in] HCRYPTPROV hProv,
[in] const BYTE *pbData,
[in] DWORD dwDataLen,
[in] HCRYPTKEY hPubKey,
[in] DWORD dwFlags,
[out] HCRYPTKEY *phKey
);
매개 변수
[in] hProv
CryptAcquireContext 함수를 사용하여 가져온 CSP의 핸들입니다.
[in] pbData
PUBLICKEYSTRUC BLOB 헤더와 암호화된 키가 포함된 BYTE 배열입니다. 이 키 BLOB은 CryptExportKey 함수(이 애플리케이션 또는 다른 컴퓨터에서 실행 중인 다른 애플리케이션)에 의해 만들어집니다.
[in] dwDataLen
키 BLOB의 길이(바이트)를 포함합니다.
[in] hPubKey
pbData에 저장된 키를 해독하는 암호화 키에 대한 핸들입니다. 이 키는 hProv 가 참조하는 동일한 CSP에서 와야 합니다. 이 매개 변수의 의미는 CSP 형식 및 가져올 키 BLOB의 형식에 따라 다릅니다.
- 키 BLOB이 키 교환 키 쌍(예: SIMPLEBLOB)으로 암호화되는 경우 이 매개 변수는 키 교환 키에 대한 핸들일 수 있습니다.
- 키 BLOB이 세션 키(예: 암호화된 PRIVATEKEYBLOB)로 암호화된 경우 이 매개 변수에는 이 세션 키의 핸들이 포함됩니다.
- 키 BLOB이 암호화되지 않은 경우(예: PUBLICKEYBLOB) 이 매개 변수는 사용되지 않으며 0이어야 합니다.
- 키 BLOB이 Schannel CSP의 세션 키(예: 암호화된 OPAQUEKEYBLOB 또는 다른 공급업체별 OPAQUEKEYBLOB)로 암호화되는 경우 이 매개 변수는 사용되지 않으며 0으로 설정해야 합니다.
[in] dwFlags
현재는 PRIVATEKEYBLOB 형식의 퍼블릭/프라이빗 키 쌍을 CSP로 가져올 때만 사용됩니다.
이 매개 변수는 다음 값 중 하나일 수 있습니다.
값 | 의미 |
---|---|
|
가져올 키는 결국 다시 적용됩니다. 이 플래그를 사용하지 않으면 키 핸들을 사용하여 CryptExportKey 에 대한 호출이 실패합니다. |
|
이 플래그를 사용하면 SIMPLEBLOB을 가져올 때 RSA 암호화 및 암호 해독을 사용하여 PKCS #1 버전 2 서식을 검사합니다. |
|
40비트 대칭 키에 솔트 없음 값이 할당됩니다. 자세한 내용은 솔트 값 기능을 참조하세요. |
|
이 플래그가 설정된 경우 CSP는 이 키를 사용하여 특정 작업을 시도할 때 대화 상자 또는 다른 방법을 통해 사용자에게 알 수 있습니다. 정확한 동작은 CSP 또는 사용된 CSP 형식으로 지정됩니다. CRYPT_SILENT 집합을 사용하여 공급자 컨텍스트를 가져온 경우 이 플래그를 사용하면 오류가 발생하고 마지막 오류가 NTE_SILENT_CONTEXT 설정됩니다. |
|
16바이트보다 큰 RC2 키를 가져올 수 있습니다. 이 플래그를 설정하지 않으면 RC2 키가 16바이트보다 큰 CryptImportKey 함수에 대한 호출이 실패하고 GetLastError 를 호출하면 NTE_BAD_DATA 반환됩니다. |
[out] phKey
가져온 키의 핸들을 수신하는 HCRYPTKEY 값에 대한 포인터입니다. 키 사용을 마쳤으면 CryptDestroyKey 함수를 호출하여 핸들을 해제합니다.
반환 값
함수가 성공하면 함수는 0이 아닌 값을 반환합니다.
함수가 실패하면 0을 반환합니다. 확장된 오류 정보는 GetLastError를 호출합니다.
"NTE"가 앞에 있는 오류 코드는 사용 중인 특정 CSP에 의해 생성됩니다. 몇 가지 가능한 오류 코드는 다음과 같습니다.
반환 코드 | 설명 |
---|---|
|
일부 CSP는 다른 스레드 또는 프로세스가 이 키를 사용하는 동안 프라이빗 키를 컨테이너로 가져오는 경우 이 오류를 설정합니다. |
|
매개 변수 중 하나는 유효하지 않은 핸들을 지정합니다. |
|
매개 변수 중 하나에는 유효하지 않은 값이 포함되어 있습니다. 이는 가장 자주 유효하지 않은 포인터입니다. |
|
가져올 간단한 키 BLOB 은 예상되는 키 교환 알고리즘으로 암호화되지 않습니다. |
|
가져올 공개 키와 함께 작동하는 알고리즘은 이 CSP에서 지원되지 않거나 공개 키 중 하나가 아닌 다른 항목으로 암호화된 세션 키를 가져오려고 시도했습니다. |
|
지정된 dwFlags 매개 변수가 잘못되었습니다. |
|
키 BLOB 형식은 이 CSP에서 지원되지 않으며 유효하지 않을 수 있습니다. |
|
hProv 매개 변수에 유효한 컨텍스트 핸들이 없습니다. |
|
키 BLOB의 버전 번호가 CSP 버전과 일치하지 않습니다. 이는 일반적으로 CSP를 업그레이드해야 했음을 나타냅니다. |
설명
HMAC(해시 기반 메시지 인증 코드) 키를 가져올 때 호출자는 가져온 키를 PLAINTEXTKEYBLOB 형식으로 식별하고 PUBLICKEYSTRUC BLOB 헤더의 aiKeyAlg 필드에 적절한 알고리즘 식별자를 설정해야 합니다.
CryptImportKey 함수를 사용하여 대칭 알고리즘에 대한 일반 텍스트 키를 가져올 수 있습니다. 그러나 사용 편의를 위해 CryptGenKey 함수를 대신 사용하는 것이 좋습니다. 일반 텍스트 키를 가져올 때 pbData 매개 변수에 전달되는 키 BLOB의 구조는 PLAINTEXTKEYBLOB입니다.
사용 중인 CSP에서 지원하는 모든 알고리즘 또는 키 조합 유형과 함께 PLAINTEXTKEYBLOB 형식을 사용할 수 있습니다.
일반 텍스트 키를 가져오는 예제는 예제 C 프로그램: 일반 텍스트 키 가져오기를 참조하세요.
다음 예제에서는 헤더 필드를 설정하는 방법을 보여줍니다.
keyBlob.header.bType = PLAINTEXTKEYBLOB;
keyBlob.header.bVersion = CUR_BLOB_VERSION;
keyBlob.header.reserved = 0;
// CALG_AES_128 is used as an example. You would set this to the
// algorithm id that corresponds to the one used by the key.
keyBlob.header.aiKeyAlg = CALG_AES_128;
키의 길이는 keyBlob.keyLength에 지정되며, 그 뒤에 실제 키 데이터가 표시됩니다.
지원되는 키 크기는 다음과 같습니다.
알고리즘 | 지원되는 키 크기 |
---|---|
CALG_DES | 64비트 |
CALG_3DES_112 | 128비트 |
CALG_3DES | 192비트 |
예제
다음 예제에서는 키 BLOB에서 키를 가져오는 방법을 보여줍니다. 이 함수에 대한 전체 예제는 예제 C 프로그램: 해시 서명 및 해시 서명 확인을 참조하세요. 이 함수를 사용하는 추가 코드는 예제 C 프로그램: 파일 암호 해독을 참조하세요.
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
BOOL ImportKey(HCRYPTPROV hProv, LPBYTE pbKeyBlob, DWORD dwBlobLen)
{
HCRYPTKEY hPubKey;
//---------------------------------------------------------------
// This code assumes that a cryptographic provider (hProv)
// has been acquired and that a key BLOB (pbKeyBlob) that is
// dwBlobLen bytes long has been acquired.
//---------------------------------------------------------------
// Get the public key of the user who created the digital
// signature and import it into the CSP by using CryptImportKey.
// The key to be imported is in the buffer pbKeyBlob that is
// dwBlobLen bytes long. This function returns a handle to the
// public key in hPubKey.
if(CryptImportKey(
hProv,
pbKeyBlob,
dwBlobLen,
0,
0,
&hPubKey))
{
printf("The key has been imported.\n");
}
else
{
printf("Public key import failed.\n");
return FALSE;
}
//---------------------------------------------------------------
// Insert code that uses the imported public key here.
//---------------------------------------------------------------
//---------------------------------------------------------------
// When you have finished using the key, you must release it.
if(CryptDestroyKey(hPubKey))
{
printf("The public key has been released.");
}
else
{
printf("The public key has not been released.");
return FALSE;
}
return TRUE;
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | wincrypt.h |
라이브러리 | Advapi32.lib |
DLL | Advapi32.dll |
추가 정보
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기