Exemplo de programa C: duplicando uma chave de sessão
O exemplo a seguir cria uma chave de sessão aleatória, duplica a chave, define alguns parâmetros adicionais na chave original e destrói as chaves originais e duplicadas. Este exemplo ilustra o uso de CryptDuplicateKey e funções relacionadas.
Este exemplo ilustra as seguintes tarefas e funções CryptoAPI:
- Acessando um CSP ( provedor de serviços criptográficos ) usando CryptAcquireContext.
- Criando uma chave de sessão usando CryptGenKey.
- Duplicando a chave criada usando CryptDuplicateKey.
- Usar CryptSetKeyParam para alterar o processo de geração de chave de duas maneiras diferentes.
- Preenchendo um buffer com bytes aleatórios usando CryptGenRandom.
- Destruindo as chaves usando CryptDestroyKey.
- Liberando o CSP com CryptReleaseContext.
Este exemplo usa a função MyHandleError. O código dessa função está incluído no exemplo. O código para essa e outras funções auxiliares também é listado em Uso Geral Functions.
#pragma comment(lib, "crypt32.lib")
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(char *s);
//-------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Begin main.
void main()
{
//-------------------------------------------------------------------
// Declare and initialize variables.
HCRYPTPROV hCryptProv;
HCRYPTKEY hOriginalKey;
HCRYPTKEY hDuplicateKey;
DWORD dwMode;
BYTE pbData[16];
//-------------------------------------------------------------------
// Begin processing.
printf("This program creates a session key and duplicates \n");
printf("that key. Next, parameters are added to the original \n");
printf("key. Finally, both keys are destroyed. \n\n");
//-------------------------------------------------------------------
// Acquire a cryptographic provider context handle.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
printf("CryptAcquireContext succeeded. \n");
}
else
{
MyHandleError("Error during CryptAcquireContext!\n");
}
//-------------------------------------------------------------------
// Generate a key.
if (CryptGenKey(
hCryptProv,
CALG_RC4,
0,
&hOriginalKey))
{
printf("Original session key is created. \n");
}
else
{
MyHandleError("ERROR - CryptGenKey.");
}
//-------------------------------------------------------------------
// Duplicate the key.
if (CryptDuplicateKey(
hOriginalKey,
NULL,
0,
&hDuplicateKey))
{
printf("The session key has been duplicated. \n");
}
else
{
MyHandleError("ERROR - CryptDuplicateKey");
}
//-------------------------------------------------------------------
// Set additional parameters on the original key.
// First, set the cipher mode.
dwMode = CRYPT_MODE_ECB;
if(CryptSetKeyParam(
hOriginalKey,
KP_MODE,
(BYTE*)&dwMode,
0))
{
printf("Key Parameters set. \n");
}
else
{
MyHandleError("Error during CryptSetKeyParam.");
}
// Generate a random initialization vector.
if(CryptGenRandom(
hCryptProv,
8,
pbData))
{
printf("Random sequence generated. \n");
}
else
{
MyHandleError("Error during CryptGenRandom.");
}
//-------------------------------------------------------------------
// Set the initialization vector.
if(CryptSetKeyParam(
hOriginalKey,
KP_IV,
pbData,
0))
{
printf("Parameter set with random sequence as "
"initialization vector. \n");
}
else
{
MyHandleError("Error during CryptSetKeyParam.");
}
//-------------------------------------------------------------------
// Clean up.
if (hOriginalKey)
if (!CryptDestroyKey(hOriginalKey))
MyHandleError("Failed CryptDestroyKey\n");
if (hDuplicateKey)
if (!CryptDestroyKey(hDuplicateKey))
MyHandleError("Failed CryptDestroyKey\n");
if(hCryptProv)
if (!CryptReleaseContext(hCryptProv, 0))
MyHandleError("Failed CryptReleaseContext\n");
printf("\nThe program ran to completion without error. \n");
} // End of main.
//-------------------------------------------------------------------
// This example uses the function MyHandleError, a simple error
// handling function, to print an error message and exit
// the program.
// For most applications, replace this function with one
// that does more extensive error reporting.
void MyHandleError(char *s)
{
printf("An error occurred in running the program.\n");
printf("%s\n",s);
printf("Error number %x\n.",GetLastError());
printf("Program terminating.\n");
exit(1);
}