You are on page 1of 30

Київський політехнічний інститут імені Ігоря Сікорського

Теплоенергетичний факультет
Кафедра АПЕПС

КУРСОВА РОБОТА
з дисципліни «Алгоритмізація та програмування – 2: Процедурне
програмування»

На тему:
«Програмна система для шифрування даних методом Хілла»

Виконав: студент 1 курсу


гр. ТР-з01
Савченко Максим Андрійович

Оцінка «_________» Перевірив:


Крячок Олександр Степанович
Дата «___» _______ 2021 р. _____________
(підпис)

Київ - 2021
Анотація

Звіт до курсової роботи: 28 с., 6 рис., 1 табл., 1 додаток, 11 джерел.


Об’єкт дослідження – шифратор.
Мета роботи – розробити програмний продукт, який буде виконувати
шифрування та дешифрування вхідних даних методом Хілла, використовуючи
ключове слово (ключ для шифрування).
Метод дослідження – розробка програмного забезпечення.
Результати програми зберігаються у файлі.
Ключові слова: ПРОГРАМУВАННЯ, С++, ШИФР ХІЛЛА,
ШИФРУВАННЯ, ДЕШИФРУВАННЯ, ФАЙЛ, ОБЕРНЕНА МАТРИЦЯ.

Anotation

Report to the course work: 28 pages, 6 images, 1 tables, 1 addition, 11 sources.


The object of study is a coder.
The purpose of the work is to develop a software product that will encrypt and
decrypt input data using the Hill method, using a keyword (encryption key).
Research method - software development.
The results of the program are stored in a file.
Keywords: PROGRAMMING, C ++, HILL CODE, ENCRYPTION,
DECYPRATION, FILE, INVERSE MATRIX.

2
Київський політехнічний інститут імені Ігоря Сікорського

Теплоенергетичний факультет

ЗАТВЕРДЖУЮ
В.о. зав. кафедри АПЕПС

____________ (Коваль О.В.)

«___» ____________ 2021 р.

ЗАВДАННЯ
на курсову роботу студента

групи ТР-з01, Савченка Максима Андрійовича

1. Тема роботи:
Програмна система для шифрування даних методом Хілла.

2. Термін здачі студентом закінченого роботи: 23 квітня 2021 року.

3. Вихідні дані до роботи:


 Проаналізувати предметну область, виконати опис проектованої системи і
правил її функціонування.
 Розробити довідник та написати інформацію про програму, розробити
шифрування та дешифрування з файлу методом Хілла.

4. Зміст пояснювальної записки (перелік питань, які розробляються):


вступ; постановка задачі; опис предметної області; опис програмної реалізації;
опис отриманих результатів; висновки; перелік умовних позначень; список
використаних джерел; додатки.

5. Перелік графічного матеріалу (з точним позначенням обов’язкових


рисунків):
Рисунок 1 – Робота шифрування методом Хілла (неробоча); Рисунок 2 –
Шифрувальна машина Хілла; Рисунок 3 – Блок-схема алгоритму роботи шифру
Хілла; Рисунок 4 – Введення розмірності ключа; Рисунок 5 – Введення
елементів масиву; Рисунок 6 – Робоча програма
6. Консультанти по роботі, з вказівкою розділів роботи, які до них відносяться
3
Розділ Консультант Підпис, дата
Завдання
Завдання видав
прийняв

7. Дата видачі завдання: 10 лютого 2021 року.


Керівник ________
(підпис)
Завдання прийняв до виконання ________
(підпис)

КАЛЕНДАРНИЙ ПЛАН

Найменування етапів Строк виконання


