96604

Реалізація алгоритмів кодування тексту: шифри Атбаш та Плейфера

Курсовая

Информатика, кибернетика и программирование

Форма сама є компонентом з назвою Form. Якщо клацнути на самій формі і натиснути клавішу F1 відкриється довідка по класу форми TForm. Компонент Form При використанні даного елемента я використовував наступні властивості: BorderStyle - визначає загальний вигляд вікна і операції зним які дозволяється виконувати користувачу...

Украинкский

2015-10-08

4.01 MB

2 чел.

PAGE   \* MERGEFORMAT3

                    Міністерство ОСВІТИ І НАУКИ УКРАЇНИ

          Буковинський державний фінансово-економічний університет

                                Обліково-економічний факультет

                                      Кафедра комп’ютерних наук

 

                                          КУРСОВИЙ ПРОЕКТ

                     з дисципліни «Алгоритмізація та програмування»

 

                                                          на тему:

"Реалізація алгоритмів кодування тексту: шифри Атбаш та Плейфера"

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

 І-го курсу

 групи КН-12             ________________________   Косар А.Д.

                (підпис)

 Науковий керівник ________________________   асистент кафедри

                                                                              (підпис)                   комп’ютерних наук   

                                                Довгунь А.Я.

 Завідувач кафедри ________________________   д.т.н. Стеценко І.В. 

                                                             (підпис)                     

 

 Національна шкала _______ Кількість балів _______ Оцінка ECTS _____

 

                                                       

                                                    Чернівці-2015

                                                          

 

Зміст

[1] Зміст

[2]

[3] Вступ

[4] РОЗДІЛ I. РЕАЛІЗЦІЯ АЛГОРИТМІВ КОДУВАННЯТЕКСТУ, ШИФРИ АТБАШ ТА ПЛЕЙФЕРА

[4.1] 1.1.Шифрування тексту шифр Атбаш

[4.2] 1.2. Шифрування тексту шифр Плейфера

[5] РОЗДІЛ II. СЕРЕДОВИЩЕ ПРОГРАМУВАННЯ C++ BUILDER

[5.1] 2.1. Основні характеристики середовища програмування C++ Builder 6

[5.2] Основні компоненти середовища програмування C++ Builder 6 та їх властивості

[6] РОЗДІЛ ІІІ. ПРОГРАМА РЕАЛІЗАЦІЇ КОДУВАННЯ ТЕКСТУ ШИФРАМИ АТБАШ ТА ПЛЕЙФЕРА

[6.1] 3.1.Практичне використання шифрів Атбаш та Плейфера

[6.2] 3.2.Опис програмного продукту “Шифри Атбаш та Плейфера”

[7] ВИСНОВКИ ТА ПРОПОЗИЦІЇ

[8] СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

[9] Додатки


Вступ

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

Метою даної роботи є : дослідження та аналіз таких методів шифрування як Атбаш та Плейфера.

Завданням даної роботи є :

  1.  Вивчення методу шифрування тексту шифр Атбаш
  2.  Вивчення методу шифрування тесту шифр Плейфера
  3.  Створення програми, яка демонструє шифр Атбаш та шифр Плейфера  в дії.

Об’єктом даної роботи є : шифри Атбаш та Плейфера.

Предметом роботи є : властивості шифрування шифром Атбаш та метод шифрування Плейфера.

РОЗДІЛ I. РЕАЛІЗЦІЯ АЛГОРИТМІВ КОДУВАННЯТЕКСТУ, ШИФРИ АТБАШ ТА ПЛЕЙФЕРА

1.1.Шифрування тексту шифр Атбаш

Шифр Атбаш — простий шифр підстановки для івриту. Даним алгоритмом зашифровано частину біблійних текстів.

Правило шифрування полягає у заміні i-тої літери абетки літерою з номером    n − i + 1, де n — кількість літер в алфавіті. Таким чином, перша буква алфавіту замінюється останньою, друга — передостанньою і так далі. Приклад для латинського алфавіту виглядає так:

Вхідний текст: abcdefghijklmnopqrstuvwxyz

Зашифрований текст: ZYXWVUTSRQPONMLKJIHGFEDCBA

Застосування алгоритму до українського алфавіту:

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

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

Походження слова «Атбаш» пояснюється принципом заміни літер. Слово אתבש складено з літер «Алеф», «Тав», «Бет» та «Шин», тобто першої та останньої, другої та передостанньої літер давньосемітського алфавіту.

Отже шифр Атбаш є одним з найперших і не надто складних шифрів для шифрування тексту.

1.2. Шифрування тексту шифр Плейфера

Шифр Плейфера або квадрат Плейфера – ручна симетрична техніка шифрування, в якій вперше використана заміна Біграмма . Винайдена в 1854 році Чарльзом Уітстоном, але названа ім'ям Лорда Ліона Плейфера, який впровадив даний шифр в державні служби Великобританії. Шифр передбачає шифрування пар символів (Біграмм) замість одиничних символів, як у шифрі підстановки і в більш складних системах шифрування  Віженера. Таким чином, шифр Плейфера більш стійкий до злому в порівнянні з шифром простої заміни, так як ускладнюється частотний аналіз. Він може бути проведений, але не для 26 можливих символів (латинський алфавіт), а для 26х26 = 676 можливих біграм. Аналіз частоти Біграмма можливий, але є значно більш важким і вимагає набагато більшого обсягу зашифрованого тексту.
Незважаючи на те, що шифр був винаходом Уітстона, він став відомий як шифр Плейфера. Перший опис шифру Плейфера було зареєстровано в документі, підписаному Уітстоном 26 березня 1854. Міністерство закордонних справ Великобританії відхилив цей документ через складність його сприйняття. Коли Уітстон запропонував продемонструвати, що три з чотирьох хлопчиків у сусідній школі навчаться використовувати цей шифр за п'ятнадцять хвилин, заступник міністра закордонних справ відповів: «Це дуже можливо, але ви ніколи не навчили б цьому аташе.»

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

