
- •Задание кафедры
- •Создание контейнера и генерация пары ключей
- •Шифрование
- •If (!CryptAcquireContext(&hProv,(lpctstr)UserName,null,prov_rsa_full,0)) return 0;
- •If (!CryptGetUserKey(hProv, at_keyexchange, &hPublicKey)) return 0;
- •Расшифрование
- •If (!CryptAcquireContext(&hProv,(lpctstr)UserName,null,prov_rsa_full,0)) return 0;
- •If (!CryptGetUserKey(hProv, at_keyexchange, &hPublicKey)) return 0;
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Воронежский государственный технический университет
Кафедра систем информационной безопасности
Лабораторная работа
по дисциплине: «Методы программирования»
Выполнил:
студент группы КБ-111
Серегин С.А. и Девяшин А.В.
Принял:
Куликов С.С.
Воронеж 2012
Задание кафедры
Реализовать алгоритм асимметричной схемы шифрования.
Создание контейнера и генерация пары ключей
// Shifr.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <WinCrypt.h>
#pragma comment (lib,"advapi32.lib")
using namespace std;
int main()
{
setlocale(0,"RUS");
HCRYPTPROV hProv = NULL;
HCRYPTHASH hHash=NULL;
LPCSTR UserName = "SSContainer";
HCRYPTKEY hKey, hPublicKey, hNewKey;
DWORD BS=0;
BYTE pbBuffer[4096];
int i=0;
////////Извлекаем текст
printf("\nText: ");
FILE *pf;
char ch;
if((pf=fopen("text.txt","r"))!=NULL)
{
do
{
ch=getc(pf);
if(!feof(pf))
{
pbBuffer[i]=(BYTE)ch;
printf("%c",pbBuffer[i]);
i++;
BS=i;
}
}
while(!feof(pf));
fclose(pf);
}
// Инициализация контекста криптопровайдера (с указанием имени
// контейнера ключей)
if (!CryptAcquireContext(&hProv,(LPCTSTR)UserName,NULL,PROV_RSA_FULL,0)) return 0;
std::cout << "\nCryptographic provider initialized" << std::endl;
////////
// Генерация ключа для тестирования
if(!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
printf("Error during CryptCreateHash!\n");
return 0;
}
else printf("\nСоздание хеш-объекта завершено...\n");
/////
if (!CryptDeriveKey(hProv,CALG_RC4,hHash,CRYPT_EXPORTABLE,&hKey)) return 0;
std::cout << "Session key generated\n" << std::endl;
/////////
/*/ Генерация ключа для тестирования
if (!CryptGenKey(hProv,CALG_RC4,CRYPT_EXPORTABLE,&hKey)) return 0;
std::cout << "Session key generated" << std::endl;*/
// Получение ключа для экспорта ключа шифрования
if (!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hPublicKey)) return 0;
std::cout << "Public key is received" << std::endl;
/////////
DWORD pbwDataLen=0;
LPBYTE pbData=NULL;
// Экспорт ключа шифрования
if (!CryptExportKey(hKey, hPublicKey,SIMPLEBLOB,0,0,&pbwDataLen))
return 0;
std::cout << "\nSize blob determined" << std::endl;
if(pbData = (LPBYTE)malloc(pbwDataLen))
{
printf("Memory has been allocated for the BLOB. \n");
}
else
{
printf("Out of memory. \n");
return 0;
}
if (!CryptExportKey(hKey, hPublicKey,SIMPLEBLOB,0,pbData,&pbwDataLen))
return 0;
std::cout << "\nBLOB is completed" << std::endl;
cout<<endl<<"Blob записанный в файл: ";
FILE *f1;
f1=fopen("key.txt","w");
for (i=0;i<pbwDataLen;++i) {
printf("%c",pbData[i]);
fprintf(f1,"%u",pbData[i]);
fprintf(f1,"%s"," ");
}
fclose(f1);
printf("\nКлюч сохранен в файле \"key.txt\"...\n");
//////////////////////
if(!CryptEncrypt(hKey,0,true,0,pbBuffer,&BS,BS))
{
printf("Error during CryptDeriveKey!\n");
return 0;
}
else printf("Текст зашифрован...\n");
////////Сохраняем в файле
if((f1=fopen("shifr.txt","w"))!=NULL)
{
for(i=0;i<BS;i++)
{
fprintf(f1,"%c",pbBuffer[i]);
}
fclose(f1);
printf("Текст сохранен в файле \"shifr.txt\"...\n");
}
printf("\nok\n");return 0;}