п/п Примітки
курсової роботи етапів роботи
1 Отримання завдання до КР 01.02.2021 -
12.02.2021
2 Вивчення предметної області 15.02.2021 - 28.02.2021
3 Презентація КР 01.03.2021 -
10.03.2021
4 Опис програмної реалізації 15.03.2021 - 18.03.2021
5 Розробка програмного 18.03.2021 - 27.03.2021
продукту
6 Здача програмного продукту 01.04.2021 - 03.04.2021
7 Написання розділу 1 у звіті з 04.04.2021 - 07.04.2021
КР
8 Написання розділу 2 у звіті з 08.04.2021 - 11.04.2021
КР
9 Перевірка КР на дотримання 12.04.2021 - 13.04.2021
норм
10 Перевірка КР на плагіат 14.04.2021 - 16.04.2021
11 Передача КР в архів КПІ 17.04.2021 - 18.04.2021
12 Захист курсової роботи 19.04.2021 -
21.04.2021

Студент: ____________
(підпис)

Керівник роботи: ____________


4
(підпис)

ЗМІСТ
ВСТУП.........................................................................................................................6

Шифрування та їх види...........................................................................................6

Огляд наукової літератури......................................................................................9

Огляд існуючих програмних засобів....................................................................10

1. Математична модель методу Хілла.................................................................11

1.1 Історична поява шифру................................................................................11

1.2 Математична модель....................................................................................11

1.3 Криптостійкість.............................................................................................13

1.4 Механічна реалізація....................................................................................14

2. Опис проектного рішення шифрування методу Хілла................................15

2.1 Загальні відомості............................................................................................15

2.2 Бібліотеки..........................................................................................................16

2.3 Функції..............................................................................................................17

3. Налагоджування та тестування системи, огляд результатів......................19

3.1 Правила використання програми....................................................................19

3.2 Тестування ПЗ..................................................................................................19

3.3 Результати роботи програми...........................................................................20

Висновки...................................................................................................................22

Перелік використаних джерел..............................................................................23

Додаток А..................................................................................................................24

5
6
ВСТУП

Мета розробки та призначення ПЗ


Мета розробки ПЗ: автоматизувати шифрування та дешифрування даних
методом Хілла.
Призначення ПЗ: створення програми-шифратора для користування у
вільному доступі. Користувачу надано файл, в якому має знаходитись ключове
слово та повідомлення для шифрування, у відповідь користувач отримає файл з
зашифрованим повідомленням та ключ (ключове слово).

Вхідні та вихідні дані, очікувані результати


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

Шифрування та їх види
Шифрування - алгоритмічне (криптографічне) перетворення даних, яке
виконується у посимвольній послідовності з метою одержання шифрованого
тексту[1].
Існує два види шифрувань: симетричне та асиметричне шифрування.
 Симетричне шифрування
В симетричному шифруванні один і той самий ключ (що зберігається в
секреті) використовується як для шифрування, так і для розшифрування.
Розроблено ефективні (швидкі й надійні) методи шифрування.
Переваги:
7
1) Шифри із симетричним ключем спроектовані так, щоб мати велику
пропускну здатність.
2) Ключі для шифрів із симетричним ключем відносно короткі.
3) Шифри із симетричним ключем можна використати як примітиви для
побудови різних криптографічних механізмів включно з
псевдовипадковими генераторами чисел, геш-функціями,
обчислювально-ефективних схем підпису.
4) Шифри із симетричним ключем можна комбінувати для отримання
сильніших шифрів.
Недоліки:
1) При зв'язку між двома особами, ключ потрібно тримати в секреті на
обох кінцях.
2) У великій мережі потрібно опікуватись багатьма ключами.
3) У зв'язку між двома особами криптографічна практика вимагає частої
зміни ключів.

 Асиметричне шифрування
Проблемою симетричного шифрування є необхідність передачі ключа, для
розшифрування інформації, таким чином ключ може бути перехоплений
кимось іншим.
Будь хто, знаючи секретний ключ, може розшифрувати інформацію. Тоді
як в асиметричному шифруванні є два пов'язаних ключа — пара ключів.
Відкритий ключ (англ. public key) — публічний, до нього повинні мати доступ
всі ті, хто матиме потребу зашифрувати інформацію. Тоді як закритий ключ —
приватний ключ (англ. private key), повинен бути доступним лише тому хто має
право розшифрувати інформацію, за своїм розміром він значно більший від
секретного ключа симетричного шифрування[2].
Будь-яку інформацію, зашифровану за допомогою відкритого ключа
можна розшифрувати лише застосовуючи той самий алгоритм, але з
використанням відповідного приватного ключа. Також всю інформацію,