Використання шифру Плейфера в даний час є недоцільним, тому що сучасні переносні комп'ютери можуть легко зламати шифр протягом декількох секунд. Першим виданий алгоритм злому шифру Плейфера був описаний в 1914 році в брошурі обсягом 19 сторінок лейтенантом Джозефом О. Моуборном.

Шифр Плейфера використовує матрицю 5х5 (для латинського алфавіту, для кириличного алфавіту необхідно збільшити розмір матриці до 4х8), що містить ключове слово або фразу. Для створення матриці і використання шифру досить запам'ятати ключове слово і чотири простих правила. Щоб скласти ключову матрицю, в першу чергу потрібно заповнити порожні клітинки матриці буквами ключового слова (без запису повторюваних символів), потім заповнити решту осередки матриці символами алфавіту, що не зустрічаються в ключовому слові, по порядку (в англійських текстах зазвичай опускається символ «Q», щоб зменшити алфавіт, в інших версіях «I» і «J» об'єднуються в одну клітинку). Ключове слово може бути записано у верхньому рядку матриці зліва направо, або по спіралі з лівого верхнього кута до центру. Ключове слово, доповнене алфавітом, становить матрицю 5х5 і є ключем шифру.

Для того щоб зашифрувати повідомлення, необхідно розбити його на Біграмми (групи з двох символів), наприклад «Hello World» стає «HE LL OW OR LD», і відшукати ці Біграмми  в таблиці. Два символи  Біграмма  відповідають кутам прямокутника в ключовий матриці.Далі, визначаємо положення кутів цього прямокутника відносно один одного. Потім,  керуючись такими 4 правилами, зашифровуємо пари символів вихідного тексту:

1. Якщо два символи Біграмма збігаються (або якщо залишився один символ), додаємо після першого символу «Х», зашифровувати нову пару символів і продовжуємо. У деяких варіантах шифру Плейфера замість «Х» використовується «Q».

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

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

4. Якщо символи Біграмма и вихідного тексту знаходяться в різних стовпцях і різних рядках, то вони замінюються на символи, що знаходяться в тих же рядках, але відповідні іншим кутах прямокутника.

Для розшифровки необхідно використовувати інверсію цих чотирьох правил, відкидаючи символи «Х» (або «Q»), якщо вони не несуть сенсу у вихідному повідомленні.

Використовуємо ключ «playfair example», тоді матриця прийме вигляд:

    P L A Y F 
    I R E X M 
    B C D G H 
    J K N O S 
    T U V W Z 

Зашифруємо повідомлення «Hide the gold in the tree stump»
HI DE TH EG OL DI NT HE TR EX ES TU MP 
1. Біграмма  HI формує прямокутник, замінюємо її на BM.
2. Біграмма  DE розташований в одному стовпці, замінюємо її на ND.
3. Біграмма  TH формує прямокутник, замінюємо її на ZB.
4. Біграмма  EG формує прямокутник, замінюємо її на XD.
5. Біграмма  OL формує прямокутник, замінюємо її на KY.
6. Біграмма DI формує прямокутник, замінюємо її на BE.
7. Біграмма NT формує прямокутник, замінюємо її на JV.
8. Біграмма HE формує прямокутник, замінюємо її на DM.
9. Біграмма TR формує прямокутник, замінюємо її на UI.
10. Біграмма EX знаходиться в одному рядку, замінюємо її на XM.
11. Біграмма ES формує прямокутник, замінюємо її на MN.
12. Біграмма TU знаходиться в одному рядку, замінюємо її на UV.
13. Біграмма MP формує прямокутник, замінюємо її на IF.

Отримуємо зашифрований текст «BM ND ZB XD KY BE JV DM UI XM MN UV IF»
Таким чином повідомлення «Hide the gold in the tree stump» перетвориться в «BMNDZBXDKYBEJVDMUIXMMNUVIF»
Припустимо, що необхідно зашифрувати Біграмми у OR. Розглянемо 4 випадки:
1)*****
*OYRZ 
*****
*****
*****
OR замінюється на YZ 
2)**O**
**B**
*****
**R**
**Y**
OR замінюється на BY 
3)Z**O*
*****
*****
R**X*
*****
OR замінюється на ZX 
4)*****
*****
YOZ*R 
*****
*****
OR замінюється на ZY 
Криптоаналіз шифру Плейфера
Як і більшість шифрів формальної криптографії, шифр Плейфера також може бути легко зламаний, якщо є достатній обсяг тексту. Отримання ключа є відносно простим, якщо відомі шифрований і звичайний текст. Коли відомий тільки зашифрований текст, криптоаналітики аналізують відповідність між частотою появи Біграма в зашифрованому тексті і відомій частоті появи Біграма в мові, на якій написано повідомлення.

Шифр Плейфера подібний шифру двох квадратів, хоча відносна простота системи шифрування Плейфера спрощує ідентифікацію тексту. Примітно, що Біграмма шифру Плейфера та її інверсія (AB і BA) буде розшифрована як інша Біграмма та її інверсія (RE і ER). В англійській мові є багато слів, які містять такі інверсні Біграмми, наприклад REceivER і DEpartED. Ідентифікація близько лежачих інверсних Біграмм зашифрованого тексту і знаходження їм відповідностей в списку відомих слів вихідного тексту є одним з легких способів побудови вихідного тексту і почала конструювання ключа.

