Exemplo de programa C: definindo e obtendo parâmetros de chave de sessão
O exemplo a seguir cria uma chave de sessão aleatória, obtém e imprime alguns parâmetros padrão dessa chave, define novos parâmetros na chave original e, em seguida, obtém e imprime o valor desse novo parâmetro. Ele limpa destruindo a chave de sessão e liberando o contexto criptográfico.
Este exemplo ilustra o uso das seguintes tarefas e funções:
- Acessar um CSP usando CryptAcquireContext.
- Arquivar um buffer com bytes aleatórios usando CryptGenRandom.
- Criando uma chave de sessão usando CryptGenKey.
- Obter o valor dos parâmetros de chave usando CryptGetKeyParam.
- Usando CryptSetKeyParam para alterar o processo de geração de chave.
- Destruindo as chaves usando CryptDestroyKey.
- Liberando o CSP com CryptReleaseContext.
Este exemplo usa a função MyHandleError. O código para essa função está incluído no exemplo. O código para essa e outras funções auxiliares também está listado em Uso Geral Functions.
//-------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <tchar.h>
// Link with the Crypt32.lib file.
#pragma comment (lib, "Crypt32")
void MyHandleError(PCTSTR psz);
void main()
{
HCRYPTPROV hProv;
HCRYPTKEY hKey;
DWORD dwMode;
BYTE pbData[16];
BYTE pbRandomData[8];
DWORD dwCount;
DWORD i;
// Acquire a cryptographic provider context handle.
if(!CryptAcquireContext(
&hProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
MyHandleError(TEXT("Error during CryptAcquireContext."));
}
// Generate eight bytes of random data into pbRandomData.
if( CryptGenRandom(
hProv,
8,
pbRandomData))
{
_tprintf(TEXT("Eight bytes of random data have been generated.\n"));
}
else
{
MyHandleError(TEXT("Random bytes were not correctly generated."));
}
// Create a random block cipher session key.
if(!CryptGenKey(
hProv,
CALG_RC4,
CRYPT_EXPORTABLE,
&hKey))
{
MyHandleError(TEXT("Error during CryptGenKey."));
}
// Read the cipher mode.
dwCount = sizeof(DWORD);
if(CryptGetKeyParam(
hKey,
KP_MODE,
(PBYTE)&dwMode,
&dwCount,
0))
{
// Print the cipher mode.
_tprintf(TEXT("Default cipher mode: %d\n"), dwMode);
}
else
{
MyHandleError(TEXT("Error during CryptGetKeyParam."));
}
// Read the initialization vector.
// Get the length of the initialization vector.
if(!CryptGetKeyParam(
hKey,
KP_IV,
NULL,
&dwCount,
0))
{
MyHandleError(TEXT("Error getting the IV length"));
}
// Get the initialization vector, itself.
if(CryptGetKeyParam(
hKey,
KP_IV,
pbData,
&dwCount,
0))
{
// Print the initialization vector.
_tprintf(TEXT("Default IV:"));
for(i = 0; i < dwCount; i++)
{
_tprintf(TEXT("%2.2x "),pbData[i]);
}
_tprintf(TEXT("\n"));
}
else
{
MyHandleError(TEXT("Error getting the IV."));
}
// Reset the initialization vector.
if(CryptSetKeyParam(
hKey,
KP_IV,
pbRandomData,
0))
{
_tprintf(TEXT("New initialization vector is set.\n"));
}
else
{
MyHandleError(TEXT("The new IV was not set."));
}
// Read the new initialization vector.
// Get the length of the new initialization vector.
if(!CryptGetKeyParam(
hKey,
KP_IV,
NULL,
&dwCount,
0))
{
MyHandleError(TEXT("Error getting the IV length"));
}
// Get the initialization vector, itself.
if(CryptGetKeyParam(
hKey,
KP_IV,
pbData,
&dwCount,
0))
{
// Print the initialization vector.
_tprintf(TEXT("RE-set IV:"));
for(i = 0; i < dwCount; i++)
{
_tprintf(TEXT("%2.2x "),pbData[i]);
}
_tprintf(TEXT("\n"));
}
else
{
MyHandleError(TEXT("Error getting the IV."));
}
// Clean up.
// Destroy the session key.
if(hKey)
{
CryptDestroyKey(hKey);
}
// Release the provider handle.
if(hProv)
{
CryptReleaseContext(hProv, 0);
}
} // End of main.
//-------------------------------------------------------------------
// This example uses the function MyHandleError, a simple error
// handling function, to print an error message to the standard
// error (stderr) file and exit the program.
// For most applications, replace this function with one
// that does more extensive error reporting.
void MyHandleError(PTSTR psz)
{
_ftprintf(stderr, TEXT("An error occurred in the program. \n"));
_ftprintf(stderr, TEXT("%s\n"), psz);
_ftprintf(stderr, TEXT("Error number %x.\n"), GetLastError());
_ftprintf(stderr, TEXT("Program terminating. \n"));
exit(1);
} // End of MyHandleError.