8
зашифровану за допомогою приватного ключа, можна розшифрувати лише за
допомогою відповідного відкритого ключа. Це означає, що немає необхідності
хвилюватись за передачу ключа, відкритий ключ повинен бути публічним. Але
асиметричне шифрування є значно повільнішим від симетричного. Також
потребує значно більше обчислювальної потужності як для шифрування, так і
для розшифрування інформації.
Через вади в швидкодії асиметричного методу цей метод доводиться
використовувати разом з симетричним (асиметричні методи на 3 — 4 порядки
повільніші). Так, для розв'язання задачі ефективного шифрування з
передаванням секретного ключа, використаного відправником, інформація
спочатку симетрично зашифровується випадковим ключем, потім цей ключ
зашифровують відкритим асиметричним ключем одержувача, після чого
повідомлення і ключ відправляються по мережі.

Шифр Хілла
Шифр Хілла — поліграмний шифр підстановки, заснований на лінійній
алгебрі. Лестер Хілл винайшов цей шифр у 1929 році, і це був перший шифр,
який дозволяв на практиці оперувати більш ніж з трьома символами за раз.
Процес шифрування: Кожній букві спершу зіставляється число. Блок з n
букв розглядається як n-мірний вектор і множиться на n × n матрицю по
модулю 26. (Якщо як основа модуля використовується число більше 26, то
можна використовувати іншу числову схему для зіставлення буквах чисел і
додати прогалини і знаки пунктуації.) Матриця повністю є ключем шифру. Для
можливості дешифрування повідомлення, необхідно створити обернену
матрицю, що може скласти велику проблему, якщо визначник матриці буде
дорівнювати 0.
Процес дешифрування: Для того, щоб дешифрувати повідомлення,
необхідно обернути зашифрований текст назад в вектор і потім просто
помножити на обернену матрицю ключа.

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

Огляд наукової літератури


Для розробки програми-шифратора необхідно спочатку детально
зрозуміти, що таке якісний код – це допоможе створити легку, гнучку та
оптимізовану програму, яка буде працювати без помилок.
Якщо ваш код працює, це ще не означає, що його можна назвати хорошим.
Роберт Мартін "Чистий код"[3] - ця книга з програмування розповість вам не
тільки про те, як писати хороший код, але і як перетворити поганий код в
хороший. З її допомогою ви зможете зрозуміти, чому такі дрібниці, як
правильна назва змінних, - зовсім навіть не дрібниці, а важливі пункти на
шляху до усвідомлення того, як писати "чистий код". На цю тему ж підійде
книга з програмування Стіва Макконнелла «Досконалий код»[4] - це те, що
радять прочитати хоч раз в житті кожному програмісту. Понад десять років
перше видання небезпідставно вважалося найкращим практичним посібником з
кодування. У ній, спираючись на свій досвід, автор зібрав різні методики і
принципи програмування. Програміст будь-якій області з будь-яким рівнем
обов'язково знайде для себе щось, про що він раніше не знав або не
замислювався.
Після того, як стало зрозуміло, що таке якісний код, необхідно створювати
алгоритми з цим кодом. В допомогу стане Томас Кормен, Чарльз Лейзерсон,
Рональд Ривест і Кліффорд Штайн з книгою «Алгоритми: побудова й аналіз»[5]
- ця книга є введенням з сучасних комп'ютерних алгоритмів. У ній описано

10
безліч дійсно працюють алгоритмів на доступному рівні для основної маси
цікавляться читачів. Автори постаралися зробити пояснення до кожного, навіть
досить складного, алгоритму максимально доступними для читача. Також для
ознайомлення з алгоритмами допоможе книга Ханта Ендрю, Томаса Девіда
«Програміст-прагматик. Шлях від підмайстри до майстра»[6].
Після знайомства з алгоритмами можна переходити до вивчання самого
шифрування, в цьому чудово допоможе «криптографічна класика» Саймона
Сінгха «Книга шифрів»[7] - ця книга пояснює, що таке шифрування та як його
застосовувати.