Існує інший підхід до криптоанализу шифру Плейфера, який називається  Random-restart hill climbing. Він грунтується на матриці випадкових символів. За допомогою найпростіших ітерацій матриця випадкових символів максимально наближається до оригінальної матриці. Очевидно, що цей метод дуже складний для людини, але комп'ютери за допомогою даного алгоритму можуть зламати даний шифр, навіть маючи невеликий обсяг тексту. Іншою відмінною особливістю шифру Плейфера від шифру з двома квадратами є те, що в ньому ніколи не зустрічаються Біграмми і з повторюваними символами (наприклад ЇЇ). Якщо в зашифрованому тексті відсутні Біграмми і з повторюваними символами і його довжина досить велика, то можна припустити, що вихідний текст зашифрований шифром Плейфера.

У главі 7 книги «Solution to polygrafic substitution systems» на сайті Field Manual 34-40-2 Сухопутних Військ США, можна знайти керівництво для знаходження ключа для шифру Плейфера. Детальний криптоаналіз шифру Плейфера згадується в главі 28 новели «Розшукується труп» (автор - Дороті Сейер). У цьому творі показано, що шифр Плейфера є криптографічно слабким, тому що детектив знайшов ключ до повідомлення досить швидко. Книга Сейер включає детальний опис механізму шифрування методом Плейфера, а також і покрокове керівництво для його криптоаналізу. Німецька армія, ВПС і поліція використовували подвійну систему шифрування Плейфера, як шифр «середнього гатунку», у Другій світовій війні. Вони додали другий квадрат, так як під час Першої світової війни шифр Плейфера був зламаний. З цього квадрата брали другий символ кожної Біграмми, не використовуючи ключове слово  поміщаючи символи в довільному порядку. Але і цей шифр був зламаний в Блечлі-парк, бо німці використовували один і той же шаблон повідомлення. У восьми повідомленнях, зашифрованих подвійним шифром Плейфера, були використані цифри від одного до дванадцяти, це і дало можливість досить легко зламати його.

Отже шифр Пейфера є достатньо складним шифром, проте з розвитком технологій він став ненадійним.

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


РОЗДІЛ II. СЕРЕДОВИЩЕ ПРОГРАМУВАННЯ C++ BUILDER

2.1. Основні характеристики середовища програмування C++ Builder 6

Кожна програма повинна мати зручний інтерфейс для спілкування з користувачем. Основним елементом інтерфейсу у Windows є вікна. Одним з різновидів вікон є форма, яка може містити кнопки, текстові поля, перемикачі тощо.

Тому програми, написані для використання у Windows, зазвичай мають інтер

фейс, подібний до вікон та форм. Для швидкого і зручного створювання про-

грам з графічним інтерфейсом використовують спеціальні середовища візуаль-

ного програмування. Майже кожна сучасна мова програмування має принаймні

одне таке середовище: Object Pascal – Borland Delphi, Basic – Visual Basic, C++ –

Borland C++ Builder, Microsoft Visual C. Візуальне програмування ще називають

Rapid Application Development (RAD), “швидка розробка додатків”. Технологія

RAD суттєво прискорює створення програм з графічним інтерфейсом.

Інструментальна  система  Builder,  подібно  до  інших  систем  візуального програмування (Visual C, Visual Basic, Delphi тощо), насамперед є посередником поміж  інтерфейсом  прикладного  програмування  Windows  (API  –  Application Program  Interface)  та  програмістом,  надаючи  змогу  навіть  програмістам початківцям оперативно створювати програмні проекти, які матимуть графічний інтерфейс користувача (GUI – Graphic User Interface) найрізноманітнішої спрямованості, від суто обчислювальних і логічних до графічних і мультимедійних.  

C++ Builder – це технологія візуального програмування, де автоматизовано її трудомістку частину і створювання інтерфейсних програм з діалоговими вікнами. Оболонка C++ Builder надає змогу замість повного самостійного написання  програми  використовувати  великий  набір  готових  візуальних  об’єктів,так  званих  компонентів,  піктограми  яких  розміщені  на  відповідних  вкладках палітри компонентів. В С++ Builder існує понад 100 компонентів. Всі компоненти зібрано у бібліотеці візуальних компонентів VCL – Visual Class Library.  

С++  Builder  призначено  для  написання  програм  мовою  програмування C++ і поєднує VCL та середовище програмування (IDE – Integrated Development Environment), написані на Delphi з компілятором C++. Цикл створення програмних проектів у C++ Builder є аналогічний до Delphi, але із суттєвими поліпшеннями. Більшість компонентів, розроблених у Delphi, можна використовувати і в C++ Builder без модифікації, але, на жаль, зворотне твердження не слушне. С++ Builder дозволяє методом drag-and-drop доволі просто розробляти інтерфейсні програми, що зумовлює підвищення ефективності та простоту програмування, оскільки програмістові не треба кожного разу створювати ті елементи власних програм, котрі може бути реалізовано за допомогою вже існуючих об’єктів.  

Основним будівельним об’єктом візуального програмування є компонент.

Компонентами в C++ Builder є об’єкти чи класи об’єктів, які є, у певному ро-

зумінні, об’єктами “реального світу”. Їх безпосередньо видно на екрані (за ви-

нятком групи невидимих компонентів), їх можна пересувати мишею, вони мо-

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

Властивості (Properties) дозволяють легко встановлювати різні характе-

ристики  компонентів,  такі  як  назва,  розміри,  контекстні  підказки  чи  джерела даних.  Методи  (функції-члени)  виконують  певні  операції  над  компонентним об’єктом, у тому числі й такі складні, як відтворювання чи перемотування пристрою мультимедіа. Події (Events) пов’язують зовнішні впливи, на які реагують компоненти, такі як активізація, натиснення кнопок чи редаговане введення – з кодами реакції на ці впливи. Окрім того, події можуть виникати за таких специфічних змінювань стану компонента, як поновлення даних в інтерфейсних елементах доступу до баз даних.  

За приклад об’єкта розглянемо компонент Button, який за суттю є кноп-

кою і має низку властивостей: ім’я, розміри (довжина й висота) і розташування

