Методика оцінки ефективності криптографічної системи

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

Ефективність шифрування можна оцінити за наступними параметрами:

1. Простота використання

2. Швидкість шифрування інформації

3. Стійкість алгоритму до зовнішніх атак

4. Ціна

5. Кількість використаних математичних операцій

6. Перспективність алгоритму

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

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

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

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

2. Швидкість кодування інформації: сучасні алгоритми шифрують інформацію за секунди, а отже великої різниці між криптографічними системами не буде. Набагато важливіше питання – чи залежить час шифрування від кількості даних і наскільки? Ставимо 2, якщо залежності немає, 1 \ 0 якщо залежність є, але алгоритм шифрує швидко \ повільно і 0, якщо алгоритм працює з обмеженою кількістю даних.

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

4. Ціна: цей параметр досить відносний. Якщо шифр коштує більше, або стільки ж, скільки і інформація ставимо 0, якщо ціна шифру в півтора рази нижча ціни інформації ставимо 1, якщо ціна шифру менша за ціну інформації в 2 рази і більше, то ставимо 2.

5. Кількість використаних математичних операцій: якщо використана лише одна математична операція – такий алгоритм легко зламати, тому ставимо 0; при багатьох математичних операціях в криптографічній системі ставимо 1; якщо ж відслідкувати кількість операцій в алгоритмі неможливо ставимо 2.

6. Перспективність алгоритму: в цьому параметрі все залежить від давності створення алгоритму (який, звичайно, є загальноприйнятим), чим давніше була створена криптографічна система, тим більше методів винайдено для зламу, а отже система не є перспективною. Якщо алгоритм був створений не більше 5 років тому, ставимо 2; від 5 до 10 років існування алгоритму – ставимо 1; більше 10 років на ринку - ставимо 0. Також цей пункт відповідає поняттю життєвого цикла проекту (життєвий цикл проекту — це період часу від задуму проекту до його закінчення). Чим довше криптографічна система протримається на ринку, тим буде вища поставлена оцінка.

Після вибору замовником найголовнішого параметру, він має викреслити один з шести параметрів, який має найнижчу оцінку і не враховувати його в оцінці ефективності криптографічної системи. Після цього, оцінити алгоритм по п’яти параметрам і додати між собою цифри, які було отримано. В результаті отримаємо цифру від 0 до 10. Все що вище за 6 – рекомендовано для закупівлі. (Цей метод оцінки ефективності криптографічної системи було застосовано на таких алгоритмах, як «шифр Віженера» - 4, «шифр Вернама» - 5, а також «алгоритм Деффі-Хеллмана» - 7 і отримано правильні, на мій погляд, оцінки).

Питання оцінки стійкості криптографічних систем захисту інформації (СЗІ) є досить актуальним у наш час, коли існує багато крипто алгоритмів і постає задача їх вибору для побудови ефективних СЗІ і підвищення загального рівня конфіденційності. Таким чином, метою роботи є якісний аналіз критеріїв стійкості криптографічних СЗІ та інших актуальних проблем сучасної криптографії. Доказ існування абсолютно стійких алгоритмів шифрування (АШ) був виконаний Клодом Шеноном. Їм же визначені вимоги до систем такого роду: ключ генерується для кожного повідомлення (кожен ключ використовується один раз); ключ статистично надійний (тобто ймовірності появи кожного з можливих символів рівні, а символи в ключовій послідовності незалежні та випадкові); довжина ключа дорівнює або більша за довжину повідомлення; вихідний (відкритий) текст (ВТ) володіє деякою надмірністю (є критерієм оцінки правильності розшифрування). Стійкість цих СЗІ не залежить від того, якими обчислювальними можливостями володіє атакуюча сторона. Практичне застосування СЗІ, що задовольняють вимогам абсолютної стійкості, обмежено міркуваннями вартості і зручності користування.

Деякими аналітиками стверджується, що шифр Вернама є одночасно абсолютно криптографічно стійким і, до того ж, єдиним шифром, який задовольняє цій умові. В основному застосовуються практично стійкі або обчислювально стійкі СЗІ. Стійкість цих систем залежить від того, якими обчислювальними можливостями володіє Єва. Практична стійкість таких систем базується на теорії складності і оцінюється виключно на якийсь певний момент часу і послідовно з двох позицій: обчислювальна складність повного перебору; відомі на даний момент уразливості та їх вплив на обчислювальну складність. У кожному конкретному випадку можуть також існувати додаткові критерії оцінки стійкості. Базовими завданнями сьогоднішнього дня, які вирішуються криптопротоколами в мережах передачі даних, є аутентифікація, ідентифікація та ключовий обмін (розподіл ключів шифру- вання).