Огляд існуючих програмних засобів


У нашому часі шифр Хілла не дуже популярний і тому існує дуже мало
готових програмних рішень і найбільша проблема цих всіх програм, їхня
незручність користування та некоректна робота в деяких випадках.
Одним із прикладів (див. Рисунок 1) можна навести перший сайт з пошуку:
http://yozhix.boltun.su/viewtopic.php?id=221:

Рисунок 1 – Робота шифрування методом Хілла (неробоча)


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

11
1. Математична модель методу Хілла

Шифр Хілла - поліграмний шифр підстановки, заснований на лінійній


алгебрі і модульної арифметики. Винайдено американським математиком
Лестером Хіллом у 1929 році. Це був перший шифр, який дозволив на практиці
(хоча і з труднощами) одночасно оперувати більш ніж з трьома символами.
Шифр Хілла не знайшов практичного застосування в криптографії через слабку
стійкість до взлому і відсутності опису алгоритмів генерації прямих і зворотних
матриць великих розмірів.

1.1 Історична поява шифру

Вперше шифр Хілла був описаний в статті «Cryptography in an Algebraic


Alphabet» [8], опублікованій в журналі «The American Mathematical Monthly» в
червні-липні 1929 року. У серпні того ж року Хілл поширив тему і виступив з
промовою про криптографію перед Американським математичним
суспільством в Боулдері, штат Колорадо [9]. Пізніше його лекції привели до
другої статті «Concerning Certain Linear Transformation Apparatus of
Cryptography» [10], яка була опублікована в журналі «The American
Mathematical Monthly» в березні 1931 року. Девід Кан в своїй праці «Зломщики
кодів» так описав шифр Хілла і його місце в історії криптографії [11]:
«Хілл був одним з тих, хто розробив загальний і потужний метод. До того
ж шифр Хілла вперше перевів криптографію з використанням поліграм в
розряд практичних дисциплін.».

1.2 Математична модель

Шифр Хілла є поліграмним шифром, який може використовувати великі


блоки за допомогою лінійної алгебри. Кожній букві алфавіту зіставляється
число по модулю 26. Для латинського алфавіту часто використовується

12
найпростіша схема: A = 0, B = 1, ..., Z = 25, але це не є істотним властивістю
шифру. Алфавіт починається з нуля для зручності запрограмовування
програми, оскільки алфавіт – це масив, а перший елемент масиву – це 0. Блок з
n букв розглядається як n-мірний вектор і множиться по модулю 26 на матрицю
розміру n × n. Якщо в якості підстави модуля використовується число більше
ніж 26, то можна використовувати іншу числову схему для зіставлення букв,
чисел і додати прогалини і знаки пунктуації. Елементи матриці є ключем. Для
можливості використання операції розшифрування необхідно мати обернену
матрицю цього ключа.

Для n = 3 система може бути описана так:

або в матричній формі:

або

де P і С - вектори-стовпці висоти 3, що представляють відкритий і


зашифрований текст відповідно, K - матриця 3 × 3, що представляє ключ
шифрування. Операції виконуються по модулю 26.
Для того, щоб розшифрувати повідомлення, потрібно отримати зворотну
матрицю ключа K-1. Існують стандартні методи обчислення обернених матриць,
але не всі матриці мають обернену. Матриця буде мати обернену в тому і тільки
в тому випадку, коли її детермінант не дорівнює нулю і не має спільних
дільників з основою модуля. Якщо детермінант матриці дорівнює нулю або має
спільні дільники з основою модуля, то така матриця не може
використовуватися в шифрі Хілла, і повинна бути обрана інша матриця (в
іншому випадку зашифрований текст буде неможливо розшифрувати).
13
У загальному випадку, алгоритм шифрування може бути виражений в
наступному вигляді:
Шифрування:
Розшифрування:

1.3 Криптостійкість

Стандартний шифр Хілла вразливий для атаки по обраному відкритому