на  формі,  окреслення  меж,  надпис  на  кнопці,  шрифт,  стиль,  розмір  та  колір надпису,  видимість  (кнопка  може  існувати,  але  бути  невидимою)  тощо.  Для кнопки можна створювати різні події, наприклад: клацання кнопкою миші, натискання клавіші клавіатури тощо. Методами для кнопки можуть бути алгоритми,  які  виконують  такі  дії:  переміщення  самої  кнопки,  змінювання  розмірів, створення нової чи знищення існуючої кнопки тощо.  

Програмування в С++ Builder складається з двох етапів:

  1.  конструювання візуального інтерфейсу за допомогою компонентів;  
  2.  написання  програмного  коду,  виконання  команд  якого  забезпечить

розв’язок певної задачі.

Вікно середовища C++ Builder при завантаженні складається з таких елементів :

  1.  вікно форми;
  2.  вікно коду програми;
  3.  головне меню;
  4.  “гарячі” кнопки інструментальних панелей;
  5.  палітра компонентів;
  6.  вікно інспектора об’єктів.

Рис. 2.1. Стартове вікно програми

Основні компоненти середовища програмування C++ Builder 6 та їх властивості

Вікно форми  займає найбільше місце і є прямокутним сірим “контейнером”  ,  на  який  при  проектуванні  форми  розміщують  компоненти (кнопки, надписи, панелі, вікна редакторів тощо). Форма сама є компонентом з назвою  Form.  Без  додаткових  вказівок  заголовок  компонента  (властивість Caption) збігається з його назвою (властивість Name), до якої додається порядковий номер, розпочинаючи з 1 (приміром  Button1, Button2). Але заголовок змінити за допомогою властивості Caption. Розміри форми також можна змінювати чи то за допомогою вікна Object Inspector, чи просто “зачепивши” мишкою за лінію межі форми (цього моменту курсор набуває вигляду двонапрямленої стрілки). Для розміщених на формі компонентів можна викликати контекстну довідку,  для  чого  слід  виокремити  потрібний  компонент  і  натиснути  клавішу <F1>.  Якщо  клацнути  на  самій  формі  і  натиснути  клавішу  <F1>, відкриється довідка по класу форми TForm.

                           Рис. 2.2. Компонент Form

При використанні даного елемента я використовував наступні властивості:

  1.  BorderStyle - визначає загальний вигляд вікна і операції зним, які дозволяється виконувати користувачу;
  2.  Caption - являє собою текст заголовка елемента. А також я використовував цю властивість в наступних елементах: Label, Edit, Button;
  3.  Font є об'єктом типу TFont. Зміна шрифту можна здійснити або створенням нового об'єкта типу TFont, або зміною властивостей Color, Height, Name, Pitch, Size, Style існуючого об'єкта. А також, я використовував цю властивість в наступних елементах: Button, Label, Edit, UpDown, StringGrid, Form;
  4.  Left - визначає координату лівого краю компонента у точках. Для компонентів за початок відліку береться відстань від лівого краю форми  до лівої межі компоненту (наприклад, панелі, якщо даний компонент розташований на панелі, або форми, якщо компонент розташований безпосередньо на формі). А також я використовував цю властивість в наступних елементах: BitBtn, Label, Edit, StringGrid, UpDown,TChart;
  5.  Width - визначає горизонтальний розмір компонента чи форми у точках. Використовується для зміни ширини компонента при змінах розмірів вікна програми.  А також я використовував цю властивість в наступних елементах: BitBtn, Label, Edit, StringGrid, UpDown,TChart;

Button - це візуальний елемент “кнопка” за допомогою якого виконується подія. Щоб додати компонент “Button” потрібно вибрати в палітрі інструментів вкладку “Additional” і натиснути правою кнопкою мишки на елементі “Button” і натиснути цією кнопкою мишки на “Form” де має бути розміщений компонент.

Рис. 2.3. Компонент Button

При використанні даного елемента я використовував наступні властивості:

  •  Caption;
  •  Font;

Label - мітка. Використовується, в основному, для підпису інших компонентів. Наприклад, для назви введеної величини в Edit. Щоб додати компонент “Label” потрібно вибрати в палітрі інструментів вкладку “Standart” і натиснути правою кнопкою мишки на елементі “Label” і натиснути цією кнопкою мишки на Form де має бути розміщений компонент.

Рис. 2.4. Компонент Label

При використанні даного елемента я використовував наступні властивості:

  •  Caption;
  •  Font;
  •  Visible;
  •  Left;
  •  Enabled;
  •  Width.

Edit - компонент призначений для вводу інформації, а також можна ним і виводити інформацію. Щоб додати компонент “ Edit ” потрібно вибрати в палітрі інструментів вкладку “Standard” і натиснути правою кнопкою мишки на елементі “ Edit ” і натиснути цією кнопкою мишки на Form де має бути розміщений компонент.

Рис. 2.5. Компонент Edit

При використанні даного елемента я використовував наступні властивості:

  •  Caption; 
  •  Font;
  •  Visible;
  •  Width;
  •  Height;
  •  Enabled;
  •  MaxLengthдозволяє обмежувати кількість символів які були введені в поле Edit;
  •  Text - текст, який знаходиться в полі вводу/редагування.

OpenDialog- Виклик діалогового вікна Windows  “Відкрити файл”. Властивість FileName зберігає ім‟я файла, а властивість InitialDir – обраний шлях до теки з файлом

Рис. 2.6 Компонент OpenDialog

Memo- Багаторядкове текстове вікно для відображення, введення чи виведення тексту та значень даних програми; текст зберігається у властивості Lines

Рис. 2.6 Компонент Memo

ProgresBar- Прямокутний індикатор, який зафарбовується зліва направо заданим кольором у міру  виконування певного процесу в програмі.Властивості Min та Мах задають інтервал  значень індикатора. Властивість Step задає крок змінювання значень позиції індикатора (властивість Position)

