Пример программы C: настройка и получение параметров ключа сеанса
В следующем примере создается случайный ключ сеанса, возвращается и выводится некоторые параметры этого ключа по умолчанию, задаются новые параметры исходного ключа, а затем возвращается и выводится значение этого нового параметра. Она очищается путем уничтожения ключа сеанса и освобождения криптографического контекста.
В этом примере показано использование следующих задач и функций:
- Доступ к поставщику служб CSP с помощью CryptAcquireContext.
- Регистрация буфера со случайными байтами с помощью CryptGenRandom.
- Создание ключа сеанса с помощью CryptGenKey.
- Получение значения параметров ключа с помощью CryptGetKeyParam.
- Использование CryptSetKeyParam для изменения процесса создания ключа.
- Уничтожение ключей с помощью CryptDe encryptionKey.
- Освобождение поставщика служб CSP с помощью CryptReleaseContext.
В этом примере используется функция MyHandleError. Код для этой функции включен в пример. Код для этой и других вспомогательных функций также указан в разделе общего назначения Функции.
//-------------------------------------------------------------------
// 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.