тексту, тому що в ньому використовуються лінійні операції. Криптоаналітик,
який перехопить n2 пар символів повідомлення / зашифрованого тексту зможе
скласти систему лінійних рівнянь, яку зазвичай нескладно вирішити. Якщо
виявиться, що система не вирішується, то необхідно всього лише додати ще
кілька пар символів повідомлення / зашифрованого тексту. Такого роду
розрахунки засобами звичайних алгоритмів лінійної алгебри вимагає зовсім
небагато часу. У зв'язку з цим для збільшення криптостійкості в нього повинні
бути додані будь-які нелінійні операції. Комбінування лінійних операцій, як в
шифрі Хілла, і нелінійних кроків привело до створення підстановлювально-
перестановної мережі (наприклад, мережа Фейстеля). Тому з певної точки зору
можна розглядати сучасні блокові шифри як вид поліграмних шифрів.

Довжина ключа
Довжина ключа - це двійковий логарифм від кількості всіх можливих
ключів. Існує 26n*n матриць розміру n × n. Отже, log2(26n*n)  4,7n2 - верхня межа
довжини ключа для шифру Хілла, котрий використовує матриці n × n. Це
тільки верхня грань, оскільки не кожна матриця обернена, а тільки такі матриці
можуть бути ключами. Кількість обернених матриць може бути розрахована за
допомогою Китайської теореми про залишки. Матриця обернена по модулю 26
тоді і тільки тоді, коли вона обернена і по модулю 2, і по модулю 13.

14
Кількість обернених по модулю 2 і 13 матриць розміру n × n рівне порядку
лінійної групи GL (n, Z2) і GL (n, Z13) відповідно:

1.4 Механічна реалізація

При роботі з двома символами за раз шифр Хілла не надає ніяких


конкретних переваг перед шифром Плейфера і навіть поступається йому по
криптостійкості і простоті обчислень на папері. У міру збільшення розмірності
ключа шифр швидко стає недоступним для розрахунків на папері людиною.
Шифр Хілла розмірності 6 був реалізований механічно. Хілл з партнером
отримали патент на пристрій (див. Рисунок 2), який виконував множення
матриць 6 × 6 по модулю 26 за допомогою системи шестерень і ланцюгів.

Рисунок 2 – Шифрувальна машина Хілла


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

15
2. Опис проектного рішення шифрування методу Хілла

2.1 Загальні відомості

Алгоритм програми: Записати у файл повідомлення для шифрування. У


запропонованому полі ввести розмірність ключа (матриці) та сам ключ
(матрицю). ПРИМІТКА! Для дешифрування повідомлення необхідно мати
обернену матрицю до заданої. Зашифрувати повідомлення, перемножуючи
повідомлення з ключем. Розшифрувати повідомлення використовуючи модуль
26 та обернену матрицю та виконати ті ж самі операції як і з шифруванням.
Для розуміння алгоритму роботи програми надано блок-схему алгоритму
програми (див. Рисунок 3):

16
Рисунок 3 – Блок-схема алгоритму роботи шифру Хілла

2.2 Бібліотеки

Бібліотека — збірка об'єктів чи підпрограм для вирішення близьких за