Рис. 2.7 Компонент ProgressBar

TabControl- Сторінки із закладками, котрі може обирати  користувач. Кількість закладок і надписи  на них задаються властивістю Tabs.  Автоматичне оновлення вмісту сторінок  при перемиканні не відбувається, тому  програміст має робити це самостійно

Рис. 2.8 Компонент TabControl

RadioButton - Кругла кнопка з двома станами і текстом опису, який специфікує її призначення. Радіокнопки – набір взаємовиключних варіантів вибору: лише одна кнопка може бути обрана на даний момент часу (позначається внутрішнім чорним кружечком), а з попередньо обраної кнопки вибір автоматично знімається. При натисканні радіокнопки властивість Checked змінюється  

і виникає подія OnClick.

Рис. 2.9 Компонент RadioButton

RadioGroup- Є комбінацією групового вікна GroupBox і групи залежних радіокнопок RadioButton. Лише одну кнопку з групи може бути обрано. Перелік кнопок задається властивістю Items. Значення властивості Itemlndex зумовлює, яку саме радіокнопку обрано на цей момент. Можна групувати радіокнопки  

у кілька стовпчиків за допомогою властивості Columns

Рис. 2.10 Компонент RadioGroup

РОЗДІЛ ІІІ. ПРОГРАМА РЕАЛІЗАЦІЇ КОДУВАННЯ ТЕКСТУ ШИФРАМИ АТБАШ ТА ПЛЕЙФЕРА

3.1.Практичне використання шифрів Атбаш та Плейфера

Практичне використання шифру Атбаш:

Для початку напишемо слово або речення яке будемо шифрувати, наприклад таке слово як Україна після шифрування буде виглядати так: Зоїярля.

Практичне використання шифру Плейфера:

