Ім'я файлу: Курсова.docx
Розширення: docx
Розмір: 443кб.
Дата: 17.11.2022
скачати

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ

Кафедра комп’ютеризованих систем захисту інформації

КУРСОВА РОБОТА

з дисципліни

“Прикладна криптологія”
Виконав:

студент УБ-475

Варіант № 14

Недогон Максим Андрійович
Перевірив:

Доцент кафедри КСЗІ Ільєнко А.В.

Київ 2022

ЗМІСТ



ЗАВДАННЯ 3

Вступ 5

Теоретичні відомості 6

Практична частина 11

1.Хід роботи 11

2.Код програми 13

3.Інтерфейс користувацької програми 18

ВИСНОВКИ 22

СПИСОК ЛІТЕРАТУРИ 23


ЗАВДАННЯ



Для реалізації всіх цілей використовуйте криптографічні можливості, що надаються інтерфейсом Microsoft CryptoAPI.

Варіант завдання :




Вар.

Алгоритм шифрування

Режим шифрування

Довжина

ключа, біт

Размір блоку,

біт

14

RC4

-

128

-


Реалізуйте програмний засіб захищеного обміну файлами. У функції програми входять шифрування і дешифрування файлів на дисках за допомогою алгоритму симетричного шифрування.
Програма-шифратор:

1. Симетричний алгоритм шифрування вказано в таблиці.

2. Для симетричного шифрування файлу використовуйте сесійний ключ KS симетричного алгоритму.

3. Показати два варіанти генерації сесійного ключа KS: 1 варіант. за допомогою системи управління криптографічними ключами; 2 варіант. За парольною фразою. У вигляді парольної фрази виступатиме прізвище на латиниці.

4. Вибір файлу для шифрування. Файл міститься локально на комп'ютері користувача.

5. Шифрування файлу за допомогою сесійного ключа KS.

6. Для безпечного зберігання сесійного ключа KS разом із зашифрованим файлом використовуйте асиметричне шифрування за допомогою пари ключів поточного користувача системи. Користувач створює ключову пару RSA розміром 1024 біт. На підставі відкритого ключа створює запит на сертифікацію і передає його в локальний центр сертифікації. Отримує з локального центру сертифікації сертифікат Х.509 свого відкритого ключа та сертифікат Х.509 відкритого ключа центру сертифікації. Сертифікат Х.509 свого відкритого ключа необхідно розмістити в сховище WINDOWS.

7. Витягти відкритий ключ одержувача з сертифіката Х.509.

8. Провести шифрування сеансового ключа відкритим ключем RSA одержувача і додати до зашифрованого файлу зашифрований сеансовий ключ.

9. Збереження шифротектса в зазначеному файлі.
Програма-дешифратор

1. Отримання інформації про існуючі Криптопровайдери і підтримувані ними алгоритми симетричного шифрування.

2. Вибір алгоритму симетричного шифрування для поточного сеансу шифрування.

3. Дешифрувати зашифрований сеансовий ключ KS, використовуючи закритий ключ одержувача.

4. Вибір зашифрованого файлу, що містить текст, призначений для дешифрування.

5. Збереження відновленого тексту в зазначений файл.

Вступ




Радикальне розв’язання проблем захисту інформації, що циркулює у високопродуктивних телекомунікаційних системах, може бути отримане на базі використання криптографічного захисту інформації. Криптографічний захист може забезпечити виконання умов збереження конфіденційності й цілісності даних, що передаються у відкритих мережах, а також анонімність об’єкта й умови його причетності до дій, що здійснюються в ТКС.

Криптографічна система захисту інформації — це сукупність криптографічних алгоритмів, протоколів і процедур формування, розподілу, передачі й використання криптографічних ключів.

На сьогоднішній день існує величезна кількість криптографічних алгоритмів, що відрізняються як своїми загальними характеристиками, так і принципами, на яких базується їх робота. Не всі вони є однаково надійними - серед них є навіть такі, що оформлені як стандарти та при цьому не забезпечують скільки-небудь реального захисту. Насправді ж, створення надійного криптографічного алгоритму - дуже важка задача. Крім того, надійність є відносна річ - багато з раніше розроб­лених алгоритмів, які вважалися надійними, тепер або ненадійні, або ця надійність викликає великий сумнів. Тому при розробці криптографічного алгоритму необхідно враховувати тенденціі розвитку комп'ютерної техніки а також інші фактори, що потенційно можуть знизити його стійкість в майбутньому.

