страница 1
|
||
Похожие работы
|
«Взаимодействие с Cryptoapi. Криптопровайдеры» - страница №1/1
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ) Кафедра «Математическое обеспечение вычислительных систем» Лабораторная работа №4 По дисциплине: «ПО информационной безопасности сетей»Тема: «Взаимодействие с CryptoAPI. Криптопровайдеры» Вариант 1 Группа: ВСМУ 12-06 Студентка: Буланова Ю.В. Руководитель: Федотова Д.Э. Москва 2010 Цель работы: Знакомство с CryptoAPI и криптопровайдерами. Изучение базовых функций. Задания: Общее задание: «Знакомство с учебной программой».
Индивидуальные задания:
Вариант: Изучить фрагмент программы, связанный с открытием хранилища сертификатов и ошибками, связанными с этим действием. Создание цифровой подписи. Алгоритм: 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( "Сертификат не найден."); } DWORD dwKeySpec; BOOL fCallerFreeProv; pSignerCert, CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL, &hProv, &dwKeySpec, &fCallerFreeProv )) { printf("CryptAcquireCertificatePrivateKey выполнилась успешно!\n"); } else { HandleError(" Ошибка CryptAcquireCertificatePrivateKey.\n"); } HCRYPTHASH hHash; if(CryptCreateHash( hProv, CALG_MD5, 0, 0, &hHash)) { printf("Hash объект создан.\n"); } else { HandleError("Ошибка CryptCreateHash."); } if(CryptHashData( hHash, pbMessage, cbMessage, 0)) { printf("Hash объект вычислен.\n"); } else { HandleError("Ошибка CryptHashData."); } BYTE *pbSignature; DWORD dwSigLen; hHash, dwKeySpec, NULL, 0, NULL, &dwSigLen)) { printf("Длина подписи %d .\n",dwSigLen); } else { HandleError("Ошибка CryptSignHash."); } { printf("Память под подпись выделена.\n"); } else { HandleError("Ошибка памяти."); } hHash, dwKeySpec, NULL, 0, pbSignature, &dwSigLen)) { printf("Подпись:\n"); print_signature(dwSigLen, pbSignature); } else { HandleError("Ошибка CryptSignHash."); } 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("Ошибка!"); } Результат:
Открытие хранилища сертификатов: Начало Если CertOpenStore= NULL Сообщение об ошибке Иначе получаем указатель на сертификат Конец Получаем указатель на сертификат: Начало Если CertFindCertificateInStore<> NULL Сообщение «Сертификат найден» Иначе Сообщение «Сертификат не найден» Конец |
|