Для шифру Плейфера на відміну від Атбаш потрібно ввести ще й ключове слово в якому літери повинні не повторюватись, наприклад: Comander і вписуємо речення або слово для шифрування: I am Ukrainians , і розбивається на Біграма и(символи з двох літер) Ia mU kr ai ni an sx (якщо непарна кількість літер то вкінці вставляється “X”, потім створюємо квадратну матрицю в яку занесено всі символи :

Рис. 3.1. Матриця

і отримаємо такий шифрований текст: e^na№PiBrcrfndh;

3.2.Опис програмного продукту “Шифри Атбаш та Плейфера”

В процесі розробки програмного продукту в моїй програмі були використані наступні компоненти середовища програмування C++ Builder 6:

  1.  TabControl;
  2.  Memo;
  3.  Edit;
  4.  Button;
  5.  ProgressBar;
  6.  RadioButton;
  7.  RadioGroup;
  8.  OpenDialog;
  9.  SaveDialog;
  10.  MainMenu;

Компонент TabControl створює вкладки на яких і розміщуються інші компоненти.

Компоненти Memo:

  1.  Memo1 – відповідає за текст який вводиться в програму.
  2.  Memo2 являє собою решітку за допомогою якої програма виконує свої функції.
  3.  Memo3 – в даний компонент вводиться зашифрований текст.

Компоненти Button:

  1.  Button1 – відкриває тестовий файл з якого буде шифруватися текст.
  2.  Button2 – виконує функцію шифрування тексту на вкладці «Шифр Плейфера».
  3.  Button3 – виконує функцію зберігання тексту
  4.  Button4 – викону функцію розшифрування тексту на вкладці «Шифр Атбаш».
  5.  Button5 – очищує текст в компоненті Memo1.
  6.  Button6 – копіює текст в компонент Memo1 і одразу ж очищує компонент Memo3.
  7.  Button7 - виконує функцію шифрування тексту на вкладці «Шифр Атбаш».

Рис. 3.2. Працююча програма

Рис. 3.3. Вигляд програми «Plefer_upgrade» в роекті середовища С++ Builder

Рис. 3.4. Вигляд роботи програми

 

Рис. 3.5. Вигляд роботи програми


ВИСНОВКИ ТА ПРОПОЗИЦІЇ

В програмі я використав наступні компоненти С++ Builder: Form, Button, Label, Edit, TabControl, Memo, ProgressBar, OpenDialog, RadioButton, RadioGroup . За допомогою цих візуальних та не візуальних компонентів та їх властивостей програмою стало зручніше маніпулювати і програма набула необхідного вигляду. З допомогою цих компонентів мені вдалось досягнути поставлених завдань та закріпив набуті під час виконання роботи навички.

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

Другий розділ присвячений розгляду середовища програмування C++ Builder, в якому написаний програмний продукт. Також охарактеризовано візуальні компоненти, які використовувалися для побудови програмного продукту.

В третьому розділі презентовано програмний продукт для реалізації двох вищевказаних алгоритмів.


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

  1.  С++. Теорія та практика : Навч. посібник / [О. Г. Трофименко,

Ю. В.  Прокоп, І. Г. Швайко, Л. М. Буката та ін.] 2004. 35-41 с.

  1.  Глушков С.В. Microsoft Office XP / С.В. Глушаков, А.С. Сурядний. – Харьков: Фолио, 2006. – 750 с.
  2.  Дибкова Л.М. Інформатика і комп’ютерна техніка: Навч. посіб. для студ. вищ. навч. закл. / Л.М. Дибкова. – 2-е вид., переробл., допов. – К.: Академвидав, 2005. – 415 с.
  3.  Навч.-методичний  посібник  /  В.В.Войтенко,  А.В.Морозов.  –

Житомир: ЖДТУ, 2004. – 148-149 с.  


Додатки

Лістинг програми “Plefer_upgrade

#include <vcl.h>

#include "stdio.h"

#include "conio.h"

#include "windows.h"

#pragma hdrstop

#include "Unit1.h"

#include "Unit2.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

const char UPPER_DECODED[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

const char UPPER_ENCODED[] = "ZYXWVUTSRQPONMLKJIHGFEDCBA";

const char LOWER_DECODED[] = "abcdefghijklmnopqrstuvwxyz";

const char LOWER_ENCODED[] = "zyxwvutsrqponmlkjihgfedcba";

#include <string.h>

#include <ctype.h>

TForm1 *Form1;

AnsiString Al = "ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя !@\"#№$;%^:&?*()-_+={}[]\\/<>.,~`0123456789";

AnsiString MyText = "";                                  // Введений текст

AnsiString Key = "";                                     // Введений ключ

AnsiString R = "";                                       // Отримана решітка

AnsiString ResText = "";                                 // Отриманий текст

AnsiString Pust = "";                                    // Порожняк

char Resh[10][16];                                       // Масив літер решітки

AnsiString Dir;                                          // Директорія для знаходження програми

//* Початкові умови при появі Форми на екрані                          *//

__fastcall TForm1::TForm1(TComponent* Owner)

       : TForm(Owner)

{

 Form1->Edit1->Text = "  ";

 Form1->Button1->Enabled = true;

 Form1->Button2->Enabled = true;

 Form1->Button3->Enabled = false;

 Form1->RadioButton1->Checked = true;

 Form1->Label2->Caption = Form1->Memo1->Text.Length();

 Form1->Label3->Caption = Form1->Memo2->Text.Length();

 Dir = GetCurrentDir();

}

//* Функція відкриття файлу на копю'тері                                        *//

void OpenText()

{

if (Form1->OpenDialog1->Execute())

{

  MessageBox(NULL, "Не можливо відкрити файл!", "Виникла помилка!", MB_OK);

  Form1->Memo1->Clear();

  Form1->Memo2->Clear();

  Form1->Memo3->Clear();

  Form1->Label2->Caption = Form1->Memo1->Text.Length();

  Form1->Label3->Caption = Form1->Memo2->Text.Length();

  Form1->Button2->Enabled = false;

  Form1->Button3->Enabled = false;

}

else

{

  // Обнуляємо всі умови

  Form1->ProgressBar1->Position = 0;

  Form1->Memo1->Clear();

  Form1->Memo2->Clear();

  Form1->Memo3->Clear();

  MyText = "";

  Key = "";

  R = "";

  ResText = "";

  Pust = "";

  for (int i=0; i<10; i++)

    for (int j=0; j<16; j++)

      Resh[i][j] = NULL;

  Form1->Memo1->Lines->LoadFromFile(Form1->OpenDialog1->FileName);

  Form1->Label2->Caption = Form1->Memo1->Text.Length();

  Form1->Label3->Caption = Form1->Memo2->Text.Length();

  Form1->Button2->Enabled = true;

  Form1->Button3->Enabled = false;

}

}

//* Функція перевірки повтору літер                       *//

bool CheckKey()

{

 for (int i=1; i<=Key.Length(); i++)

   for (int j=1; j <= Key.Length(); j++)

     if ((Key[i] == Key[j]) && (i != j))

       return false;

 return true;

}

//* Функція створення і виводу решітки на форму                               *//

void CreateR()

{

 Form1->Memo3->Clear();

 R = Key;

 AnsiString Alphabet = Al;

 for (int i=1; i<=Key.Length(); i++)

   for (int j=1; j<=Alphabet.Length(); j++)

     if (Key[i] == Alphabet[j])

       Alphabet = Alphabet.Delete(j,1);

 R += Alphabet;   // Створили рядкок з решітки

 int num = 1;

 AnsiString Str = "";

 for (int i=0; i<10; i++)

 {

   Str = "";

   for (int j=0; j<16; j++)

   {

     Str += R[num];

     if (j != 16)

       Str += " ";

     num++;

   }

   Form1->Memo3->Lines->Add(Str);

 }

 // Заповняємо масив літер решітки

 num = 1;

 for (int i=0; i<10; i++)

   for (int j=0; j<16; j++)

   {

     Resh[i][j] = R[num];

     num++;

   }

}

//* Функція вибору символу-порожняка                                         *//

void ChoosePust()

{

 int k = 0;

 int m = 1000;

 for (int i=1; i<=R.Length(); i++)

 {

   for (int j=1; j<=MyText.Length(); j++)

     if (R[i] == MyText[j])

       k++;

   if (k<m)

   {

     m = k;

     k = 0;

     Pust = R[i];

   }

 }

}

//* Функція вставлення порожняків і перевірки тексту на скінченність        *//

void EditText()

{

 ChoosePust();    // обираємо прожняк

 // Вставляємо прожняки в повторювані комірки Біграма

 for (int i=1; i<MyText.Length(); i++)

   if (MyText[i] == MyText[i+1])

     MyText = MyText.Insert(Pust,i+1);

 //* Перевіряємо текст на парність і якщо він не парний тоді вставляємо в кінець довільний символ                                                                                *//

 int Len = MyText.Length();

 if (Len % 2 != 0)

   MyText += Pust;

}

//* Функція шифрування тексту                                                *//

void Encrypt()

{

  ResText = "";

  Form1->ProgressBar1->Position = 0;

  Form1->ProgressBar1->Min = 0;

  Form1->ProgressBar1->Max = MyText.Length();

  // індекси літер в стовпцях

  int ind_x1 = 0;

  int ind_y1 = 0;

  int ind_x2 = 0;

  int ind_y2 = 0;

  int k = 1;

  while (k<MyText.Length())

  {

     for (int i=0; i<10; i++)

       for (int j=0; j<16; j++)

       {

         if (MyText[k] == Resh[i][j])

         {

           ind_x1 = i;

           ind_y1 = j;

         }

         if (MyText[k+1] == Resh[i][j])

         {

           ind_x2 = i;

           ind_y2 = j;

         }

       }

    // Якщо літери знаходяться в одному рядку

    if (ind_x1 == ind_x2)

    {

       if (ind_y1 == 15)

       {

         ResText += Resh[ind_x1][0];

         ResText += Resh[ind_x2][ind_y2+1];

       }

       else

       if (ind_y2 == 15)

       {

         ResText += Resh[ind_x1][ind_y1+1];

         ResText += Resh[ind_x2][0];

       }

       else

       {

         ResText += Resh[ind_x1][ind_y1+1];

         ResText += Resh[ind_x2][ind_y2+1];

       }

    }

    // Якщо літери знаходяться в одному стовпці

    if (ind_y1 == ind_y2)

    {

       if (ind_x1 == 9)

       {

         ResText += Resh[0][ind_y1];

         ResText += Resh[ind_x2+1][ind_y2];

       }

       else

       if (ind_x2 == 9)

       {

         ResText += Resh[ind_x1+1][ind_y1];

         ResText += Resh[0][ind_y2];

       }

       else

       {

         ResText += Resh[ind_x1+1][ind_y1];

         ResText += Resh[ind_x2+1][ind_y2];

       }

    }

    // Якщо літери знаходяться в різних рядках в різних стовпцях

    if ((ind_x1 != ind_x2) && (ind_y1 != ind_y2))

    {

      ResText += Resh[ind_x1][ind_y2];

      ResText += Resh[ind_x2][ind_y1];

    }

    k = k + 2;

    Form1->ProgressBar1->StepBy(2);

  }

  Form1->Memo2->Lines->Add(ResText);

  Form1->Label3->Caption = Form1->Memo2->Text.Length();

  Form1->Button3->Enabled = true;

  MessageBox(NULL, "Текст успішно зашифровано!", "Вітаю!", MB_OK);

}

//* Функція розшифрування тексту                                             *//

void Decrypt()

{

  ResText = "";

  Form1->ProgressBar1->Position = 0;

  Form1->ProgressBar1->Min = 0;

  Form1->ProgressBar1->Max = MyText.Length();

  // індекси літер в стовпцях

  int ind_x1 = 0;

  int ind_y1 = 0;

  int ind_x2 = 0;

  int ind_y2 = 0;

  int k = 1;

  while (k<MyText.Length()-2)

  {

     for (int i=0; i<10; i++)

       for (int j=0; j<16; j++)

       {

         if (MyText[k] == Resh[i][j])

         {

           ind_x1 = i;

           ind_y1 = j;

         }

         if (MyText[k+1] == Resh[i][j])

         {

           ind_x2 = i;

           ind_y2 = j;

         }

       }

    // Якщо літери знаходяться в одному рядку

    if (ind_x1 == ind_x2)

    {

       if (ind_y1 == 0)

       {

         ResText += Resh[ind_x1][15];

         ResText += Resh[ind_x2][ind_y2-1];

       }

       else

       if (ind_y2 == 0)

       {

         ResText += Resh[ind_x1][ind_y1-1];

         ResText += Resh[ind_x2][15];

       }

       else

       {

         ResText += Resh[ind_x1][ind_y1-1];

         ResText += Resh[ind_x2][ind_y2-1];

       }

    }

    // Якщо літери знаходяться в одному стовпці

    if (ind_y1 == ind_y2)

    {

       if (ind_x1 == 0)

       {

         ResText += Resh[9][ind_y1];

         ResText += Resh[ind_x2-1][ind_y2];

       }

       else

       if (ind_x2 == 0)

       {

         ResText += Resh[ind_x1-1][ind_y1];

         ResText += Resh[9][ind_y2];

       }

       else

       {

         ResText += Resh[ind_x1-1][ind_y1];

         ResText += Resh[ind_x2-1][ind_y2];

       }

    }

    // Якщо літери знаходяться в різних рядках в різних стовпцях

    if ((ind_x1 != ind_x2) && (ind_y1 != ind_y2))

    {

      ResText += Resh[ind_x1][ind_y2];

      ResText += Resh[ind_x2][ind_y1];

    }

    k = k + 2;

    Form1->ProgressBar1->StepBy(2);

  }

  Form1->Memo2->Lines->Add(ResText);

  Form1->Label3->Caption = Form1->Memo2->Text.Length();

  Form1->Button3->Enabled = true;

  MessageBox(NULL, "Текст успішно розшифровано!", "Вітаю!", MB_OK);

}

//* Функция сохранения зашифрованного текста                                 *//

void FileSave()

{

 if (Form1->RadioButton1->Checked == true)

 {

   Form1->Memo2->Lines->SaveToFile(Dir + "\\encrypted.txt");

   MessageBox(NULL, "Результат збережено у файл encrypted.txt в папці з програмою", "Вітаю!", MB_OK);

   Form1->Button3->Enabled = false;

   Form1->ProgressBar1->Position = 0;

 }

 if (Form1->RadioButton2->Checked == true)

 {

   Form1->Memo2->Lines->SaveToFile(Dir + "\\decrypted.txt");

   MessageBox(NULL, "Вітаю!", "Результат збережено у файл decrypted.txt в папке с програмою", MB_OK);

   Form1->Button3->Enabled = false;

   Form1->ProgressBar1->Position = 0;

 }

}

//* Кнопка "Відкрити файл"                              *//

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if(OpenDialog1->Execute())

Memo1->Lines->LoadFromFile(OpenDialog1->FileName);

}

//*Кнопка "Старт"                                     *//

void __fastcall TForm1::Button2Click(TObject *Sender)

{

 if (Form1->Memo1->Text.Length() == 0)

   MessageBox(NULL, "Сталася помилка!", "Немає тексту для шифрування!", MB_OK);

 else

 {

   MyText = Form1->Memo1->Text;

   Key = Form1->Edit1->Text;

   if (!CheckKey())

     MessageBox(NULL, "Сталася помилка!" , "Ключове слово має повторювані символи!", MB_OK);

   else

   {

     Form1->Memo2->Clear();

     if (Form1->RadioButton1->Checked == true)

     {

       CreateR();

       EditText();

       DWORD id = 0;

       HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Encrypt, NULL, 0, &id);

     }

     if (Form1->RadioButton2->Checked == true)

     {

       CreateR();

       DWORD id = 0;

       HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Decrypt, NULL, 0, &id);

     }

   }

 }

}

