Programa C de ejemplo: establecer y obtener parámetros de clave de sesión
En el ejemplo siguiente se crea una clave de sesión aleatoria, se obtienen e imprimen algunos parámetros predeterminados de esa clave, se establecen nuevos parámetros en la clave original y, a continuación, se obtiene e imprime el valor de ese nuevo parámetro. Se limpia destruyendo la clave de sesión y liberando el contexto criptográfico.
En este ejemplo se muestra el uso de las siguientes tareas y funciones:
- Acceso a un CSP mediante CryptAcquireContext.
- Archivar un búfer con bytes aleatorios mediante CryptGenRandom.
- Creación de una clave de sesión mediante CryptGenKey.
- Obtención del valor de los parámetros de clave mediante CryptGetKeyParam.
- Usar CryptSetKeyParam para modificar el proceso de generación de claves.
- Destruir las claves mediante CryptDestroyKey.
- Liberar el CSP con CryptReleaseContext.
En este ejemplo se usa la función MyHandleError. El código de esta función se incluye con el ejemplo. El código de esta y otras funciones auxiliares también se muestra en De uso general 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.