Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gibridnoe_shifrovanie.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
32.64 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Воронежский государственный технический университет

Кафедра систем информационной безопасности

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

по дисциплине: «Методы программирования»

Выполнил:

студент группы КБ-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;}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]