Способи шифрування і дешифрування тексту
Історія криптографії по суті дорівнює за віком історії існування писемності, тому що саме з появою писемності виникла потреба вигадувати різні способи для зберігання інформації у вигляді, доступному тільки для певного кола осіб. До нашої ери був придуманий «Шифр Цезаря», який полягав у заміні кожного символу в тексті на символ, віддалений від нього в алфавіті на фіксоване число позицій. Криптоаналитики шукали способи розшифровувати закодовані повідомлення. Криптографи (шифрувальники) і криптоаналитики (дешифрувальники) перебували в постійному протиборстві: перші постійно придумували нові шифри, з першого погляду недоступні для криптоаналітиків, а другі знаходили способи дешифрування прихованих повідомлень.
Сучасна криптографія утворює окремий науковий напрям на стику математики та інформатики. Практичне застосування криптографії стало невід'ємною частиною життя сучасного суспільства - її використовують в таких галузях, як електронна комерція, електронний документообіг (включаючи цифрові підписи), телекомунікації та інших.
Існує величезна кількість різних способів шифрування даних. Метою даної лабораторної роботи є вивчення програмного продукту, що реалізує методи шифрування і дешифрування тексту по трикутнику Паскаля, методом Гронсфельда і по матриці, і зберігає результати шифрування (кількість зашифрованих символів і їх послідовність), а також інформацію про спосіб шифрування в бінарному файлі.
Алгоритми шифрування і дешифрування
За трикутнику Паскаля
Трикутник Паскаля - арифметичний трикутник (рис.4.1), утворений біноміальними коефіцієнтами:
У трикутнику Паскаля на вершині і з боків стоять одиниці. Кожне число дорівнює сумі двох розташованих над ним чисел. Рядки трикутника симетричні щодо вертикальної осі. Продовжувати трикутник можна нескінченно.
Шифрування відбувається за наступним алгоритмом:
з пропозиції виділяється чергове слово;
5: 1 5 10 10 5 1
6: 1 6 15 20 15 6 1
7: 1 7 21 35 35 21 7 1
8: 1 8 28 56 70 56 28 8 1
9: 1 9 36 84 126 126 84 36 9 1
10: 1 10 45 120 210 252 210 120 45 10 1
11: 1 11 55 165 330 462 462 330 165 55 11 1
12: 1 12 66 220 495 792 924 792 495 220 66 12 1
13: 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
Рис.4.1 - перші 15 рядків трикутника Паскаля.
1. з трикутника Паскаля вибирається рядок з номером, що дорівнює кількості букв в слові;
2. k-я буква вихідного слова замінюється на букву, що відстоїть від вихідної на число букв, вказане в k-му стовпці вибраного рядка трикутника Паскаля (відлік проводиться за годинниковою стрілкою, як показано на рис.4.2).
А Б В Г Д Е Ж З
Ч Ц Х Ф У Т С Р
Рис.4.2 - схема відліку
Алгоритм дешифрування відрізняється тільки напрямком відліку: він буде зворотним, тобто проти годинникової стрілки.
Шифр Гронсфельда - це шифр складної заміни, що представляє собою модифікацію шифру Цезаря числовим ключем. Тут над буквами вихідного повідомлення записують цифри числового ключа. Якщо ключ коротше повідомлення, то його запис циклічно повторюють. На відміну від шифру Цезаря, де зашифровану букву відраховують за алфавітом як третю, тут вибирають ту букву, яка зміщена за алфавітом на відповідну цифру ключа.
По матриці Віженера
Матриця Віженера представлена на рис.4.3. Стосовно до шифру Цезаря кожна шіфруемого буква порушувався б на три рядки (зрушення +3), тобто А стало б Г, Б стало б Д і т.д. Тут же зрушення залежить від букви ключа.
Рис.4.3 - матриця Віженера
Шифрування відбувається так: в матриці Віженера шукається стовпець, відповідний букві вихідного тексту, потім шукається рядок, відповідна букві ключа і на їх перетині буде перебувати відповідна літера зашифрованого тексту.
При дешифрування шукається рядок, що відповідає першому символу ключового слова, і в цьому рядку шукається перший символ зашифрованого тексту. Стовпець, в якому знаходиться останній, відповідає першому символу вихідного тексту. Наступні символи зашифрованого тексту розшифровуються подібним же чином.
Якщо букви А-Я відповідають числам 1-32 (без букви Е), то шифрування і дешифрування по матриці Віженера можна записати у вигляді формул відповідно:
де - буква зашифрованого тексту, - літера вихідного тексту, - буква ключа.
Вибір, розміщення і завдання властивостей компонентів.
Коди класів, функцій і обробників подій
1. Інтерфейс проектованого додатки повинен задовольняти вимогам:
· Інтерфейс повинен бути зручний і простий у використанні;
· Інтерфейс повинен відповідати принципу універсальності, який передбачає підтримку основних правил побудови інтерфейсу, характерних для основних діалогових систем; при цьому передбачається однаковість управління, однаковість призначення елементів;
· Інтерфейс по можливості повинен обнспечівать мінімальне число фізичних маніпуляцій користувача (передбачається виключення зайвих переходів).
2. Збережіть модуль головної форми під ім'ям LR_4, а проект - під ім'ям PR_LR_4. Головна форма додатку представлена на рис.4.4. У властивість Caption головною форми занесено шифрування / дешифрування ДЛЯ ВВЕДЕННЯ допустимо ПРОПИСНІ українські БУКВИ І СИМВОЛ-роздільник '_'. Головне меню містить розділ Файл (з підрозділами Відкрити вихідний текст. Відкрити зашифровані текст. Вихід), розділ Операції (з підрозділами Ініціалізація. Очищення полів) і розділ Довідка (з підрозділом Про програму). Для підрозділу Очищення полів властивість Enabled має значення false.

