Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
cin»KeyFrase ;
HCRYPTHASH hash=O; // дескриптор хеш-значения if (!CryptCreateHash(hProv, CALG_SHA, 0, 0, Shash)) { cout<<MessageOut("Ошибка при CryptCreateHash!\n"); getch(); return; }
if(!CryptHashData(hash, (BYTE*)KeyFrase, strlen (KeyFrase),0)) {
cout«MessageOut ("Ошибка при CryptHashData ! \n") ; getch(); return; }
// создание сеансового ключа HCRYPTKEY hKey=O;
if(ICryptDeriveKey(hProv, CALG_RC4, hash, CRYPT_ EXPORTABLE | CRYPT_CREATE_SALT/ ShKey)) { cout<<MessageOut("Ошибка при CryptDeriveKey!\n"); getch (); return; }
// разрушение хеш-значения if (hash) CryptDestroyHash(hash);
/* получение (создание при первом обращении) пары ключей обмена .*/
HCRYPTKEY hExpKey=0; /* дескриптор открытого ключа обмена */
HCRYPTKEY hSignKey=0; /* дескриптор открытого ключа ЭЦП */
if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, ShExpKey)) if((unsigned)GetLastError()==NTE_NO_KEY) if ( !CryptGenKey(hProv, AT_KEYEXCHANGE, 0, ShExpKey)) { cout«MessageOut ("Ошибка при создании ключей"\ "обмена через CryptGenKey!\п"); getch(); return; } else; else {
cout<<MessageOut("Ошибка при получении ключей"\ "обмена через CryptGetUserKey!\n"); getch (); return; }
/* получение (создание при первом обращении) пары ключей ЭЦП */
if(!CryptGetUserKey(hProv, AT_SIGNATURE, ShSignKey)) if((unsigned)GetLastError()==NTE_NO_KEY) if(!CryptGenKey(hProv, AT_SIGNATURE, 0, ShSignKey)) { cout<<MessageOut("Ошибка при создании ключей"\ подписи через CryptGenKey!\n");
getch();
return; }
else;
else {
cout«MessageOut ("Ошибка при получении ключей"\
"подписи через CryptGetUserKey!\п");
getch();
return; }
/* выполнение криптографических операций {см. подразд.
5.3 и 5.4)*/
II разрушение сеансового ключа
if(hKey) CryptDestroyKey(hKey);
// разрушение дескрипторов открытых ключей
if (hExpKey) CryptDestroyKey(hExpKey);
if(hSignKey) CryptDestroyKey(hSignKey);
// освобождение CSP
if(hProv) CryptReleaseContext(hProv, 0);
return; }
Для организации обмена открытыми ключами асимметричного шифрования возможны как использование удостоверяющих центров (см. подразд. 4.8), так и передача открытых ключей напрямую между пользователями:
отправитель экспортирует из криптопровайдера свой откры
тый ключ в форме блоба (типа PUBLICKEYBLOB) с помощью
функции CryptExportKey;
блоб посылается получателю по защищенному каналу связи
(например, в зашифрованном виде с помощью сеансового клю
ча, генерируемого из специальной ключевой фразы, или в от
крытом виде с возможной конвертацией в текстовый формат);
получатель блоба импортирует его в свой криптопровайдер
с помощью функции CryptlmportKey.
Для передачи сеансового ключа также могут применяться два способа. Первый способ: отправитель создает случайный сеансовый ключ (с помощью функции CryptGenKey), зашифровывает его при помощи ранее полученного открытого ключа получателя (используется функция CryptExportKey) в виде блоба типа SIMPLpBLOB, отправляет блоб получателю, который расшифровывает сеансовый ключ с помощью своего секретного ключа обмена (используется функция CryptlmportKey). Для снижения риска повторной посылки нарушителем перехваченного им ранее блоба с сеансовым ключом и зашифрованного с помощью этого ключа сообщения можно использовать отметки времени (аналогично протоколу Kerberos, см. подразд. 2.5) или последовательную нумерацию сообщений на основе случайного начального значения.