Пример программы C. Создание и хэширование ключа сеанса
В следующем примере создается и хэшируетключ сеанса , который можно использовать для шифрования сообщения, текста или файла.
В этом примере также показано использование следующих функций CryptoAPI:
- CryptAcquireContext для получения поставщика служб шифрования.
- CryptCreateHash для создания пустого хэш-объекта.
- CryptGenKey для создания случайного ключа сеанса.
- CryptHashSessionKey для хэширования созданного ключа сеанса.
- CryptDeographyHash для уничтожения хэша.
- CryptDeographyKey для уничтожения созданного ключа.
- CryptReleaseContext для выпуска CSP.
В этом примере используется функция MyHandleError. Код для этой функции включен в пример. Код для этой и других вспомогательных функций также указан в разделе общего назначения Функции.
// Copyright (C) Microsoft. All rights reserved.
//
// CreateAndHashSessionKey.cpp : Defines the entry point for the
// application.
//
#include <stdafx.h>
#include <stdio.h>
#include <windows.h>
#include <Wincrypt.h>
// Link with the Crypt32.lib file.
#pragma comment (lib, "Crypt32")
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void MyHandleError(LPTSTR psz);
void main()
{
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
//---------------------------------------------------------------
// Acquire a cryptographic provider context handle.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
printf("CryptAcquireContext complete. \n");
}
else
{
MyHandleError("Acquisition of context failed.");
}
//---------------------------------------------------------------
// Create a hash object.
if(CryptCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hHash))
{
printf("An empty hash object has been created. \n");
}
else
{
MyHandleError("Error during CryptBeginHash!\n");
}
//---------------------------------------------------------------
// Create a random session key.
if(CryptGenKey(
hCryptProv,
CALG_RC2,
CRYPT_EXPORTABLE,
&hKey))
{
printf("A random session key has been created. \n");
}
else
{
MyHandleError("Error during CryptGenKey!\n");
}
//---------------------------------------------------------------
// Compute the cryptographic hash on the key object.
if(CryptHashSessionKey(
hHash,
hKey,
0))
{
printf("The session key has been hashed. \n");
}
else
{
MyHandleError("Error during CryptHashSessionKey!\n");
}
/*
Use the hash of the key object. For instance, additional data
could be hashed and sent in a message to several recipients. The
recipients will be able to verify who the message originator is
if the key used is also exported to them.
*/
//---------------------------------------------------------------
// Clean up.
// Destroy the hash object.
if(hHash)
{
if(!(CryptDestroyHash(hHash)))
{
MyHandleError("Error during CryptDestroyHash");
}
}
// Destroy the session key.
if(hKey)
{
if(!(CryptDestroyKey(hKey)))
{
MyHandleError("Error during CryptDestroyKey");
}
}
// Release the provider.
if(hCryptProv)
{
if(!(CryptReleaseContext(hCryptProv,0)))
{
MyHandleError("Error during CryptReleaseContext");
}
}
} // End main.
// Define function MyHandleError.
void MyHandleError(LPTSTR 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.