Рис.4.4 - головна форма після закінчення проектування
3. Найбільш часто вживані команди головного меню (Вихід. Ініціалізація. Очищення полів) продубльовані на панелі інструментів, розташованої під головним меню. Тут використовується найпростіша з проектування інструментальна панель. Вона складається з простої панелі Panel1 (сторінка Стандарт) з зачищені властивістю Caption, на якій розміщені три кнопки SpeedButton1,2,3 (сторінка Додатково). Двом з них дано осмислені імена: sbtnInit (SpeedButton2), sbtnClear (SpeedButton3) (див. Заголовки модуля головної форми LR_4.h). Піктограми (зображення) поміщені на кнопки через властивість Glyph відповідно з файлів dooropen. check. clear в папці ... Program Files \ Common Files \ Borland Shared \ Images \ Buttons. У властивість Hint кнопок занесені відповідно спливаючі підказки вихід. ініціалізація, очищення полів. в властивість ShowHint - true. Для кнопки SpeedButton3 (очищення полів) властивість HelpType поставлено в значення htKeyword (режим повної підказки).
4. Перенесіть на форму (сторінка Діалоги) компоненти SaveDialog1 і OpenDialog1, а зі сторінки Стандарт - компонент PopupMenu1. Подвійним клацанням на компоненті PopupMenu1 перейдіть в Конструктор Меню (вікно Form1-> PopupMenu1) і внесіть розділи Зберегти і Зберегти як.
5. Інша частина головної форми ділиться на три приблизно рівні частини компонентами - панелями GroupBox1,2,3 (сторінка Стандарт). У властивість Caption панелей внесено відповідно: Трикутник Паскаля. Метод Гронсфельда. По матриці.
6. На панелі GroupBox1 розміщені дві мітки Label1,2 (Оригінальний текст. Зашифрований текст), два компонента Memo1,2 і дві кнопки Button1,2 (сторінка Стандарт) з написами (Шифрування. Дешифрування). Задані середовищем імена (значення властивості Name) Memo1, Memo2 замінені на осмислені імена: TextPascal. CodedTextPascal (див. LR_4.h). У властивість PopupMenu компонента Memo1 занесено значення PopupMenu1. що дозволить через Memo1 задавати ідентичний вихідний текст для всіх трьох способів шифрування. Задані середовищем імена (значення властивості Name) Button1. Button2 замінені на осмислені - btnEncryptP. btnDecryptP. а властивості Enabled присвоєно значення false.
7. На панелі GroupBox2 розміщені три мітки Label3,4,5 (Ключ (3-8 цифр), Оригінальний текст. Зашифрований текст), три компонента Memo3,4,5 (задані середовищем імена замінені на edtKeyG. TextG. CodedTextG) і дві кнопки Button3,4 (задані середовищем імена замінені на btnEncryptG. btnDecryptG. властивість Enabled - false).
8. На панелі GroupBox3 розміщені три мітки Label6,7,8 (Ключ (літери), Оригінальний текст. Зашифрований текст), три компонента Memo6,7,8 (задані середовищем імена замінені на edtKeyM. TextM. CodedTextM) і дві кнопки Button5, 6 (задані середовищем імена замінені на btnEncryptM. btnDecryptM. властивість Enabled - false).

Рис.4.5 - форма «Про програму»

Рис.4.6 - головна форма з результатами тестування

(Початок структури проекту)

(Продовження структури проекту)