тематикою задач. Бібліотеки містять об'єктні модулі чи сирцевий код та дані,
допоміжні для задіяння та інтеграції нових можливостей в програмні рішення.
Для введення та виведення інформації використовується стандартна
бібліотека iostream. iostream — бібліотека і відповідний заголовний файл, що
використовується для організації введення-виведення в мові програмування C+
+. Він включений в стандартну бібліотеку C++. Назва утворена від англ.
Input/Output Stream (потік введення-виведення). У мові C++ і її попереднику,
мові програмування Сі, немає вбудованого вводу-виводу. Натомість
використовується бібліотека iostream яка керує вводом-виводом, як і stdio.h у
Ci. iostream використовує об'єкти cin, cout, cerr і clog для передачі інформації
між стандартними потоками введення, виведення. Будучи частиною
стандартної бібліотеки C++, ці об'єкти також є частиною стандартного
простору імен — std.
Для роботи з файлами доцільно використовувати бібліотеку fstream.
fstream — заголовковий файл для роботи з файлами, у якому підключено такі
заголовкові файли як <ifstream> — бібліотека для файлового введеня, і
<ofstream> — бібліотека для файлового виведення. Бібліотека <fstream>
містить функції для роботи з файлами. Об'єкти цього класу підтримують об'єкт
filebuf як свій внутрішній буфер потоку, який виконує операції
введення/виведення у файл, з яким вони пов'язані (якщо такі є). Потоки файлів
асоціюються з файлами або під час побудови, або за допомогою виклику члена
open.
Оскільки це шифрування відбувається методом Хілла, використовуються
матриці, тобто масиви, і для коректної їх роботи безпечніше використовувати
динамічні масиви, а з цим допоможе клас vector. Vector - це заміна
стандартному динамічному масиву, пам’ять для якої виділяється вручну, за
17
допомогою оператора new. Коли змінна-вектор виходить з області видимості,
то вона автоматично звільняє пам'ять, яку контролювала (займала). Це не тільки
зручно (так як вам не потрібно це робити вручну), але також допомагає
запобігти втрати зайвої пам'яті.

2.3 Функції

Підпрограма (функція) – частина програми, яка реалізує певний алгоритм і


дозволяє звернення до неї з різних частин загальної (головної) програми. В мові
програмування C та C++ головною програмою називають функцію main().
Підпрограма часто використовується для скорочення розмірів програм в
тих задачах, в процесі розв'язання яких необхідно виконати декілька разів
однаковий алгоритм при різних значеннях параметрів. Інструкції (оператори,
команди), які реалізують відповідну підпрограму, записують один раз, а в
необхідних місцях розміщують інструкцію виклику підпрограми.
У шифраторі використано всього 8 функцій та 1 головна.
Функція Mod26() – знаходження по модулю 26.
Функція CofactorMatrix() – створення кофакторної матриці (алгебраїчне
доповнення матриці) для знаходження оберненої матриці.
Функція DetMatrix() – знаходження визначника матриці. Визначник – це
число; вираз складений за певним законом з n² елементів квадратної матриці.
Одна з найважливіших характеристик квадратних матриць.
Функція TransMatrix() – знаходження транспонованої матриці.
Транспонована матриця – матриця, що виникає з матриці в результаті унарної
операції транспонування: заміни її рядків на стовпчики.
Функція InverseMatrix() – знаходження оберненої матриці. Обернена
матриця – матриця, яка існує для кожної невиродженої квадратної матриці
(невироджена матриця – матриця, визначник якої не дорівнює 0), розмірності
n*n, причому:
AA-1=A-1A=Іn , де Іn одинична n*n матриця.

18
Функція Encryption() – функція, яка виконує зашифрування повідомлення
методом, перемножуючи матрицю з повідомленням.
Функція Decryption() – функція, що виконує розшифрування повідомлення
перемножуючи обернену матрицю з повідомленням.
Функція getMsg() – функція, яка виконує операцію читання з файлу та
зчитує всю інформацію у тип даних string.

19
3. Налагоджування та тестування системи, огляд результатів

3.1 Правила використання програми

Для коректної роботи ПЗ необхідно дотримуватись певних норм та


обмежень заданими розробником.
Правила вводу повідомлення для шифрування:
 повідомлення має складатися лише із літер від «а» до «z»;
 повідомлення має бути англійською мовою;
 в повідомленні не можна вживати великі літери;
 забороняється використовувати відступи та інші символи.
Правила вводу ключа (матриці):
 кожний елемент масиву має бути цілим числом;
 елемент масиву не може бути від’ємним;
 визначник матриці має НЕ ДОРІВНЮВАТИ 0;
 розмірність матриці має знаходитись в діапазоні від 2х2 до 4х4.
Дотримуючись вище зазначених правил, можна запобігти неприємностей в
роботі з програмою та ефективно взаємодіяти з нею.

3.2 Тестування ПЗ

Тестування програмного забезпечення – це процес технічного


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