Існує також цілий ряд криптопротоколів, призначених для вирішення специфічних за- вдань. Слід мати на увазі, що один і той же криптопротокол може застосовуватися у різних областях. Наприклад, криптопротокол Kerberos в ході своєї роботи дозволяє провести аутентифікацію користувачів і здійснити ключовий обмін між учасниками. Як приклад можна навести досить простий криптопротокол ключового обміну. Його учасники, Аліса та Боб, хочуть виробити загальний секретний ключ для симетричного АШ, використовуючи відкриті канали передачі даних. Для цього вони використовують наступну послідовність дій: 1) Боб вибирає схему асиметричного шифрування, створює пару ключів для даної схеми – відкритий і секретний; 2) Боб посилає свій відкритий ключ Алісі; 3) Аліса створює секретний ключ для симетричного АШ; зашифровує його на відкритому ключі Боба і відсилає йому отрима- ний результат; 4) Боб, отримавши зашифрований секретний ключ від Аліси, розшифровує його своїм секретним ключем для асиметричного АШ. Тепер Аліса та Боб, використовуючи симетричний АШ, можуть обмінюватися зашифрованою інформацією у відкритих каналах зв'язку. Зазначений протокол не є безпечним, але вдало відображає саму ідею побудови подібних СЗІ.

Що стосується розподілу ключів шифрування між законними користувачами в умовах суворої секретності, то це є однією з найважливіших проблем сучасної криптографії, яка може бути вирішена за допомогою: класичної криптографічної схеми з теоретико-інформаційної стійкістю (для її реалізації необхідний канал з перешкодами; ефективність схеми вкрай низька – 1-5%); класичної криптографічної схеми з відкритим ключем (схема Диффі-Хеллмана, схема цифрового конверту; має обчислювальну стійкість); класичної симетричної криптографічної схеми з обчислювальною стійкістю (потребує наявності у абонентів попередньо встановленого ключа, тобто може розглядатися тільки як схема для збільшення довжини ключа, а не для його розподілення); квантового розподілу ключів (забезпечує теоретико-інформаційну стійкість, але потребує наявності у абонентів попередньо встановленого ключа для аутентифікації класичного каналу, тобто теж може розглядатися як схема для збільшення довжини ключа); методу довірених кур’єрів (висока вартість, велика залежність від людського чиннику).

Управління ключами складається з наступних процедур: ініціалізація ключової структури для користувачів в домені; створення, розподіл і інсталяція ключового матеріалу; контроль над використанням ключового матеріалу; оновлення, відновлення та знищення ключо- вого матеріалу; зберігання ключового матеріалу. Основною метою управління ключами є підтримка ключових взаємин і ключового матеріалу таким чином, щоб не сталося: компрометації таємних ключів; компрометації системи аутентифікації секретної ключової інформації або відкритих ключів; неавторизованого використання секретних або відкритих ключів (наприклад, необхідно забезпечувати неможливість використання ключів, термін дії яких закінчився).

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

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

Зрозуміло, що подібний висновок цілком може привести до розкриття системи супротивником. Розглянемо найпоширеніші на сьогоднішній день причини здійснення успішних атак на АШ: 1) наявність статистичної структури історично сформованих мов. Тобто, існують певні символи або комбінації символів, що найбільш часто зустрічаються в природній мові. Таким чином, при перехопленні зашифрованого повідомлення для деяких типів АШ можливо підрахувати частоту появи певних символів та зіставити їх з ймовірностями появи певних символів або їх комбінацій (біграми, триграми і т.д.), що в деяких випадках може привести до однозначного дешифрування окремих ділянок зашифрованого повідомлення; 2) наявність ймовірних слів. Мова йде про слова або вирази, появу яких можливо очікувати в перехопленому повідомленні. Таким чином, у діловому листуванні присутні шаблонні слова; в англійській мові, наприклад, найчастіше зустрічаються "and", "the", "are" і т.д.

Новий метод шифрування

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

Для простоти будемо шифрувати повідомлення, яке складається з букв англійської абетки, a саме, повідомлення «pasha». Для цього присвоємо кожній букві цифру. На початку програми, в коментарях, показано яким буквам відповідають цифри від 97 до 122. При виконанні програми отримуємо командний рядок, в який по запиту вводимо ключ, по кожним наступним запитам вводимо букви з яких складається повідомлення i отримуємо код шифру. При виконанні програми дешифрування по запиту вводимо ключ, по новому запиту вводимо код шифру y вигляді цифр i отримуємо розшироване повідомлення.

Шифрування:

Шифрування на Java виконується наступним чином. Спочатку кожній букві англійської абетки привласнюють цифри від 97 до 122. Далі пишеться код для виведення повідомлення «Введите ключ» i створюється поле для вводу інформації, a саме для вводу ключа в вигляді цифри. Схожий код написаний i для вводу повідомлення, після чого виконується цикл, який виводить на екран зашифроване повідомлення по формулі: код букви повідомлення + ключ + попередній код букви (якщо така є). В результаті отримуємо зашифроване повідомлення y вигляді цифр.