//* Кнопка "Зберегти"                                 *//

void __fastcall TForm1::Button3Click(TObject *Sender)

{

if(Memo3->Modified)

if(SaveDialog1->Execute())

Memo3->Lines->SaveToFile(SaveDialog1->FileName);

}

//* Вибрана функція  "Шифрувати"                    *//

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

 Form1->Memo2->Clear();

 Form1->Memo3->Clear();

 Form1->Label2->Caption = Form1->Memo1->Text.Length();

 Form1->Label3->Caption = Form1->Memo2->Text.Length();

 Form1->Button3->Enabled = false;

 Form1->ProgressBar1->Position = 0;

}

//* Вибрана функція  "Розшифрувати"                  *//

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

 Form1->Memo2->Clear();

 Form1->Memo3->Clear();

 Form1->Label2->Caption = Form1->Memo1->Text.Length();

 Form1->Label3->Caption = Form1->Memo2->Text.Length();

 Form1->Button3->Enabled = false;

 Form1->ProgressBar1->Position = 0;

}

//* Кнопка "Про програму"                               *//

void __fastcall TForm1::Button4Click(TObject *Sender)

{

 AboutBox->ShowModal();

}

//*Кнопка "Очистити"                                  *//

void __fastcall TForm1::Button5Click(TObject *Sender)

