«Взаимодействие с Cryptoapi. Криптопровайдеры» - umotnas.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Лабораторная работа «Взаимодействие с Cryptoapi. Криптопровайдеры» 1 298.11kb.
Лекция № Информационное взаимодействие. Взаимодействие человека и... 9 1922.15kb.
Общие сведения о персональных аппаратных криптопровайдерах 1 38.98kb.
Урок по теме «Закон сохранения импульса» 1 67.31kb.
Лабораторная работа №5 Программирование под Cryptoapi теоретические... 1 753.9kb.
Речевое взаимодействие в процессе коммуникативного обучения иноязычному... 1 63.05kb.
«Социальное взаимодействие. Социальный конфликт.» 1 142.46kb.
Агеев В. С. А 23 Межгрупповое взаимодействие: социально-психологичес­кие... 5 2021.87kb.
Лабораторная работа 4 Криптографическая защита данных с помощью microsoft... 3 446.48kb.
Программа дисциплины Взаимодействие журналиста с институтами власти... 1 151.92kb.
Взаимодействие науки, образования и бизнеса: Инновационные ландшафты... 1 31.46kb.
Рабочей программы дисциплины Алгоритмы и анализ сложности Место дисциплины... 1 14.6kb.
Викторина для любознательных: «Занимательная биология» 1 9.92kb.

«Взаимодействие с Cryptoapi. Криптопровайдеры» - страница №1/1

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

Кафедра «Математическое обеспечение вычислительных систем»

Лабораторная работа №4


По дисциплине: «ПО информационной безопасности сетей»


Тема: «Взаимодействие с CryptoAPI. Криптопровайдеры»

Вариант 1

Группа: ВСМУ 12-06

Студентка: Буланова Ю.В.

Руководитель: Федотова Д.Э.

Москва 2010

Цель работы: Знакомство с CryptoAPI и криптопровайдерами. Изучение базовых функций.

Задания:


Общее задание:

«Знакомство с учебной программой».



  1. Открыть в окне редактора текст учебной программы (прилагается) или взять себе копию листинга.

  2. Опираясь на комментарии в тексте программы, просмотреть его, представив себе пока еще общую картину алгоритма, разобраться в «крупных блоках» программы.

  3. Убедиться в наличии на рабочей машине файлов динамических библиотек advapi32.dll и crypt32.dll, в которых хранятся функции, связанные с криптооперациями.

  4. Выполнить программу (предварительно откомпилировав) и построчно проанализировать результат выполнения, сопоставляя его с текстом программы и отслеживая последовательное выполнение функций из библиотек.

Индивидуальные задания:

  1. Подробно и внимательно изучить теоретическое введение для данной лабораторной работы.

  2. Открыть исходный текст учебной программы и, опираясь на комментарии, найти ее фрагмент, указанный в вашем варианте.

  3. Детально изучить данный фрагмент, применяемые в нем функции библиотеки и последовательность их выполнения (опираясь на комментарии).

  4. Путем запуска программы на исполнение и анализа текста сообщений, выводимых на экран после выполнения кода функций на практике изучить работу каждой функции и всего программного блока в целом.

  5. Составить алгоритм, соответствующий данному фрагменту программы.

  6. Составить краткий отчет по выполнению лабораторной работы и вместе с отображенными на бумаге результатами выполнения п. 5 и п. 6 и ответами на контрольные вопросы и предоставить и защитить преподавателю.

Вариант:

Изучить фрагмент программы, связанный с открытием хранилища сертификатов и ошибками, связанными с этим действием.

Создание цифровой подписи.

Алгоритм:

CertOpenStore - открывает хранилище сертификатов

CertFindCertificateInStore – находит нужный сертификат

CryptAcquireCertificatePrivateKey –получает дескриптор CSP провайдера соответствующего сертификату

CryptCreateHash – создает хэш

CryptSignHash – шифрует созданный хэш

// Создание цифровой подписи

// Необходимо подключить библиотеку crypt32.lib

// Компиляция с использованием Visual Studio 7.0


#include

#include // exit(1)


#include

#include


//#include
#define MY_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
//#define _WIN32_WINNT=0x0400 // или _CRYPT32_
// Наименование персонального хранилища

#define CERT_STORE_NAME L"MY"


// Наименование сертификата установленного в это хранилище

#define SIGNER_NAME L"EVGENY"


void print_signature(DWORD cbSigned, BYTE* pbSigned);

void HandleError(char *s);


int main(int argc, char* argv[])