20
виявлених помилок та на скільки функція задовольняє умовам за 5тибальною
шкалою, де 5 – якісна, 1 - погана.
Функція Час роботи, с Кількість помилок Якість
Mod26() 0,0001 0 5
CofactorMatrix() 0,0003 0 5
DetMatrix() 0,0002 0 5
TransMatrix() 0,0007 0 5
InverseMatrix() 0,0013 2 3
Encryption() 0,0003 0 5
Decryption() 0,0024 0 5
getMsg() 0,0001 0 5

Таблиця 1. Результати функціонального тестування

3.3 Результати роботи програми

Як приклад, в файл було записано повідомлення “helloworld”. Далі


користувачу треба ввести розмірність матриці, тобто ключ (див. Рисунок 4).

Рисунок 4 – Введення розмірності ключа

Після того як користувач ввів розмірність масиву, він має ввести всі
елементи щойно створеного масиву (див. Рисунок 5). ПРИМІТКА! Для
розшифрування повідомлення, визначник цього масиву не має дорівнювати 0.

Рисунок 5 – Введення елементів масиву


Далі йде процес зашифрування повідомлення та його виведення на екран.
Потім програма вираховує визначник матриці і якщо він буде дорівнювати 0 –
програма виведе повідомлення на екран, що обернена матриця не існує, в

21
іншому ж випадку програма знайде обернену матрицю та виведе про це
інформацію на екран. Після цього програма розшифровує повідомлення та
виводить його на екран (див. Рисунок 6).

Рисунок 6 – Робоча програма

22
Висновки

Відповідно до завдання курсової роботи виконані всі задачі та вимоги.


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

23
Перелік використаних джерел

1.  Шифрування  В. Т. Бусел.  5-те видання, Ірпінь : Перун, 2005. ISBN 966-


569-013-2.
2. Alfred J. Menezes, Paul C. van Oorschot, Scott A. Vanstone. Handbook of
applied cryptography. — CRC-Press, 1996. — С. 32. — ISBN 0849385237.
3. Роберт Мартін "Чистий код". ФБ722077У, 2019, 416 с.
4. Стів Макконнелл "Досконалий код". БХВ-Петербург, 2004, 896 с.
5. Томас Кормен, Чарльз Лейзерсон, Рональд Ривест і Кліффорд Штайн
"Алгоритми: побудова й аналіз". Диалектика, 2020, 648 с.
6. Хант Ендрю, Томас Девід "Програміст-прагматик. Шлях від підмайстри до
майстра". Лори, 2020, 288 с.

7. Саймон Сінгх "Книга шифрів". ISBN 59459928, 1999, 416 с.


8.  Lester S. Hill. Cryptography in an Algebraic Alphabet: Article, 1929, С. 7.
9. Chris Christensen. Lester Hill Revisited // Taylor & Francis Group, LLC :
Article, 2014, С. 297,  ISSN 0161-1194.
10. Lester S. Hill. Concerning Certain Linear Transformation Apparatus of
Cryptography// "The American Mathematical Monthly", 1931, С. 135-154.
11. David Kahn. The Codebreakers: The Comprehensive History of Secret
Communication from Ancient Times to the Internet. — Simon and Schuster. — New
York: Scribner, 1996, С. 405, 723 с. ISBN 0-684-83130-9.

24
Додаток А

Весь програмний код розміщений за посиланням:


https://replit.com/@Variandr/Hill-Cipher#main.cpp
Програмний код:
#include<iostream>
#include<vector>
#include <fstream>
using namespace std;