{

 Form1->Memo1->Clear();

 Form1->Label2->Caption = Form1->Memo1->Text.Length();

}

//* Кнопка "Копіювати"                                *//

void __fastcall TForm1::Button6Click(TObject *Sender)

{

 Form1->Memo1->Text = Form1->Memo2->Text;

 Form1->Memo2->Clear();

 Form1->Memo3->Clear();

 Form1->Label2->Caption = Form1->Memo1->Text.Length();

 Form1->Label3->Caption = Form1->Memo2->Text.Length();

}

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

//* Зміна вкладки в програмі                                  *//

void __fastcall TForm1::TabControl1Change(TObject *Sender)

{

if(TabControl1->TabIndex==0)

{

GroupBox1->Visible=true;

GroupBox2->Visible=true;

GroupBox3->Visible=true;

RadioButton1->Visible=true;

RadioButton2->Visible=true;

RadioGroup1->Visible=true;

Button7->Visible=false;

Button4->Visible=false;

Edit2->Visible=false;

Edit3->Visible=false;

Label4->Visible=false;

Label5->Visible=false;

}

if(TabControl1->TabIndex==1)

{

GroupBox1->Visible=false;

GroupBox2->Visible=false;

GroupBox3->Visible=false;

Button7->Visible=true;

Button4->Visible=true;

Edit2->Visible=true;

Edit3->Visible=true;

Label4->Visible=true;

Label5->Visible=true;

RadioButton1->Visible=false;

RadioButton2->Visible=false;

RadioGroup1->Visible=false;

}

}

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

void __fastcall TForm1::N7Click(TObject *Sender)

{

ShowMessage("Зкрити програму?");

Close();

}

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

void __fastcall TForm1::N2Click(TObject *Sender)

{

if(SaveDialog1->Execute())

Memo3->Lines->SaveToFile(SaveDialog1->FileName);

}

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

void __fastcall TForm1::N3Click(TObject *Sender)

{

if(SaveDialog1->Execute())

Memo3->Lines->SaveToFile(SaveDialog1->FileName);

}

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

void __fastcall TForm1::N4Click(TObject *Sender)

{

 Form1->Memo1->Text = Form1->Memo2->Text;

 Form1->Memo2->Clear();

 Form1->Memo3->Clear();

 Form1->Label2->Caption = Form1->Memo1->Text.Length();

 Form1->Label3->Caption = Form1->Memo2->Text.Length();

}

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


Кнопки які запускають процес шифрування в програмі


 

А также другие работы, которые могут Вас заинтересовать

73652. Опыт единоличной власти в России в XVI-XX веков 52.54 KB
  В многовековой истории России за редким исключением государство брало верх над обществом. как системы политических и экономических мер установление в России режима личной власти царя. Сложившаяся геополитическая ситуация благоприятствовала национальному возрождению России и превращению ее в крупное европейское государство.
73655. Закрепощение крестьян в России в конце XVI - начале XVII века 37.18 KB
  Очевидно что переходы крестьян в это время были введены в определенные границы и одна из задач работы состоит в выяснении существа этих границ. Самоквасовым еще две грамоты с упоминанием заповедных лет писал что в заповедный год выход или вывоз крестьян.
73659. Латинская патристика IV - V века 150 KB
  Прилагательное латинская приложенное к слову патристика указывая на то внешнее обстоятельство что церковные писатели о которых пойдет речь пользовались преимущественно или только латинским языком вместе с тем нацеливает на выявление некоторых особенностей более существенным образом характеризующих описываемое явление коль скоро перевод с одного языка на другой это всегда в какойто степени переход из одной культурной реальности в другую. Движение это происходит не только в пространстве но и...
73660. Антинаполеоновские коалиции и их противник 37.73 KB
  Троицкий считает что гуманная фразеология дипломатических документов освобождение от ига и цепей Наполеона обеспечение прав и свобод народов это не более чем фиговый листок . Данное обстоятельство в немалой степени обеспечило поражение Наполеона в информационной и идеологической войне а это в свою очередь безусловно повлияло и на достижение конечного победного результата в военных действиях. Поэтому не стоит столь категорично сбрасывать со счетов либеральную...