{

//--------------------------------------------------------------------



// Сообщение, которое мы подписываем
BYTE* pbMessage = (BYTE*)"ВАО Интурист - Туроператор N1";

DWORD cbMessage = (DWORD)strlen((char*) pbMessage)+1;


// Открываем хранилище сертификатов
HCERTSTORE hStoreHandle;
if ( !( hStoreHandle = CertOpenStore(

CERT_STORE_PROV_SYSTEM, //Тип поставщика памяти

0, //Тип кодирования не нужен

NULL,


CERT_SYSTEM_STORE_CURRENT_USER,

//CERT_SYSTEM_STORE_LOCAL_MACHINE,

CERT_STORE_NAME)))

{

HandleError("Нельзя открыть хранилище MY.");



}
// Получаем указатель на наш сертификат
PCCERT_CONTEXT pSignerCert;
if(pSignerCert = CertFindCertificateInStore(

hStoreHandle,

MY_TYPE,

0,

CERT_FIND_SUBJECT_STR,



SIGNER_NAME,

NULL))


{

printf("Сертификат найден.\n");

}

else


{

HandleError( "Сертификат не найден.");

}
// через функцию CryptAcquireCertificatePrivateKey получаем доступ к CSP
HCRYPTPROV hProv;

DWORD dwKeySpec;

BOOL fCallerFreeProv;
if(CryptAcquireCertificatePrivateKey(

pSignerCert,

CRYPT_ACQUIRE_COMPARE_KEY_FLAG,

NULL,


&hProv,

&dwKeySpec,

&fCallerFreeProv

))

{



printf("CryptAcquireCertificatePrivateKey выполнилась успешно!\n");

}

else



{

HandleError(" Ошибка CryptAcquireCertificatePrivateKey.\n");

}
// Создаем пустой hash объект

HCRYPTHASH hHash;


if(CryptCreateHash(

hProv,


CALG_MD5,

0,


0,

&hHash))

{

printf("Hash объект создан.\n");



}

else


{

HandleError("Ошибка CryptCreateHash.");

}
// Вычисляем hash для нашего сообщения

if(CryptHashData(

hHash,

pbMessage,



cbMessage,

0))


{

printf("Hash объект вычислен.\n");

}

else


{

HandleError("Ошибка CryptHashData.");

}
// Переменные для указателя и длины подписи

BYTE *pbSignature;

DWORD dwSigLen;
if(CryptSignHash(

hHash,


dwKeySpec,

NULL,


0,

NULL,


&dwSigLen))

{

printf("Длина подписи %d .\n",dwSigLen);



}

else


{

HandleError("Ошибка CryptSignHash.");

}
if(pbSignature = new BYTE[dwSigLen])

{

printf("Память под подпись выделена.\n");



}

else


{

HandleError("Ошибка памяти.");

}
if(CryptSignHash(

hHash,


dwKeySpec,

NULL,


0,

pbSignature,

&dwSigLen))

{

printf("Подпись:\n");



print_signature(dwSigLen, pbSignature);

}

else



{

HandleError("Ошибка CryptSignHash.");

}
if(pbSignature)

delete pbSignature;


if(hHash)

CryptDestroyHash(hHash);


if(hProv)

CryptReleaseContext(hProv, 0);


if(pSignerCert)

CertFreeCertificateContext(pSignerCert);


if(CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG))

{

printf("\nХранилище закрыто. \n");



}

else


{

printf("Ошибка!");

}

Результат:



Сертификат найден.

CryptAcquireCertificatePrivateKey выполнилась успешно!

Hash объект создан.

Hash объект вычислен.

Длина подписи 128 .

Память под подпись выделена.

Подпись:

667387adc8449acabc3378df8225136f2e1cfca612d202e58476bde34b6251cd2ca3c9be22fbce27e504d69920266c8c4611f2d82384b7115894c1128b239e059a5d83af8b91ec82944fb4bf75d4d5a071afdd426b3670387f128d36250fb0ba493ca49747133f62d982e5c5b9d08b5e9e5c70db3d532950350803a8e937df71

Хранилище закрыто.

Функции:


CertOpenStore - открывает хранилище сертификатов

CertFindCertificateInStore – находит нужный сертификат



Открытие хранилища сертификатов:

Начало


Если CertOpenStore= NULL

Сообщение об ошибке

Иначе

получаем указатель на сертификат



Конец

Получаем указатель на сертификат:

Начало

Если CertFindCertificateInStore<> NULL



Сообщение «Сертификат найден»

Иначе


Сообщение «Сертификат не найден»

Конец