Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

Міністерство освіти і науки України

Національний університет «Одеська політехніка»


Кафедра комп’ютеризованих систем та програмних технологій

Лабораторна робота № 2
з дисципліни «Програмно-технічні засоби захисту інформації»
на тему: «Імплементація безпечної системи обміну інформацією на основі
алгоритму асиметричної криптографії Ель-Гамаля»
Варіант 20

Виконав: студент гр. РЗ-211


ПІБ: Рудько І.Р
Перевірив: Шаповалов Г. В.

Одеса-2024
Мета роботи: розробити програму на Python з використанням модуля
tkinter для створення безпечного каналу обміну інформацією між клієнтом і
сервером, використовуючи алгоритм асиметричної криптографії Ель-Гамаля.
Програма буде мати можливість для створення логу та . Після розробки
програми планується провести її тестування.

Хід роботи:

Створити програму (яка складається з клієнтської та серверної


частини) мовою програмування Python із користувацьким
інтерфейсом на основі модуля tkinter, яка призначена для створення
безпечного каналу передачі інформації. У програмі мають бути
реалізовані наступні функціональні можливості:

a. клієнтська частина генерує параметри алгоритму асиметричної


криптографії та виконує підключення до серверної частини, після
чого передає серверній частині відкритий ключ;

b. після вдалого підключення клієнтської частини, серверна частина


генерує свої параметри алгоритму асиметричної криптографії та
передає відкритий ключ клієнтській частині;

c. після генерації ключової інформації клієнт та сервер переходять


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

2. В програмі має бути імплементовано додаткові завдання згідно


до варіанта:

6. Результати усіх підключень на серверній стороні мають


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

7. Клієнтська та серверна частина мають підраховувати та


відображувати статистику підключення (кількість прийнятих та
переданих байтів).

Виконання роботи
1. Розробити клієнтську і серверну частини з використанням Python.
Інтегрувати tkinter для створення графічного інтерфейсу користувача.
2. В клієнтській частині генерувати параметри шифрування та передавати
відкритий ключ серверу. Сервер, в свою чергу, також генерує
параметри шифрування Ель-Гамаля та передає відкритий ключ клієнту.
3. Після встановлення з'єднання та обміну ключами, клієнт і сервер
мають можливість обмінюватися зашифрованими повідомленнями
через графічний інтерфейс.
4. Впровадити функціонал, що дозволяє задати максимальний час
підключення, після якого програма автоматично завершить свою
роботу.
5. Реалізувати на сервері обробку команди HELP для надання інформації
про систему обміну повідомленнями та про автора програми клієнту.
6. Провести тестування розробленого функціоналу програми.

Теоретична частина:

Алгоритм Ель-Гамаля є криптографічним алгоритмом асиметричного


шифрування, який базується на складності обчислення дискретних
логарифмів в скінченному полі. Він був запропонований Тахером Ель-
Гамалем в 1985 році і є популярним у системах, де необхідна висока
стійкість до криптоаналізу.
Як працює алгоритм Ель-Гамаля:
 Генерація ключів:
Вибирається велике просте число p і первісний корінь g по модулю p.
Вибирається випадкове число x, де 1 < x < p-1. Це буде закритий ключ.
Обчислюється y = gx mod p. Це буде відкритий ключ.
 Шифрування:
Вибирається випадкове число k, яке є взаємно простим з p-1.
Обчислюється a = gk mod p. Якщо вихідне повідомлення M, то шифроване
повідомлення b буде M * yk mod p. Повідомлення для відправки містить пару
(a, b).
 Розшифрування:
Використовуючи закритий ключ x, обчислюється a (p-1-x) mod p, що є
оберненим до ax mod p. Отримане число множиться на b для отримання
оригінального повідомлення M, оскільки (a(p-1-x) * b) mod p = M.

Практична частина:
Основні кроки реалізації криптоалгоритму:
Бібліотеки та модулі:
 Crypto.Util.number: цей модуль містить функції для роботи з великими
числами, які зазвичай використовуються в криптографії.
 Crypto.Random: модуль для генерації криптографічно стійких
випадкових чисел.
 Crypto.Random.random: використовується для генерації випадкових
чисел.
Функції:
 find_primitive_root(p): знаходить первісний корінь для заданого
простого числа p. Використовується для генерації генератора групи.
 generate_keys(bits=2048): генерує публічний та приватний ключі.