int Mod26(int x){


int y = 26;
int a = 0;
x = x % y;
for(int i =- y ; i < y; i++){
if((x * i) % y == 1){
a += i;
return i;
}
}
return a;
}
//Кофакторна матриця(алгебраїчне доповнення матриці)
void CofactorMatrix(vector<vector<int>> &key, vector<vector<int>> &temp, int p, int q, int n){
int i = 0, j = 0;
for(int row = 0; row < n; row++){
for(int col = 0; col < n; col++){
if(row!=p && col!=q){
temp[i][j++] = key[row][col];
if (j == n-1){
j = 0;
i++;
}

25
}
}
}
}
//Детермінант матриці
int DetMatrix(vector<vector<int>> &key, int n, int N){
int D = 0;
//Якщо розмірність ключа 1, то детермінантом буде цей елемент матриці
if(n == 1) return key[0][0];
vector<vector<int>> temp(N, vector<int>(N));
int sign = 1;
for(int f = 0;f < n; f++){
CofactorMatrix(key, temp, 0, f, n);
D += sign * key[0][f] * DetMatrix(temp, n - 1, N);
sign = -sign;
}
return D;
}
//Транспонована матриця
void TransMatrix(vector<vector<int>> &key, vector<vector<int>> &adj, int N){
if(N == 1){
adj[0][0] = 1;
return;
}
int sign = 1;
vector<vector<int> > temp(N, vector<int>(N));
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
CofactorMatrix(key, temp, i, j, N);
sign = ((i+j)%2==0)? 1: -1;
adj[j][i] = (sign)*(DetMatrix(temp, N-1 , N));
}
}
}
//Обернена матриця

26
bool InverseMatrix(vector<vector<int>> &key, vector<vector<int>> &inv, int N){
int det = DetMatrix(key, N, N);
//Якщо детермінант = 0 то оберненої матриці не існує
if(det == 0){
cout << "\nОбернена матриця не існує\n";
exit(1);
}
int invDet = Mod26(det);
vector<vector<int>> adj(N, vector<int>(N));
TransMatrix(key, adj, N);
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
inv[i][j] = (adj[i][j] * invDet) % 26;
}
}
return true;
}
//Зашифрування повідомлення
string Encryption(int n, string en_msg, vector<vector<int>> &key){
string msg = "";
int k = 0;
int temp = (n - en_msg.size() % n) % n;
for(int i = 0; i < temp; i++){
en_msg += 'x';
}
while(k < en_msg.size()){
for(int i = 0; i < n; i++){
int sum = 0;
int temp = k;
for(int j = 0; j < n; j++){
sum += (key[i][j] % 26 * (en_msg[temp++] - 'a') % 26) % 26;
sum = sum % 26;
}
msg += (sum + 'a');
}

27
k += n;
}
return msg;
}
//Розшифрування повідомлення
string Decryption(string de_msg, int n, vector<vector<int>> &inv ){
int k = 0;
string msg = "";
while(k < de_msg.size()){
for(int i = 0; i < n; i++){
int sum = 0;
int temp = k;
for(int j = 0; j < n; j++){
sum += ((inv[i][j] + 26) % 26 * (de_msg[temp++] - 'a') % 26) % 26;
sum = sum % 26;
}
msg += (sum + 'a');
}
k += n;
}
return msg;
}
//Читання з файлу повідомлення
string getMsg(){
string msg;
ifstream file("msg.txt");
while(!file.eof()){
file >> msg;
}
file.close();
return msg;
}

int main(){
int x, y, n;

28
string en_msg, de_msg, msg;
msg = getMsg();
cout<<"Введене повідомлення: " << msg << endl;
cout<<"Введіть розмірність ключа: "; cin >> n;
vector<vector<int> > key(n, vector<int>(n));
vector<vector<int> > adj(n, vector<int>(n));
vector<vector<int> > inv(n, vector<int>(n));

cout<<"\nВведіть елементи масиву:\n";


for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("key[%d][%d]: ", i, j);
cin >> key[i][j];
}
}

en_msg = Encryption(n, msg, key);


cout << "Зашифроване повідомлення: " << en_msg << '\n';
if(InverseMatrix(key, inv, n)){
cout << "\nОбернена матриця існує\n";
de_msg = Decryption(en_msg, n, inv);
}

int f = de_msg.size() - 1;
while(de_msg[f] == 'x'){
f--;
}
cout << "\nРозшифроване повідомлення: ";
for(int i = 0; i <= f; i++){
cout << de_msg[i];
}
cout<<'\n';
return 0;
}

29
30

You might also like