Теоретичні відомості



Алгоритм RC4

RC4 (від англ. Rivest cipher 4 або Ron's code), також відомий як ARC4 або ARCFOUR (alleged RC4) - потоковий шифр, який широко застосовується в різних системах захисту інформації в комп'ютерних мережах (наприклад, в протоколах SSL і TLS, алгоритмах забезпечення безпеки бездротових мереж WEP і WPA).

Шифр розроблений компанією «RSA Security», і для його використання потрібна ліцензія.

Алгоритм RC4, як і будь-який потоковий шифр, будується на основі генератора псевдовипадкових бітів. На вхід генератора записується ключ, а на виході читаються псевдовипадкові біти. Довжина ключа може становити від 40 до 2048 біт. Генеруються біти мають рівномірний розподіл.

Основні переваги шифру:

  • висока швидкість роботи;

  • змінний розмір ключа.

  • RC4 досить уразливий, якщо:

  • використовуються не випадкові або пов'язані ключі;

  • один ключовий потік використовується двічі.

Ці фактори, а також спосіб використання можуть зробити криптосистему небезпечною (наприклад, WEP).

Ядро алгоритму поточних шифрів складається з функції - генератора псевдо випадкових бітів (гами), який видає потік бітів ключа (ключовий потік, гаму, послідовність псевдо випадкових бітів).
Алгоритм шифрування.



Функція генерує послідовність бітів (ki).

Потім послідовність бітів за допомогою операції «підсумовування по модулю два» (xor) об'єднується з відкритим текстом (mi). В результаті виходить шифрограма (ci):

ci=miki

Алгоритм розшифровки.

Повторно створюється (регенерується) потік бітів ключа (ключовий потік) (ki).

Потік бітів ключа складається з шифрограмою (ci):

операцією «xor». В силу властивостей операції «xor» на виході виходить вихідний (не зашифровані) текст mi:

mi= ci ⊕ki=( mi⊕ki)⊕ki

RC4 - фактично клас алгоритмів, що визначаються розміром блоку (надалі S-блоку). Параметр n є розміром слова для алгоритму і визначає довжину S-блоку. Зазвичай, n = 8, але в цілях аналізу можна зменшити його. Однак для підвищення безпеки необхідно збільшити цю величину. В алгоритмі немає протиріч на збільшення розміру S-блоку. При збільшенні n, припустимо, до 16 біт, елементів в S-блоці стає 65 536 і відповідно час початкової ітерації буде збільшено. Однак, швидкість шифрування зросте.

Внутрішній стан RC4 представляється у вигляді масиву розміром 2n і двох лічильників. Масив відомий як S-блок, і далі буде позначатися як S. Він завжди містить перестановку 2n­­ можливих значень слова. Два лічильника позначені через i і j.

Ініціалізація RC4 складається з двох частин:

  • ініціалізація S-блоку;

  • генерація псевдо-випадкового слова K.

  • Ініціалізація S-блоку

Алгоритм також відомий як «key-scheduling algorithm» або «KSA». Цей алгоритм використовує ключ, що подається на вхід користувачем, збережений в Key, і має довжину L байт. Ініціалізація починається з заповнення масиву S, далі цей масив перемішується шляхом перестановок, які визначаються ключем. Так як тільки одну дію виконується над S, то повинно виконуватися твердження, що S завжди містить один набір значень, який був даний при початкової ініціалізації (S [i]: = i).

for i from 0 to 255

S[i] := i

endfor

j := 0

for i from 0 to 255

j := ( j + S[i] + Key[ i mod L ] ) mod 256 // n = 8 ; 28 = 256

поміняти місцями S[i] и S[j]

endfor
Генерація псевдо-випадкового слова K

Ця частина алгоритму називається генератором псевдослучайной послідовності (англ. Pseudo-random generation algorithm, PRGA). Генератор ключового потоку RC4 переставляє значення, що зберігаються в S. В одному циклі RC4 визначається одне n-бітове слово K з ключового потоку. Надалі ключове слово буде складено по модулю два з вихідним текстом, яке користувач хоче зашифрувати, і отриманий зашифрований текст.



i := 0

j := 0

while Цикл генераціи:

i := ( i + 1 ) mod 256

j := ( j + S[i] ) mod 256

поміняти місціми S[i] и S[j]

t := ( S[i] + S[j] ) mod 256

K := S[t]

сгенерировано псевдовипадкове слово K (для n = 8 буде сгенерован один байт)

endwhile


Алгоритм RSA

Основні відомості

Алгоритм шифрування з відкритим ключем RSA був запропонований одним з перших в кінці 70-х років ХХ століття. Його назва складається з перших букв прізвищ авторів: Р.Райвеста (R.Rivest), А.Шаміра (A.Shamir) і Л.Адлемана (L.Adleman). Алгоритм RSA є, напевно, найбільш популярним і широко застосовуваним асиметричним алгоритмом в криптографічних системах.

Алгоритм заснований на використанні того факту, що завдання розкладання великого числа на прості множники є важким. Криптографічна система RSA базується на наступних двох фактах з теорії чисел:

- задача перевірити числа на простоту є порівняно легкою;

- задача розкладання чисел виду n = pq (р і q - прості числа); на множники є дуже важкою, якщо ми знаємо тільки n, а р і q - великі числа (це так звана задача факторизації).

Алгоритм RSA є блоковим алгоритмом шифрування, де зашифровані і незашифровані дані повинні бути представлені у вигляді цілих чисел між 0 і n -1 для деякого n.
Шифрування

Нехай абонент А хоче передати зашифроване повідомлення абоненту Б. У цьому випадку абонент Б повинен підготувати пару (відкритий ключ; закритий ключ) і відправити свій відкритий ключ користувачеві А.

Першим етапом є генерація відкритого і закритого ключів. Для цього спочатку вибираються два великих простих числа p і q. Потім обчислюється добуток n: n=pq;

Після цього визначається допоміжне число f(n): f = (p - l) (q - 1).

Потім випадковим чином вибирається число e
Далі необхідно знайти число d, таке, що ed+fy = 1.

Числа e і n будуть відкритим ключем користувача, а значення d - закритим ключем.

На цьому етап підготовки ключів закінчений і можна використовувати основний протокол RSA для шифрування даних.

Другий етап - шифрування даних. Якщо абонент А хоче передати деякі дані абоненту Б, він повинен представити своє повідомлення в цифровому вигляді і розбити його на блоки m1, m2, m3, ..., де mi
Абонент А шифрує кожен блок свого повідомлення по формулі



використовуючи відкриті параметри користувача Б, і пересилає зашифроване повідомлення С = (с1, с2, с3, ...) по відкритій лінії.

Абонент Б, який отримав зашифроване повідомлення, розшифровує все блоки отриманого повідомлення по формулі



Всі розшифровані блоки будуть точно такими ж, як і вихідні від користувача А.

Зловмисник, що перехоплює всі повідомлення і знає всю відкриту інформацію, не зможе знайти вихідне повідомлення при великих значеннях Р і Q.

Практична частина



  1. Хід роботи




В ході роботи було використано наступні функції:

CryptAcquireContext. За допомогою даної функції в першу чергу проводиться ініціалізація контексту криптопровайдера (отримання посилання на HANDLE, яку в подальшому можна використовувати в інших функціях). Також за допомогою останнього параметра даної функції можна створити або видалити контейнер ключів.

CryptGetProvParam. За допомогою цієї функції можна отримати значення різних параметрів криптопровайдера. Потрібно сказати, що для всіх криптопровайдерів стандартом визначено лише обмежений набір параметрів. Набір параметрів криптопровайдера може сильно варіюватися в залежності від реалізації криптопровайдера.

CryptGenKey. Ця функція призначена для генерації сесійного ключа (ключ, який використовується тільки протягом поточної сесії роботи), а також для генерації пар ключів для обміну (публічний і закритий ключ) і цифрового підпису.

CryptGetUserKey. Функція призначена для отримання значення публічного ключа для зазначеного контейнера ключів. Використовується для отримання значень публічних ключів, призначених для обміну ключами і цифрового підпису.

CryptGetKeyParam. Функція призначена для отримання різних параметрів ключа. Як параметри використовуються алгоритм ключа (його цифровий позначення в системі), прапори дозволу використання ключа (наприклад, якщо відсутній встановлений прапор ключа CRYPY_ENCYPT, даними ключем неможливо буде зашифрувати дані), дані про довжину блоку ключа і багато іншого. У практичних реалізаціях даної функції слід приділяти чималу увагу, так як часто саме від параметрів ключа залежить робота використовуваного алгоритму криптопровайдера.

CryptSetKeyParam. Функція, зворотна попередньої. Використовується для установки параметрів ключа.

CryptDeriveKey. Функція призначена для генерації сесійного ключа на основі хешу даних. Тобто дана функція генерує один і той же сесійний ключ, якщо їй передаються однакові значення хешу даних. Функція корисна в разі генерації сесійного ключа на основі пароля.

CryptGenRandom. Функція використовується для заповнення переданого їй буфера випадковими даними. Використовується, наприклад, для генерації нового імені контейнера ключів.

CryptExportKey. Функція експорту ключа для його передачі по каналах інформації. Можуть бути різні варіанти передачі ключа, включаючи передачу публічного ключа пари ключів, а також передачу секретного або сесійного ключа.

CryptImportKey. Функція, зворотна попередньої. Призначена для отримання з каналів інформації значення ключа.

CryptEncrypt. Основна базова функція шифрування даних. Як параметри використовує раніше отримані контексти криптопровайдера і сесійного ключа. Дані, які генеруються на виході цієї функції, не є форматувати і не містять ніякої іншої інформації, крім шифрованого контенту (на відміну від, скажімо, стандарту PKCS # 7, що використовує спільну передачу кодованих даних і експортованого сесійного ключа).

CryptDecrypt. Основна базова функція розшифрування даних. Як параметри використовуються раніше отримані контекст криптопровайдера і хендл сесійного ключа.

CryptCreateHash. Функція створює хеш-об'єкт, призначений для генерації хеш-значення даних. В якості основних параметрів приймає раніше отримані контекст криптопровайдера і алгоритм формування хешу даних.

CryptHashData. Основна функція хешування даних. Найважливішим параметром цієї функції є посилання на хешіруемие дані.
  1. Код програми



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

#include

#pragma hdrstop

#include

#include

#include "Unit1.h"

#include "fstream.h"

#pragma comment(lib,"crypt32.lib")

#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

using namespace std;

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{}

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

HCRYPTKEY hK = 0, hKey, hKeyDec;

HCRYPTPROV hProv = 0, hP = 0, hPro=0;

HCRYPTHASH hHash;

HCRYPTKEY hKeyEx;

HCRYPTHASH hHashEx;

HCRYPTKEY *phUserKey;

DWORD Param = CRYPT_MODE_CFB;

DWORD dwMode = CRYPT_MODE_CFB;

BYTE Buf[8];

DWORD pType;

DWORD Len;

BYTE pbData[16];

BYTE pbRandomData[8];

int q, u=0,o=0;

HCRYPTKEY asdKey;

HCRYPTKEY phUserKey2;

DWORD dwBlobLenght;

BYTE *ppbKeyBlob = NULL;

void __fastcall TForm1::FormCreate(TObject *Sender)

{Edit1->Visible=False;

Label1->Visible=False;

LPTSTR pbProvName = NULL;

LPTSTR pszName = NULL;

DWORD dwType;

DWORD cbName;

DWORD dwIndex = 0;

while(CryptEnumProviderTypes(dwIndex,NULL,0,&dwType,NULL,&cbName))

{ pszName = (LPTSTR) malloc(cbName);

if(!pszName)

Form1->Memo5->Lines->Add("ERROR - malloc failed!");

memset(pszName, 0, cbName);

if(CryptEnumProviderTypes(dwIndex++,NULL,0,&dwType,pszName,&cbName))

{Form1->Memo5->Lines->Add(IntToStr(dwType));

Form1->Memo6->Lines->Add(pszName);}

else

{Form1->Memo6->Lines->Add("ERROR - CryptEnumProviders"); }}

dwIndex = 0;

while(CryptEnumProviders(dwIndex,NULL,0,&dwType,NULL,&cbName))

{ pszName = (LPTSTR)malloc(cbName);

if(!pszName)

Form1->Memo7->Lines->Add("ERROR - malloc failed!");

memset(pszName, 0, cbName);

if(CryptEnumProviders(dwIndex++,NULL,0,&dwType,pszName,&cbName))

{Form1->Memo7->Lines->Add(IntToStr(dwType));

Form1->Memo8->Lines->Add(pszName);}

else

{Form1->Memo8->Lines->Add("ERROR - CryptEnumProviders");}}

Form1->Memo8->Lines->Add("\r\nProvider types and provider names have been listed.\r\n");

HCRYPTPROV hProvF2;

if(!CryptAcquireContextW(&hProvF2,NULL,NULL,PROV_RSA_SCHANNEL,0) && (!CryptAcquireContextW( &hProvF2,NULL,NULL,PROV_RSA_SCHANNEL,CRYPT_NEWKEYSET)))

{ ShowMessage("Помилка"); }

if(!CryptAcquireContext(&hProvF2, NULL, NULL,PROV_RSA_SCHANNEL,0) &&(!CryptAcquireContext(&hProvF2,NULL,NULL,PROV_RSA_SCHANNEL,CRYPT_NEWKEYSET)))

{ShowMessage("Помилка");}

DWORD dwTypeF2;

DWORD cbNameF2;

BYTE *ptrF2 = NULL;

ALG_ID aiAlgidF2;

DWORD dwBitsF2;

DWORD dwNameLenF2;

CHAR szNameF2[100];

BYTE pbDataF2[1024];

DWORD cbDataF2=1024;

DWORD dwIncrementF2 = sizeof(DWORD);

DWORD dwFlagsF2 = CRYPT_FIRST;

CHAR *pszAlgTypeF2 = NULL;

BOOL fMoreF2 = TRUE;

DWORD cbProvNameF2;

while(fMoreF2)

{if(CryptGetProvParam(hProvF2, PP_ENUMALGS, pbDataF2, &cbDataF2, dwFlagsF2))

{dwFlagsF2=0;

ptrF2 = pbDataF2;

aiAlgidF2 = *(ALG_ID *)ptrF2;

ptrF2 += sizeof(ALG_ID);

dwBitsF2 = *(DWORD *)ptrF2;

ptrF2 += dwIncrementF2;

dwNameLenF2 = *(DWORD *)ptrF2;

ptrF2 += dwIncrementF2;

strncpy(szNameF2, (char *) ptrF2, dwNameLenF2);

switch(GET_ALG_CLASS(aiAlgidF2)) {

case ALG_CLASS_DATA_ENCRYPT: pszAlgTypeF2 = "Encrypt ";break;

case ALG_CLASS_HASH: pszAlgTypeF2 = "Hash ";break;

case ALG_CLASS_KEY_EXCHANGE: pszAlgTypeF2 = "Exchange ";break;

case ALG_CLASS_SIGNATURE: pszAlgTypeF2 = "Signature";break;

default: pszAlgTypeF2 = "Unknown ";}

Form1->Memo9->Lines->Add(szNameF2);}

else

fMoreF2 = FALSE;}}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)

{

if(RadioButton1->Checked==True)

{ShowMessage("Натисніть кнопку Створити ключ”);}

if(RadioButton2->Checked==True)

{Edit1->Visible=True;

Label1->Visible=True;}

}

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

void __fastcall TForm1::Button6Click(TObject *Sender)

{ q=1;

if(!CryptAcquireContext(&hP,NULL,NULL,PROV_RSA_SCHANNEL,0))

{ShowMessage("Криптопровайдера не визначено");}

else {ShowMessage("Криптопровайдер визна");}

if(!CryptGetUserKey(hP, AT_KEYEXCHANGE, &phUserKey2)){

ShowMessage(“Асиметричний клю не створено");}

if(RadioButton1->Checked==True)

{if(!CryptGenKey(hP, CALG_RC4,CRYPT_EXPORTABLE,&hKey))

{ShowMessage("Сесійний ключ не згенеровано");}

else {ShowMessage("Сесійний ключ згенеровано");}

if(!CryptSetKeyParam(hKey,KP_MODE,(BYTE*)&Param,0))

{ShowMessage("Параметри не встановлені");}

else {ShowMessage("Параметри встановлені");}}

if(RadioButton2->Checked==True)

{if(!CryptCreateHash(hP, CALG_MD5, 0, 0, &hHash))

{ShowMessage("Пусте хеш-значення не створено");}

else {ShowMessage("Створено пусте хеш-значення");}

if(!CryptHashData(hHash, (BYTE*)Edit1->Text.c_str(), Edit1->Text.Length(), 0))

{ShowMessage("Помилка хешування парольної фрази");}

else {ShowMessage("Парольна фраза хешована");}

if(!CryptDeriveKey(hP, CALG_RC4, hHash, CRYPT_EXPORTABLE|CRYPT_ENCRYPT,&hKey))

{ShowMessage("Сесійний ключ не згенеровано");}

else {ShowMessage("Сесійний ключ згенеровано");}

if( !CryptGenRandom(hP,8,pbRandomData))

{ShowMessage("Випадкові байти не згенеровано");}

//else {ShowMessage("Згенеровано випадкові байти");}

if(!CryptSetKeyParam(hKey,KP_IV, pbRandomData,0))

{ShowMessage("Вектор не встановлено");}

//else {ShowMessage("Вектор встановлено");}}}

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

void __fastcall TForm1::Button2Click(TObject *Sender)

{ if(q!=1) {ShowMessage("Створіть ключ!");}

else{

if (!OpenDialog1->Execute()) return;

if (OpenDialog1->FileName.Length()!=0) Edit2->Text=OpenDialog1->FileName;

AnsiString F;

F = Edit2->Text;

Memo1->Lines->LoadFromFile(F);}}

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

void __fastcall TForm1::Button3Click(TObject *Sender)

{ if(q!=1) {ShowMessage("Створіть ключ та виберіть файл для шифрування!");}

else{

fstream TmpFile1;

fstream TmpFile2;

AnsiString F, F1;

F = Form1->Edit2->Text;

TmpFile2.clear();

TmpFile2.open(F.c_str(), ios::in | ios::binary);

if (!SaveDialog1->Execute()) return;

if (SaveDialog1->FileName.Length()!=0) F1 = SaveDialog1->FileName;

TmpFile1.clear();

TmpFile1.open(F1.c_str(), ios::out | ios::binary);

do {TmpFile2.read((char*)Buf, sizeof(Buf));

Len=TmpFile2.gcount();

CryptEncrypt(hKey, 0, TmpFile2.eof(), 0, Buf, &Len, sizeof(Buf));

TmpFile1.write((const char*)Buf, Len); }

while(!TmpFile2.eof());

TmpFile1.close();

TmpFile2.close();

Memo2->Lines->LoadFromFile(F1);

//remove(F.c_str());

//CryptDestroyKey(hKey);

}}

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

void __fastcall TForm1::Button4Click(TObject *Sender)

{if (!OpenDialog1->Execute()) return;

if (OpenDialog1->FileName.Length()!=0) Edit4->Text=OpenDialog1->FileName;

AnsiString F3;

F3 =Edit4->Text;

Memo3->Lines->LoadFromFile(F3);}

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

void __fastcall TForm1::Button5Click(TObject *Sender)

{ if(u==1&&o!=1) {ShowMessage("Натисніть кнопку Імпорт");}

else{

fstream TmpFile2;

fstream TmpFile3;

AnsiString F3,F4;

F3 = Edit4->Text;

TmpFile2.clear();

TmpFile2.open(F3.c_str(), ios::in | ios::binary);

if (!SaveDialog1->Execute()) return;

if (SaveDialog1->FileName.Length()!=0) F4 = SaveDialog1->FileName;

TmpFile3.clear();

TmpFile3.open(F4.c_str(), ios::out | ios::binary);

do

{TmpFile2.read((char*)Buf, sizeof(Buf));

Len=TmpFile2.gcount();

if(u==1&&o==1)

{CryptDecrypt(hKeyDec, 0, TmpFile2.eof(), 0, Buf, &Len);}

if(u!=1&&o!=1) {CryptDecrypt(hKey, 0, TmpFile2.eof(), 0, Buf, &Len);}

TmpFile3.write((const char*)Buf, Len);}

while(!TmpFile2.eof());

TmpFile3.close();

TmpFile2.close();

//remove(TMPFILE);

//CryptDestroyKey(hKey);

//CryptReleaseContext(hProv,0);

Memo4->Lines->LoadFromFile(F4); }

}

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

void __fastcall TForm1::Button7Click(TObject *Sender)

{u=1;

if(!CryptExportKey(hKey,phUserKey2,SIMPLEBLOB,0,NULL,&dwBlobLenght)){ShowMessage("Error!");}

ppbKeyBlob = (unsigned char*)malloc(dwBlobLenght);

if(!CryptExportKey(hKey, phUserKey2, SIMPLEBLOB, 0, ppbKeyBlob, &dwBlobLenght)){ShowMessage("Error!");}

else {ShowMessage("Ok");}}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button9Click(TObject *Sender)

{ o=1;

if(!CryptImportKey(hP,ppbKeyBlob,dwBlobLenght,0,0,&hKeyDec)){ShowMessage("Error");}

else {ShowMessage("Ok");}

}

//---------------------------------------------------------------------------
  1. Інтерфейс користувацької програми



Програма складаєтся з 4 вкладок:

Вкладка для вибору способу генерації сеансового ключа:



Вкладка для шифрування даних, імпортованих з файлу:

Вкладка для дешифрування тексту з файлу:



А також вкладка для відображення інформації про криптопровайдерів та їхні алгоритми:

ВИСНОВКИ




Під час виконання даної роботи було застосовано па практиці теоретичні знання з принципів побудови і використання криптографічної системи для захисту інформації в комп’ютерній мережі. Також було вивчено основні функції бібліотеки CRYPTOAPI, необхідних для захисту конфіденціальності документу. Було здійснено ознайомлення з функціями шифрування і дешифрування документів, генерацією ключів а також робота з сертифікатами Х509.

В результаті роботи було отримано програмний модуль криптографічного захисту електронних документів з викоритсанням шифрування даних для створення системи захищеної передачі інформації в комп’ютерній мережі криптографічного інтерфейсу Windows.

СПИСОК ЛІТЕРАТУРИ



  1. Аграновский А.В., Хади Р.А. Практическая криптография: алгоритмы и их программирование. - М.:СОЛОН-Пресс, 2002. – 256 с.

  2. В.К. Задірака, О.С. Олексюк. Комп'ютерна криптологія: підручник. - Київ:2002. – 504 с.

  3. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. - М.: Изд-во ТРИУМФ, 2002. – 816 с.

  4. Основы криптографии. Алгоритмы шифрования DES и AES [Електронний ресурс]. – Режим доступа: http://www.intuit.ru/studies/courses/691/547/lecture/12377?page=1

  5. Основы криптографии.Криптографические алгоритмы с открытым ключом и их использование [Електронний ресурс]. – Режим доступа: http://www.intuit.ru/studies/courses/691/547/lecture/12391

  6. Delphi и Windows API для защиты секретов (части 1,2,3) [Електронний ресурс]. – Режим доступа: http://citforum.ck.ua/security/articles/defense/

  7. Використання Crypto API [Електронний ресурс]. – Режим доступа: http://drsoft.com.ua/index/news/109/Crypto-API#EDHA

скачати

© Усі права захищені
написати до нас