예제 C 프로그램: 일반 텍스트 키 가져오기
이 SDK의 많은 함수는 HCRYPTKEY 핸들을 사용하여 키를 식별해야 합니다. 키가 바이트 배열에 포함된 경우 다음 예제와 같이 CryptImportKey 함수를 사용하여 핸들을 만들 수 있습니다.
이 예제에서는 다음 작업 및 CryptoAPI 함수를 보여 줍니다.
- CryptAcquireContext를 호출하여 암호화 서비스 공급자에 대한 핸들을 획득합니다.
- CryptImportKey를 호출하여 일반 텍스트 키를 CSP 키 컨테이너로 가져옵니다.
- CyptExportKey를 호출하여 키 컨테이너에서 키를 내보냅니다.
- 콘솔에 내보낸 키를 인쇄하여 일반 텍스트 키를 실제로 컨테이너로 가져왔는지 확인합니다.
- 일반 텍스트 키용으로 예약된 메모리 해제
- CryptReleaseContext를 호출하여 CSP를 해제합니다.
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <wincrypt.h>
#pragma comment(lib, "crypt32.lib")
// DesKeyBlob: A plaintext key BLOB stored in a byte array. The
// byte array must have the following format:
// BLOBHEADER hdr;
// DWORD dwKeySize;
// BYTE rgbKeyData [];
BYTE DesKeyBlob[] = {
0x08,0x02,0x00,0x00,0x01,0x66,0x00,0x00, // BLOB header
0x08,0x00,0x00,0x00, // key length, in bytes
0xf1,0x0e,0x25,0x7c,0x6b,0xce,0x0d,0x34 // DES key with parity
};
int _tmain()
{
//--------------------------------------------------------------------
// Declare variables.
//
// hProv: Cryptographic service provider (CSP). This example
// uses the Microsoft Enhanced Cryptographic
// Provider.
// hKey: Key to be used. In this example, you import the
// key as a PLAINTEXTKEYBLOB.
// dwBlobLen: Length of the plaintext key.
// pbKeyBlob: Pointer to the exported key.
HCRYPTPROV hProv = NULL;
HCRYPTKEY hKey = NULL;
DWORD dwBlobLen;
BYTE* pbKeyBlob;
//--------------------------------------------------------------------
// Acquire a handle to the CSP.
if(!CryptAcquireContext(
&hProv,
NULL,
MS_ENHANCED_PROV,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT))
{
// If the key container cannot be opened, try creating a new
// container by specifying a container name and setting the
// CRYPT_NEWKEYSET flag.
if(NTE_BAD_KEYSET == GetLastError())
{
if(!CryptAcquireContext(
&hProv,
L"mytestcontainer",
MS_ENHANCED_PROV,
PROV_RSA_FULL,
CRYPT_NEWKEYSET | CRYPT_VERIFYCONTEXT))
{
printf("Error in AcquireContext 0x%08x \n",
GetLastError());
return 1;
}
}
else
{
printf(" Error in AcquireContext 0x%08x \n",GetLastError());
return 1;
}
}
// Use the CryptImportKey function to import the PLAINTEXTKEYBLOB
// BYTE array into the key container. The function returns a
// pointer to an HCRYPTKEY variable that contains the handle of
// the imported key.
if (!CryptImportKey(
hProv,
DesKeyBlob,
sizeof(DesKeyBlob),
0,
CRYPT_EXPORTABLE,
&hKey ) )
{
printf("Error 0x%08x in importing the Des key \n",
GetLastError());
}
// For the purpose of this example, you can export the key and
// print it to verify that the plain text key created above is
// the key that was imported into the CSP.
// Call CryptExportKey once to determine the length of the key.
// Allocate memory for the BLOB, and call CryptExportKey again
// to retrieve the key from the CSP key container.
if(!CryptExportKey(
hKey,
NULL,
PLAINTEXTKEYBLOB,
0,
NULL,
&dwBlobLen))
{
printf("Error 0x%08x computing BLOB length.\n",
GetLastError());
return 1;
}
if(pbKeyBlob = (BYTE*)malloc(dwBlobLen))
{
printf("Memory has been allocated for the BLOB. \n");
}
else
{
printf("Out of memory. \n");
return 1;
}
if(!CryptExportKey(
hKey,
NULL,
PLAINTEXTKEYBLOB,
0,
pbKeyBlob,
&dwBlobLen))
{
printf("Error 0x%08x exporting key.\n", GetLastError());
return 1;
}
DWORD count = 0;
printf("Printing Key BLOB for verification \n");
for(count=0; count < dwBlobLen;)
{
printf("%02x",pbKeyBlob[count]);
count ++;
}
// Free resources.
if(pbKeyBlob)
{
free(pbKeyBlob);
}
if(hProv)
{
CryptReleaseContext(hProv, 0);
}
return 0;
}