import java.util.*;
public class Shifrovanie {

/* Присвоение числа каждой букве алфавита: a=97,b=98,c=99,d=100,e=101,f=102,g=103,h=104,i=105,j=106,k=107,l=108,m=109, n=110,o=111,p=112,q=113,r=114,s=115,t=116,u=117,v=118,w=119,x=120,y=121,z=122*/
public static void main(String arg[]){
// Вводим ключ
System.out.println("Введите ключ");
Scanner pervoe = new Scanner(System.in);
int kluch = pervoe.nextInt();
// Вводим первую букву
System.out.println("Введите букву 1");
Scanner scan1 = new Scanner(System.in);
char bykva1 = scan1.next().charAt(0);
int perviyvvod = bykva1+kluch;

// Цикл для шифрования первой буквы
if (bykva1=='a'){switch (bykva1){
case 'a': bykva1=1; break;}System.out.println(perviyvvod);}
else if (bykva1=='b'){switch (bykva1){
case 'b': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='c'){switch (bykva1){
case 'c': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='d'){switch (bykva1){
case 'd': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='e'){switch (bykva1){
case 'e': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='f'){switch (bykva1){
case 'f': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='g'){switch (bykva1){
case 'g': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='h'){switch (bykva1){
case 'h': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='i'){switch (bykva1){
case 'i': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='j'){switch (bykva1){
case 'j': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='k'){switch (bykva1){
case 'k': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='l'){switch (bykva1){
case 'l': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='m'){switch (bykva1){
case 'm': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='n'){switch (bykva1){
case 'n': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='o'){switch (bykva1){
case 'o': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='p'){switch (bykva1){
case 'p': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='q'){switch (bykva1){
case 'q': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='r'){switch (bykva1){
case 'r': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='s'){switch (bykva1){
case 's': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='t'){switch (bykva1){
case 't': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='u'){switch (bykva1){
case 'u': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='v'){switch (bykva1){
case 'v': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='w'){switch (bykva1){
case 'w': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='x'){switch (bykva1){
case 'x': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='y'){switch (bykva1){
case 'y': bykva1=2; break;}System.out.println(perviyvvod);}
else if (bykva1=='z'){switch (bykva1){
case 'z': bykva1=2; break;}System.out.println(perviyvvod);}
// Цикл для шифрования второй буквы
System.out.println("Введите букву 2");

Scanner scan2 = new Scanner(System.in);
char bykva2 = scan2.next().charAt(0);
int vtoroyvvod = perviyvvod + bykva2;

switch (bykva2) {
case 'a': System.out.println(vtoroyvvod); break;
case 'b': System.out.println(vtoroyvvod); break;
case 'c': System.out.println(vtoroyvvod); break;
case 'd': System.out.println(vtoroyvvod); break;
case 'e': System.out.println(vtoroyvvod); break;
case 'f': System.out.println(vtoroyvvod); break;
case 'g': System.out.println(vtoroyvvod); break;
case 'h': System.out.println(vtoroyvvod); break;
case 'i': System.out.println(vtoroyvvod); break;
case 'j': System.out.println(vtoroyvvod); break;
case 'k': System.out.println(vtoroyvvod); break;
case 'l': System.out.println(vtoroyvvod); break;
case 'm': System.out.println(vtoroyvvod); break;
case 'n': System.out.println(vtoroyvvod); break;
case 'o': System.out.println(vtoroyvvod); break;
case 'p': System.out.println(vtoroyvvod); break;
case 'q': System.out.println(vtoroyvvod); break;
case 'r': System.out.println(vtoroyvvod); break;
case 's': System.out.println(vtoroyvvod); break;
case 't': System.out.println(vtoroyvvod); break;
case 'u': System.out.println(vtoroyvvod); break;
case 'v': System.out.println(vtoroyvvod); break;
case 'w': System.out.println(vtoroyvvod); break;
case 'x': System.out.println(vtoroyvvod); break;
case 'y': System.out.println(vtoroyvvod); break;
case 'z': System.out.println(vtoroyvvod); break;
}

// Цикл для шифрования третьей буквы
System.out.println("Введите букву 3");

Scanner scan3 = new Scanner(System.in);
char bykva3 = scan3.next().charAt(0);

int tretiyvvod = vtoroyvvod + bykva3;

switch (bykva3) {
case 'a': System.out.println(tretiyvvod); break;
case 'b': System.out.println(tretiyvvod); break;
case 'c': System.out.println(tretiyvvod); break;
case 'd': System.out.println(tretiyvvod); break;
case 'e': System.out.println(tretiyvvod); break;
case 'f': System.out.println(tretiyvvod); break;
case 'g': System.out.println(tretiyvvod); break;
case 'h': System.out.println(tretiyvvod); break;
case 'i': System.out.println(tretiyvvod); break;
case 'j': System.out.println(tretiyvvod); break;
case 'k': System.out.println(tretiyvvod); break;
case 'l': System.out.println(tretiyvvod); break;
case 'm': System.out.println(tretiyvvod); break;
case 'n': System.out.println(tretiyvvod); break;
case 'o': System.out.println(tretiyvvod); break;
case 'p': System.out.println(tretiyvvod); break;
case 'q': System.out.println(tretiyvvod); break;
case 'r': System.out.println(tretiyvvod); break;
case 's': System.out.println(tretiyvvod); break;
case 't': System.out.println(tretiyvvod); break;
case 'u': System.out.println(tretiyvvod); break;
case 'v': System.out.println(tretiyvvod); break;
case 'w': System.out.println(tretiyvvod); break;
case 'x': System.out.println(tretiyvvod); break;
case 'y': System.out.println(tretiyvvod); break;
case 'z': System.out.println(tretiyvvod); break;
}

// Цикл для шифрования четвертой буквы
System.out.println("Введите букву 4");

Scanner scan4 = new Scanner(System.in);
char bykva4 = scan4.next().charAt(0);

int chetvertiyvvod = tretiyvvod + bykva4;

switch (bykva4) {
case 'a': System.out.println(chetvertiyvvod); break;
case 'b': System.out.println(chetvertiyvvod); break;
case 'c': System.out.println(chetvertiyvvod); break;
case 'd': System.out.println(chetvertiyvvod); break;
case 'e': System.out.println(chetvertiyvvod); break;
case 'f': System.out.println(chetvertiyvvod); break;
case 'g': System.out.println(chetvertiyvvod); break;
case 'h': System.out.println(chetvertiyvvod); break;
case 'i': System.out.println(chetvertiyvvod); break;
case 'j': System.out.println(chetvertiyvvod); break;
case 'k': System.out.println(chetvertiyvvod); break;
case 'l': System.out.println(chetvertiyvvod); break;
case 'm': System.out.println(chetvertiyvvod); break;
case 'n': System.out.println(chetvertiyvvod); break;
case 'o': System.out.println(chetvertiyvvod); break;
case 'p': System.out.println(chetvertiyvvod); break;
case 'q': System.out.println(chetvertiyvvod); break;
case 'r': System.out.println(chetvertiyvvod); break;
case 's': System.out.println(chetvertiyvvod); break;
case 't': System.out.println(chetvertiyvvod); break;
case 'u': System.out.println(chetvertiyvvod); break;
case 'v': System.out.println(chetvertiyvvod); break;
case 'w': System.out.println(chetvertiyvvod); break;
case 'x': System.out.println(chetvertiyvvod); break;
case 'y': System.out.println(chetvertiyvvod); break;
case 'z': System.out.println(chetvertiyvvod); break;
}

// Цикл для шифрования четвертой буквы
System.out.println("Введите букву 5");

Scanner scan5 = new Scanner(System.in);
char bykva5 = scan5.next().charAt(0);

int pjatoyyvvod = chetvertiyvvod + bykva5;

switch (bykva5) {
case 'a': System.out.println(pjatoyyvvod); break;
case 'b': System.out.println(pjatoyyvvod); break;
case 'c': System.out.println(pjatoyyvvod); break;
case 'd': System.out.println(pjatoyyvvod); break;
case 'e': System.out.println(pjatoyyvvod); break;
case 'f': System.out.println(pjatoyyvvod); break;
case 'g': System.out.println(pjatoyyvvod); break;
case 'h': System.out.println(pjatoyyvvod); break;
case 'i': System.out.println(pjatoyyvvod); break;
case 'j': System.out.println(pjatoyyvvod); break;
case 'k': System.out.println(pjatoyyvvod); break;
case 'l': System.out.println(pjatoyyvvod); break;
case 'm': System.out.println(pjatoyyvvod); break;
case 'n': System.out.println(pjatoyyvvod); break;
case 'o': System.out.println(pjatoyyvvod); break;
case 'p': System.out.println(pjatoyyvvod); break;
case 'q': System.out.println(pjatoyyvvod); break;
case 'r': System.out.println(pjatoyyvvod); break;
case 's': System.out.println(pjatoyyvvod); break;
case 't': System.out.println(pjatoyyvvod); break;
case 'u': System.out.println(pjatoyyvvod); break;
case 'v': System.out.println(pjatoyyvvod); break;
case 'w': System.out.println(pjatoyyvvod); break;
case 'x': System.out.println(pjatoyyvvod); break;
case 'y': System.out.println(pjatoyyvvod); break;
case 'z': System.out.println(pjatoyyvvod); break;
}

System.out.println("Ваш код: " + perviyvvod + "," + vtoroyvvod + "," + tretiyvvod + "," + chetvertiyvvod + "," + pjatoyyvvod);
}} Дешифрування: Дешифрування в мові програмування Java виконується таким чином: спочатку написаний код виводить повідомлення на єкран з проханням ввести ключ i відкривається поле для його введення. Схожий код написаний i для введення зашифрованого повідомлення, яке потрібно розшифрувати. Після цього виконується цикл, який по формулі код букви повідомлення – код попередньої букви повідомлення (якщо така є) – ключ(для першого символу повідомлення) дешифрує повідомлення. В результаті отримуємо розшифровний текст.
import java.util.*;
public class Deshifrovanie extends Shifrovanie {
public static void main(String arg[]) {
// Вводим ключ
System.out.println("Введите ключ");
Scanner pervoe = new Scanner(System.in);
int kluch = pervoe.nextInt();
// Вводим первую цифру и переводим в цифру для дешифрования
System.out.println("Введите цифру 1");
Scanner scan1 = new Scanner(System.in);
int zifra1 = scan1.nextInt();
int perviyvvod1 = zifra1-kluch;
System.out.println(perviyvvod1);
// Вводим вторую цифру и переводим в цифру для дешифрования
System.out.println("Введите цифру 2");
Scanner scan2 = new Scanner(System.in);
int zifra2 = scan2.nextInt();
int vtoroyvvod2 = zifra2 - perviyvvod1;
System.out.println(vtoroyvvod2);
// Вводим вторую цифру и переводим в цифру для дешифрования
System.out.println("Введите цифру 3");
Scanner scan3 = new Scanner(System.in);
int zifra3 = scan3.nextInt();
int tretiyvvod3 = zifra3 - zifra2;
System.out.println(tretiyvvod3);
// Вводим вторую цифру и переводим в цифру для дешифрования
System.out.println("Введите цифру 4");
Scanner scan4 = new Scanner(System.in);
int zifra4 = scan4.nextInt();
int chetvertyiyvvod4 = zifra4 - zifra3;
System.out.println(chetvertyiyvvod4);
// Вводим вторую цифру и переводим в цифру для дешифрования
System.out.println("Введите цифру 5");
Scanner scan5 = new Scanner(System.in);
int zifra5 = scan4.nextInt();
int pjatiyvvod5 = zifra5 - zifra4;
System.out.println(pjatiyvvod5);
// Цикл для дешифрования кода
System.out.println("Зашифрованное сообщение: ");
if (perviyvvod1==98){System.out.println("a");}
else if (perviyvvod1==99){System.out.println("b");}
else if (perviyvvod1==100){System.out.println("c");}
else if (perviyvvod1==101){System.out.println("d");}
else if (perviyvvod1==102){System.out.println("e");}
else if (perviyvvod1==103){System.out.println("f");}
else if (perviyvvod1==104){System.out.println("g");}
else if (perviyvvod1==105){System.out.println("h");}
else if (perviyvvod1==106){System.out.println("j");}
else if (perviyvvod1==107){System.out.println("k");}
else if (perviyvvod1==108){System.out.println("l");}
else if (perviyvvod1==109){System.out.println("m");}
else if (perviyvvod1==110){System.out.println("n");}
else if (perviyvvod1==111){System.out.println("o");}
else if (perviyvvod1==112){System.out.println("p");}
else if (perviyvvod1==113){System.out.println("q");}
else if (perviyvvod1==114){System.out.println("r");}
else if (perviyvvod1==115){System.out.println("s");}
else if (perviyvvod1==116){System.out.println("t");}
else if (perviyvvod1==117){System.out.println("u");}
else if (perviyvvod1==118){System.out.println("v");}
else if (perviyvvod1==119){System.out.println("w");}
else if (perviyvvod1==120){System.out.println("x");}
else if (perviyvvod1==121){System.out.println("v");}
else if (perviyvvod1==122){System.out.println("z");}
if (vtoroyvvod2==99){System.out.println("a");}
else if (vtoroyvvod2==100){System.out.println("b");}
else if (vtoroyvvod2==101){System.out.println("c");}
else if (vtoroyvvod2==102){System.out.println("d");}
else if (vtoroyvvod2==103){System.out.println("e");}
else if (vtoroyvvod2==104){System.out.println("f");}
else if (vtoroyvvod2==105){System.out.println("g");}
else if (vtoroyvvod2==106){System.out.println("h");}
else if (vtoroyvvod2==107){System.out.println("j");}
else if (vtoroyvvod2==108){System.out.println("k");}
else if (vtoroyvvod2==109){System.out.println("l");}
else if (vtoroyvvod2==110){System.out.println("m");}
else if (vtoroyvvod2==111){System.out.println("n");}
else if (vtoroyvvod2==112){System.out.println("o");}
else if (vtoroyvvod2==113){System.out.println("p");}
else if (vtoroyvvod2==114){System.out.println("q");}
else if (vtoroyvvod2==115){System.out.println("r");}
else if (vtoroyvvod2==116){System.out.println("s");}
else if (vtoroyvvod2==117){System.out.println("t");}
else if (vtoroyvvod2==118){System.out.println("u");}
else if (vtoroyvvod2==119){System.out.println("v");}
else if (vtoroyvvod2==120){System.out.println("w");}
else if (vtoroyvvod2==121){System.out.println("x");}
else if (vtoroyvvod2==122){System.out.println("v");}
else if (vtoroyvvod2==123){System.out.println("z");
if (tretiyvvod3==98){System.out.println("a");}
else if (tretiyvvod3==99){System.out.println("b");}
else if (tretiyvvod3==100){System.out.println("c");}
else if (tretiyvvod3==101){System.out.println("d");}
else if (tretiyvvod3==102){System.out.println("e");}
else if (tretiyvvod3==103){System.out.println("f");}
else if (tretiyvvod3==104){System.out.println("g");}
else if (tretiyvvod3==105){System.out.println("h");}
else if (tretiyvvod3==106){System.out.println("j");}
else if (tretiyvvod3==107){System.out.println("k");}
else if (tretiyvvod3==108){System.out.println("l");}
else if (tretiyvvod3==109){System.out.println("m");}
else if (tretiyvvod3==110){System.out.println("n");}
else if (tretiyvvod3==111){System.out.println("o");}
else if (tretiyvvod3==112){System.out.println("p");}
else if (tretiyvvod3==113){System.out.println("q");}
else if (tretiyvvod3==114){System.out.println("r");}
else if (tretiyvvod3==115){System.out.println("s");}
else if (tretiyvvod3==116){System.out.println("t");}
else if (tretiyvvod3==117){System.out.println("u");}
else if (tretiyvvod3==118){System.out.println("v");}
else if (tretiyvvod3==119){System.out.println("w");}
else if (tretiyvvod3==120){System.out.println("x");}
else if (tretiyvvod3==121){System.out.println("v");}
else if (tretiyvvod3==122){System.out.println("z");}
if (chetvertyiyvvod4==97){System.out.println("a");}
else if (chetvertyiyvvod4==98){System.out.println("b");}
else if (chetvertyiyvvod4==99){System.out.println("c");}
else if (chetvertyiyvvod4==100){System.out.println("d");}
else if (chetvertyiyvvod4==101){System.out.println("e");}
else if (chetvertyiyvvod4==102){System.out.println("f");}
else if (chetvertyiyvvod4==103){System.out.println("g");}
else if (chetvertyiyvvod4==104){System.out.println("h");}
else if (chetvertyiyvvod4==105){System.out.println("j");}
else if (chetvertyiyvvod4==106){System.out.println("k");}
else if (chetvertyiyvvod4==107){System.out.println("l");}
else if (chetvertyiyvvod4==108){System.out.println("m");}
else if (chetvertyiyvvod4==109){System.out.println("n");}
else if (chetvertyiyvvod4==110){System.out.println("o");}
else if (chetvertyiyvvod4==111){System.out.println("p");}
else if (chetvertyiyvvod4==112){System.out.println("q");}
else if (chetvertyiyvvod4==113){System.out.println("r");}
else if (chetvertyiyvvod4==114){System.out.println("s");}
else if (chetvertyiyvvod4==115){System.out.println("t");}
else if (chetvertyiyvvod4==116){System.out.println("u");}
else if (chetvertyiyvvod4==117){System.out.println("v");}
else if (chetvertyiyvvod4==118){System.out.println("w");}
else if (chetvertyiyvvod4==119){System.out.println("x");}
else if (chetvertyiyvvod4==120){System.out.println("v");}
else if (chetvertyiyvvod4==121){System.out.println("z");}
if (pjatiyvvod5==97){System.out.println("a");}
else if (pjatiyvvod5==98){System.out.println("b");}
else if (pjatiyvvod5==99){System.out.println("c");}
else if (pjatiyvvod5==100){System.out.println("d");}
else if (pjatiyvvod5==101){System.out.println("e");}
else if (pjatiyvvod5==102){System.out.println("f");}
else if (pjatiyvvod5==103){System.out.println("g");}
else if (pjatiyvvod5==104){System.out.println("h");}
else if (pjatiyvvod5==105){System.out.println("j");}
else if (pjatiyvvod5==106){System.out.println("k");}
else if (pjatiyvvod5==107){System.out.println("l");}
else if (pjatiyvvod5==108){System.out.println("m");}
else if (pjatiyvvod5==109){System.out.println("n");}
else if (pjatiyvvod5==110){System.out.println("o");}
else if (pjatiyvvod5==111){System.out.println("p");}
else if (pjatiyvvod5==112){System.out.println("q");}
else if (pjatiyvvod5==113){System.out.println("r");}
else if (pjatiyvvod5==114){System.out.println("s");}
else if (pjatiyvvod5==115){System.out.println("t");}
else if (pjatiyvvod5==116){System.out.println("u");}
else if (pjatiyvvod5==117){System.out.println("v");}
else if (pjatiyvvod5==118){System.out.println("w");}
else if (pjatiyvvod5==119){System.out.println("x");}
else if (pjatiyvvod5==120){System.out.println("v");}
else if (pjatiyvvod5==121){System.out.println("z");}
}} Ця програма для шифрування даних має свої плюси i мінуси. З основних плюсів цього виду шифрування можна виділити надійність, так як такий шифр зламати можливо тільки грубою силою (методом підбору). Також, важливою перевагою над іншими криптографічними системами є його дешевизна. Треба згадати i про те, що життєвий цикл такого шифрування буде надзвичайно довгим, адже його дуже легко покращити, наприклад, ускладнити формулу для обробки повідомлення, ввевши в неї статичну змінну, на яку буде множитися число, знайдене в результаті обчислення по попередній формулі. Основним мінусом такої криптографічної системи є нездатність обробляти виликі файли, які потрібно зашифрувати. Адже кожний наступний елемент буде займати в пам’яті більше місця ніж попередній. A отже, операцію шифрування можна виконувати тільки з невеликими за об’ємами файлами. Рис. 3.1. Результат роботи шифрування (класу «Shifrovanie») Рисунок 3.2. Результат роботи дешифрування (класу «Deshifrovanie») За методикою оцінки ефективності криптографічної системи даний тип шифрування отримав оцінку 7 i рекомендований для застосування. 1 – простота використання (оцінка - 2):Використовуючи даний тип шифрування, проблеми можуть виникнути лише y програми, яка кодує дані, якщо інформації дуже багато. Для користувача важливо лише знати секретний ключ i ніяких складнощів y нього не виникне. 2 – швидкість шифрування інформації (оцінка – 0):Ця криптографічна система працює швидко лише з малими об’ємами інформації. Якщо ж даних занадто багато – це суттєво уповільнить роботу системи. 3 – Стійкість алгоритму до зовнішніх атак (оцінка - 1):
Прорахувати алгоритм кодування даних майже неможливо, тому такий алгоритм можна зламати лише методом грубої сили (метод підбору). 4 – Ціна (оцінка - 2):Ціна на такий вид шифрування зовсім не висока, тому використовувати його дуже вигідно. 5 – Кількість використаних математичних операцій (оцінка - 1):
В алгоритмі використано лише 2 математичні операції – зсув по алфавіту на кількість букв рівну секретному ключу i шифрування наступної одиниці інформації попередньою. 6 – Перспективність алгоритму (оцінка - 1):
Оскільки алгоритм легко покращити ускладнивши формулу по якій відбувається шифрування елементів даних, такий тип шифрування є дуже перспективним в найближчі 5 років. Висновки до ІІІ розділуВинайдений новий тип шифрування на мікропроцесорах було виконано на об’єктно орієнтованій мові програмування Java. Суть цієї криптографічної системи полягає в тому, що кожний наступний елемент, який потрібно зашифрувати, шифрується попереднім. Ця програма для шифрування даних має свої плюси i мінуси. З основних плюсів цього виду шифрування можна виділити надійність, так як такий шифр зламати можливо тільки грубою силою (методом підбору). Також, важливою перевагою над іншими криптографічними системами є його дешевизна. Треба згадати i про те, що життєвий цикл такого шифрування буде надзвичайно довгим, адже його дуже легко покращити, наприклад, ускладнити формулу для обробки повідомлення, ввевши в неї статичну змінну, на яку буде множитися число, знайдене в результаті обчислення по попередній формулі.Основним же мінусом такої криптографічної системи є її нездатність обробляти виликі файли, які потрібно зашифрувати. Адже кожний наступний елемент буде займати в пам’яті більше місця ніж попередній. A отже, операцію шифрування можна виконувати тільки з невеликими за об’ємами файлами.

 

ВИСНОВКИ

На сьогоднішній день криптографія займає важливе місце в ІТ індустрії. В наш час існують дві найбільші проблеми, що пов’язані з захистом інформації. По-перше, немає дійсно якісного алгоритму шифрування з гарним співвідношенням ціни-якості: звичайно, що люди хочуть захистити інформацію якомога краще, але не завжди вистачає грошей для такого виду шифрування, тому прийнято рішення, що алгоритм захисту інформації має коштувати менше ніж сама інформація. З іншого боку, якщо взяти дуже дешевий тип шифрування (алгоритм Цезаря), а інформація буде надважливою для підприємства, чи держави, хакерам вистачить кілька днів, щоб зламати код і увійти в систему, використовуючи потрібну їм інформацію у своїх цілях.

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

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

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

Виведену нову систему шифрування, в даній роботі, буде вигідно використовувати для підприємств, які мають на меті захистити внутрішню інформацію. А різні секретні ключі для даного типу шифрування дадуть змогу захистити інформацію одним методом для різних відділів підприємства, що дуже вигідно. Даний тип шифрування дуже легкий у використанні, написаний на мові програмування Java, а отже підходить для використання на всіх персональних комп’ютерах, на яких встановлено ОС Windows i не тільки.

За методикою оцінки ефективності криптографічної системи, ефективність шифрування можна оцінити за наступними параметрами:

1. Простота використання

2. Швидкість шифрування інформації

3. Стійкість алгоритму до зовнішніх атак

4. Ціна

5. Кількість використаних математичних операцій

6. Перспективність алгоритму

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

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

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

2. Швидкість кодування інформації: сучасні алгоритми шифрують інформацію за секунди, а отже великої різниці між криптографічними системами не буде. Набагато важливіше питання – чи залежить час шифрування від кількості даних і наскільки? Ставимо 2, якщо залежності немає, 1 \ 0 якщо залежність є, але алгоритм шифрує швидко \ повільно і 0, якщо алгоритм працює з обмеженою кількістю даних.

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

4. Ціна: цей параметр досить відносний. Якщо шифр коштує більше, або стільки ж, скільки і інформація ставимо 0, якщо ціна шифру в півтора рази нижча ціни інформації ставимо 1, якщо ціна шифру менша за ціну інформації в 2 рази і більше, то ставимо 2.

5. Кількість використаних математичних операцій: якщо використана лише одна математична операція – такий алгоритм легко зламати, тому ставимо 0; при багатьох математичних операціях в криптографічній системі ставимо 1; якщо ж відслідкувати кількість операцій в алгоритмі неможливо ставимо 2.

6. Перспективність алгоритму: в цьому параметрі все залежить від давності створення алгоритму (який, звичайно, є загальноприйнятим), чим давніше була створена криптографічна система, тим більше методів винайдено для зламу, а отже система не є перспективною. Якщо алгоритм був створений не більше 5 років тому, ставимо 2; від 5 до 10 років існування алгоритму – ставимо 1; більше 10 років на ринку - ставимо 0. Також цей пункт відповідає поняттю життєвого цикла проекту (життєвий цикл проекту — це період часу від задуму проекту до його закінчення). Чим довше криптографічна система протримається на ринку, тим буде вища поставлена оцінка.

Після вибору замовником найголовнішого параметру, він має викреслити один з шести параметрів, який має найнижчу оцінку і не враховувати його в оцінці ефективності криптографічної системи. Після цього, оцінити алгоритм по п’яти параметрам і додати між собою цифри, які було отримано. В результаті отримаємо цифру від 0 до 10. Все що вище за 6 – рекомендовано для закупівлі. (Цей метод оцінки ефективності криптографічної системи було застосовано на таких алгоритмах, як «шифр Віженера» - 4, «шифр Вернама» - 5, а також «алгоритм Деффі-Хеллмана» - 7 і отримано правильні, на мій погляд, оцінки).

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

Алгоритм складається з двох частин: 1 – шифрування даних, 2 – розшифрування інформації за допомогою секретного ключа. Для цього використано стандартне кодування символів в Windows Аски (ASCII). Задано текст, який потрібно зашифрувати «pasha». Потрібно звернути увагу, що зап’ятих, точок, пробілів в тексті немає і вони ніяк не відображаються у шифрі, а кожна буква записана окремо. Було обрано секретний ключ, який знаємо лише ми і людина, яка отримає повідомлення, a саме 2.

В такому випадку, перший символ буде зсунуто на дві букви вперед, наприклад, якщо нашій букві «p» відповідала цифра 112, то тепер їй відповідає цифра 114, a кожний наступний елемент повідомлення буде зсунуто на цифру попереднього елементу, наприклад, наступному елементу в повідомленні є буква «а», яка відповідає цифрі 97, тож наша буква «а» буде зашифрована цифрою 211 (97+114) i так далі.

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

Алгоритм дуже простий у використанні, виконує симетричне шифрування, а тому за першим параметром отримує оцінку 2.

Швидкість кодування повністю залежить від кількості інформації тому оцінка - 0.

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

Ціна такого кодування буде завжди нижчою за інформацію, а отже ставимо оцінку 2.

В алгоритмі використано 3 математичні операції (заміна букви цифрою, підстановка секретного ключа i зсув кожного елементу даних починаючи з другого на цифру, що відповідає попередньому елементу), тому ставимо оцінку 1 по п’ятому параметру.

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

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

Основним мінусом такої криптографічної системи є нездатність обробляти виликі файли, які потрібно зашифрувати. Адже кожний наступний елемент буде займати в пам’яті більше місця ніж попередній. A отже, операцію шифрування можна виконувати тільки з невеликими за об’ємами файлами.