(Закінчення структури проекту)
11. Заголовний файл main.h модуля main
// клас шифрування / дешифрування тексту
char * text; //початковий текст
char * codedtext; // зашифрований текст
int ** Ptriangle; // трикутник Паскаля
int keyG [9]; // ключ для шифру Гронсфельда, в нульовому байті -
char * keyM; // ключ для шифру по матриці
void SetText (char * text); // задати вихідний текст
char * GetText (); // отримати вихідний текст
void SetCodedText (char * text); // задати шифрований текст
char * GetCodedText (); // отримати шифрований текст
void SetKeyG (char * strkey); // задати ключ для методу Гронсфельда
void SetKeyM (char * strkey); // задати ключ для шифрування по матриці
int TextLen (); // отримати довжину вихідного тексту
int CodedTextLen (); // отримати довжину шифрованого тексту
void EncryptP (); // шифрувати по трикутнику Паскаля
void EncryptM (); // шифрувати по матриці
void EncryptG (); // шифрувати методом Гронсфельда
void DecryptP (); // дешифрувати по трикутнику Паскаля
void DecryptM (); // дешифрувати по матриці
void DecryptG (); // дешифрувати методом Гронсфельда
> * A; // покажчик на об'єкт класу
12. Файл реалізації main.cpp модуля main
void __fastcall SpeedButton1Click (TObject * Sender);
void __fastcall N6Click (TObject * Sender);
void __fastcall N9Click (TObject * Sender);
void __fastcall sbtnInitClick (TObject * Sender);
void __fastcall N7Click (TObject * Sender);
void __fastcall sbtnClearClick (TObject * Sender);
void __fastcall N8Click (TObject * Sender);
void __fastcall N4Click (TObject * Sender);
void __fastcall N5Click (TObject * Sender);
void __fastcall btnEncryptPClick (TObject * Sender);
void __fastcall btnDecryptPClick (TObject * Sender);
void __fastcall btnEncryptGClick (TObject * Sender);
void __fastcall btnDecryptGClick (TObject * Sender);
void __fastcall btnEncryptMClick (TObject * Sender);
void __fastcall btnDecryptMClick (TObject * Sender);
void __fastcall FormClose (TObject * Sender, TCloseAction Action);
void __fastcall N10Click (TObject * Sender);
void __fastcall N11Click (TObject * Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1 (TComponent * Owner);
extern PACKAGE TForm1 * Form1;
void __fastcall TForm2 :: Button1Click (TObject * Sender)
Тестування і використовувалася програма
1. Відкрийте програму на виконання, натиснувши швидкі кнопки Зберегти все і Запуск. Клацніть на кнопці ОК форми «Про програму». На головній формі підрозділ меню Очищення полів. дублююча його кнопка інструментальної панелі і кнопки Шифрування. Дешифрування виявляться недоступними.
2. У вікні TextPascal (Memo1) наберіть вихідний текст (див. Рис.4.6). Клацанням правою кнопкою миші на вікні викличте спливаюче меню і командою зберегти або зберегти як виведіть вихідний текст в текстовий файл. Командою Файл / Відкрити вихідний текст виведіть вихідний текст в інші вікна вихідного тексту. Команда головного меню Операції / Ініціалізація або клацання на дублюючої її кнопці інструментальної панелі ініціалізація зроблять доступними команду Операції \ Очищення полів. кнопку інструментальної панелі очищення полів і кнопки Шифрування. Дешифрування. і недоступними команду Операції / Ініціалізація і кнопку ініціалізація.
3. Зашифровать вихідний текст усіма трьома способами і зберегти зашифровані тексти з можливістю дешифрування. Для цього потрібно, клацаючи на кнопках Шифрування. в діалоговому вікні збереження файлу вказувати ім'я файлу і закривати вікно кнопкою Зберегти.
4. Дешифрувати зашифровані тексти. Для цього, по черзі стираючи вихідний текст, клацайте на кнопках Дешифрування.
5. Вивести на екран зашифровані тексти. Для цього, стерши зашифровані тексти, вводите команду Файл \ Відкрити зашифровані текст і вказуйте імена файлів. Переконайтеся в правильності операцій, повторивши п.4. На цьому тестування додатка завершується.
6. Введіть команду Операції / Очищення полів або клацніть на кнопці очищення полів. Зашифруйте і дешифрує довільні тексти, великі в 3-4 рази тестованого тексту.
7. Командою Файл / Вихід або клацанням на кнопці вихід завершите виконання програми.
1. Як шифрувати текст по трикутнику Паскаля, методом Гронсфельда, по матриці? Наведіть блок-схеми алгоритмів.
2. Як шифрувати слово по трикутнику Паскаля, методом Гронсфельда, по матриці? Наведіть блок-схеми алгоритмів.
3. Як шифрувати букву по трикутнику Паскаля, методом Гронсфельда, по матриці? Наведіть блок-схеми алгоритмів.
4. Як виводяться в файл результати шифрування?
5. Як дешифрувати знаходиться в файлі зашифрований текст?
6. Які можливості дає використання в проекті модулів без форм? Як створити такий модуль? Що він містить?
8. Як виконується директива умовної компіляції?
10. Як виконується конструктор класу?
11. Як виконується деструкція класу?
12. Вкажіть в коді точки, де викликається конструктор класу.
13. Де і як потрібно змінити код, щоб вивести кількість викликів конструктора?
14. Вкажіть в коді точки, де викликається деструктор класу.
15. Де і як потрібно змінити код, щоб вивести кількість викликів деструктора?
16. Як в додатку дати інформацію про програму та його розробника? Наведіть приклади.
17. Як здійснюється в проекті зв'язок між модулями?
19. Які можливості надає користувачеві Дослідник Класів?
Лабораторна робота 5