Розмір ключа можна вказати як параметр.
 encrypt(public_key, plaintext): шифрує текст (plaintext), використовуючи
публічний ключ. Повертає зашифроване повідомлення у вигляді пари
чисел.
 decrypt(private_key, public_key, ciphertext): розшифровує повідомлення,
використовуючи приватний ключ та публічний ключ.
Методи і змінні:
 p, g, x, y, k, a, b, m, s, plaintext_bytes: змінні, що представляють різні
криптографічні параметри та елементи криптосистеми (просте число,
генератор групи, приватний ключ, публічний ключ, випадкове число
для шифрування, шифровані елементи, повідомлення як ціле число,
секрет для дешифрування, байтове представлення тексту).
 pow(base, exp, mod): вбудована функція Python для вичислення (base **
exp) % mod. Використовується для шифрування, генерації ключів, та
розшифрування в рамках алгоритму Ель-Гамаля.
Процес реалізації:
Генерація ключів (generate_keys):
 p: генерується просте число заданої довжини за допомогою getPrime.
 g: знаходиться первісний корінь для p використовуючи функцію
find_primitive_root.
 x: генерується випадкове число, яке слугуватиме приватним ключем.
 y: вичислюється як mod gxmodp і слугуватиме частиною публічного
ключа.
Шифрування (encrypt):
 k: генерується випадкове число, що використовується для шифрування
одного повідомлення.
 a: вичислюється як mod gkmodp і слугує частиною зашифрованого
повідомлення.
 m: перетворення тексту повідомлення в довге ціле число.
 b: вичислюється як ()mod (yk⋅m)modp і є другою частиною
зашифрованого повідомлення.
Розшифрування (decrypt):
 a, b: приймаються як частини зашифрованого повідомлення.
 s: вичислюється як mod axmodp, де x - приватний ключ.
 m: вичислюється шляхом обернення процесу шифрування і
перетворення назад у текстову форму.

Основні кроки реалізації коду серверної частини:


Бібліотеки та модулі:
 tkinter: бібліотека для створення графічного інтерфейсу користувача
(GUI) у Python.
 tk: основний модуль Tkinter. scrolledtext: Модуль для текстового поля з
можливістю прокрутки.
 simpledialog: модуль для простих діалогових вікон, наприклад, для
введення даних користувачем.
 messagebox: модуль для спливаючих вікон з повідомленнями.
 threading: модуль для роботи з потоками у Python, що дозволяє
виконувати кілька завдань одночасно.
 socket: модуль для управління мережевими з'єднаннями.
Використовується для створення серверного сокета та обміну даними
між клієнтом та сервером.
 elgamal_crypto: користувацький модуль, що містить реалізацію функцій
генерації ключів, шифрування та розшифрування у криптосистемі Ель-
Гамаля.
 time: модуль для роботи з часом, використовується для реалізації
таймера очікування підключення.
Функції та їх реалізація
 receive_messages: функція для прийому та розшифрування повідомлень
від клієнта. Якщо повідомлення дорівнює «HELP», відображає вміст
файлу довідки. Інакше відображає розшифроване повідомлення у
області відображення повідомлень GUI.
 send_message: функція для відправлення зашифрованих повідомлень
клієнту. Шифрує повідомлення, введене у текстове поле, та відправляє
його клієнту.
 start_server_thread: створює серверний сокет та очікує на підключення
клієнта. При успішному підключенні запускає потік для прийому
повідомлень.
 on_closing: функція для коректного закриття програми та сокетів при
завершенні роботи сервера.
 start_timeout_timer: запускає таймер зворотного відліку для очікування
підключення клієнта. Якщо час спливає, відображає повідомлення про
тайм-аут та закриває сервер.
 start_server_gui: ініціалізує та запускає графічний інтерфейс сервера,
налаштовує віджети та запускає потік для очікування підключення
клієнта.
Важливі змінні та об'єкти
 server_socket: сокет сервера для прослуховування вхідних підключень.
 client_socket: сокет підключеного клієнта.
 client_public_key: публічний ключ клієнта для шифрування
повідомлень
 server_public_key, server_private_key: публічний і приватний ключі
сервера.
 closing: прапорець для визначення, чи знаходиться сервер у процесі
закриття.
 display_area: область відображення тексту в GUI, куди виводяться
розшифровані повідомлення від клієнта.
 entry_field: текстове поле для введення повідомлень, які будуть
зашифровані та відправлені клієнту.

You might also like