Відокремлений підрозділ – Коледж Галицького інституту імені В’ячеслава Чорновола відділення комп’ютерних технологій Циклова комісія інформатики та комп’ютерної технологій спеціальності5.010101 "Обслуговування програмних систем та комплексів " КУРСОВА РОБОТА з дисципліни «Алгоритмізація і програмування» на тему: «Розробка системи захисту текстових
повідомлень» Виконав: студент групи К-28 Оплаканець Михайло Богданович Керівник роботи: Мигаль О. Б. Оцінка: Тернопіль 2010 ЗМІСТ ВСТУП 1 ПОСТАНОВКА ЗАВДАННЯ 2 ОПИС ПРОГРАМИ 2.1 Структура програми 2.2 Схема послідовності роботи з програмою 2.3 Опис інтерфейсу користувача 3 Тестування та від лагодження програмного коду 18
ВИСНОВКИ 21 СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ 23 Додатки 24 Додаток А Схема алгоритму дешифрування 24 Додаток Б Код програмного додатку 25 ВСТУП На сьогоднішній день досить актуальною є проблема безпеки інформації. Поняття "Безпека" охоплює широке коло інтересів як окремих осіб, так і цілих держав. У наш мобільний час важливе місце відводиться проблемі
інформаційної безпеки, забезпечення захисту конфіденційної інформації від ознайомлення з нею конкорюючих груп. Про важливість збереження інформації в таємниці знали вже в стародавні часи, коли з появою писемності з'явилася і небезпека прочитання її небажаними особами. Для захисту інформації на рівні прикладного та системного
ПЗ використовуються: системи розмежування доступу до інформації; системи ідентифікації та автентифікації; системи аудиту та моніторингу; системи антивірусного захисту. Основним методом шифрування інформації – є криптографічний. Криптографічний захист інформації — вид захисту інформації, що реалізується за допомогою перетворень інформації з використанням спеціальних даних (ключових даних) з метою приховування (або відновлення)
змісту інформації, підтвердження її справжності, цілісноті, авторства тощо. Темою курсової роботи – є розробити систему захисту текстових повідомлень. Метою роботи є забезпечити зручне та швидке шифрування текстових повідомлень з використанням елементів безпеки та можливість розшифрування за певним фактором. Завданням є написати програму, яка б містила: 1) шифрування / дешифрування файлів 2) шифрування / дешифрування
тексту прямо в рядку 3) коротку інструкцію для користувача 4) мала б практичну експлуатацію 1 ПОСТАНОВКА ЗАВДАННЯ Основне поняття криптографії - шифр (від арабського "цифра"; араби першими стали замінювати літери на цифри з метою захисту вихідного тексту). Секретний елемент шифру, недоступний стороннім, називається ключем шифру. Як правило, в стародавні часи використовувалися так звані шифри заміни та шифри перестановки.
Історичним прикладом шифру заміни є шифр Цезаря (1 століття до н.е.), описаний істориком Стародавнього Риму Светонія. лій Цезар використав у своєму листуванні шифр власного винаходу. Стосовно до правил сучасної української мови він полягав у наступному. Виписувався алфавіт: А, Б, В, Г, Д, Е ; потім під ним виписувався той же алфавіт, але зі зрушенням на 3 літери ліворуч. Таким чином, можна стверджувати, що основи криптології були закладені ще в давнину
і, природно, після багатовікового розвитку знайшли широке застосування в сучасному житті. Протягом всієї своєї багатовікової історії, аж до зовсім недавнього часу, це мистецтво криптології небагатьом, в основному верхівці суспільства, не виходячи за межі резиденцій глав держав, посольств і - звичайно ж - розвідувальних місій. І лише кілька десятиліть тому все змінилося докорінно - інформація набула самостійну комерційну цінність і стала широко поширеним, майже звичайним товаром.
Її виробляють, зберігають, транспортують, продають і купують, а значить - крадуть і підроблюють - і, отже, її необхідно захищати. Сучасне суспільство все більше стає інформаційно-обумовленим, успіх будь-якого виду діяльності все сильніше залежить від володіння певними відомостями і від відсутності їх у конкурентів. І чим сильніше проявляється зазначений ефект, тим більше
потенційні збитки від зловживань в інформаційній сфері, і тим більше потреба в захисті інформації. Серед усього спектру методів захисту даних від небажаного доступу особливе місце займають криптографічні методи. На відміну від інших методів, вони спираються лише на властивості самої інформації і не використовують властивості її матеріальних носіїв, особливості вузлів
її обробки, передачі та зберігання. Звичайно, під криптографічним захистом в першу чергу мається на увазі шифрування даних. Раніше ця операція виконувалося людиною вручну або з використанням різних пристосувань. Тому розвиток криптології стримувався проблемою реалізації шифру. Чому ж проблема використання криптографічних методів у інформаційних системах (ІС) стала зараз особливо актуальна?
З одного боку, розширилося використання комп'ютерних мереж, зокрема глобальної мережі Інтеpнет, по яких передаються великі обсяги інформації державного, військового, комерційного і приватного характеру, не допускає можливість доступу до неї сторонніх осіб. З іншого боку, поява нових потужних комп'ютерів, технологій мережевих і нейронних обчислень зробило можливим дискредитацію криптографічних систем ще недавно вважалися практично
не розкривається. Метою програми є можливість шифрування та дешифрування текстових файлів, так, щоб зашифрований файл могла розшифрувати лише та людина, котрій він призначений. Було ознайомленося із методами шифрування тексту та вибрано шифр XOR оскільки він повністю підходить під критерії. Програма використовує шифрування відносно ключа, який пропонується ввести користувачу під час процесу шифрування/дешифрування, який має він запам’ятати.
Завдяки цьому іншим користувачам, окрім тих, кому це назначалося розшифрувати файл не вдасться. Основні функції програми:  шифрування файлів,  дешифрування файлів,  шифрування тексту прямо в рядку,  дешифрування тексту в рядку. Програма повинна відповідати таким вимогам:  простота роботи,  швидкодія,  зрозумілий інтерфейс користувача.  не великі розміри.
2 ОПИС ПРОГРАМИ 2.1 Структура програми Програма написана в структурному стилі програмування (рис. 2.1). У підпрограмі кодування / декодування файлів виконюються паралельно дві дії. Вхідними даними є шлях файлу для кодування, шлях для файлу з результатом та секретний ключ користувача. Вихідні дані: файл з результатом (рис. 2.1). Лістинг 2.1 підпрограма кодування / декодування файлів int code_file(char *in_path, char *out_path, char *key) {
FILE *in, *out; in = fopen(in_path, "r"); if (in == NULL) return 1; // файл не знайдено out = fopen(out_path, "w"); if (out == NULL) return 2; // не можу створити файл int key_len = strlen(key); char *key_str = new char[key_len]; int i = 0; key_str[i] = getc(in); i++; while (!feof(in)) { if (i == key_len) { _xor(key_str, key); for (i = 0; i < key_len; i++) putc(key_str[i], out); i = 0; } key_str[i] = getc(in);
i++; } if (i != 1) { int len = i - 1; for (i = 0; i < len; i++) putc(key_str[i] ^ key[i], out); } delete[] key_str; fclose(in); fclose(out); return 0; } У підпрограмі кодування / декодування текстів виконюються паралельно дві дії. Вхідними даними є текст для кодування чи текст для розкодування (в залежності від вибору користувача). Вихідні дані: стрічка із результатом. Лістинг: int code_text(char *in_text, char *out_text, char *key)
{ int key_len = strlen(key); char *key_str = new char[key_len]; int i = 0; key_str[i] = *in_text; in_text++; i++; while (*(in_text - 1) != ) { if (i == key_len) { _xor(key_str, key); for (i = 0; i < key_len; i++) { *out_text = key_str[i]; *out_text++; } i = 0; } key_str[i] = *in_text; in_text++; i++; } if (i != 1) { int len = i - 1; for (i = 0; i < len; i++) { *out_text = (key_str[i] ^ key[i]); out_text++; } } *out_text = ;
delete[] key_str; return 0; } Підпрограма шифрування / дешифрування – виконує безпосереднє кодування чи декодування (в залежності від звернення підпрограми) відносно ключа (рис. 2.2) Лістинг: void _xor(char *word, char *key) { int i, len = strlen(key); for (i = 0; i < len; i++) word[i] = word[i] ^ key[i]; } Підпрограма «Про програму» виводить на екран короткі відомості про програму. Лістинг: void about() { cout << "
Програма: Кодування/Декодування файлiв" << endl; cout << "Завдання: Виконує кодування та декодування файлiв за заданим ключем" << endl; cout << "Коледж Галицького iнституту iменi В. Чорновола. Група К-28. Оплаканець Михайло" << endl; cout << "http://werter.org.ua | werter.ua@gmail.com | Створено: 8/5/2010 | v. 0.1 beta" << endl; }
Підпрограма «Допомога» виводить на екран коротку допомогу користувачеві (рис. 2.3) 2.2 Схема послідовності роботи з програмою На рисунку зображена структурна схема програми (рис. 2.4) Рис. 2.4. Структурна схема програми Користувачу пропонується ввести відносний або абсолютний шлях файлу для кодування, шлях кінцевого файлу, в яких буде записано результат та секретний ключ для безпечного кодування і подальшої можливості розкодування. Кодування відбувається за алгоритмом
XOR: Ci = Pi XOR Kj, де Kj - j-та літера ключового слова представлена в кодуванні ASCII. Ключове слово повторюється поки не отримано гаму, рівну довжині повідомлення. 2.3 Опис інтерфейсу користувача Для запуску програми Shyfrator необхідно запустити програму Shyfrator.exe. При виклику програми у нас відобразиться меню: "1.
Закодувати файл" "2. Декодувати файл" "3. Закодувати текст" "4. Декодувати текст" "5. Про програму" "6. Допомога" "7. Вихід" Можна вибрати один з пунктів меню, в залежності від потрібності. При натисканні " 1" програма відобразить (рис.
2.5): "Введіть шлях файлу для кодування" // вказуємо ім’я файлу, який необхідно закодувати, можна вказувати просто назву файлу в корені або абсолютний шлях "Введіть шлях файлу де буде збережено результат" // вказуємо ім’я файлу, в який буде поміщено зашифрований результат першого файлу, можна вказувати просто назву файлу в корені або абсолютний шлях "Введіть та запам’ятайте секретний ключ" // вказуємо секретний
ключ, який буде необхідний для того, щоб в наступному декодувати файл У випадку успішного кодування буде відображено повідомлення «Кодування виконано успішно». При натисканні " 2" програма відобразить (рис. 2.6): "Введіть шлях файлу для декодування" // вказуємо ім’я файлу, який необхідно декодувати, можна вказувати просто назву файлу в корені або абсолютний шлях
"Введіть шлях файлу де буде збережено результат" // вказуємо ім’я файлу, в який буде поміщено розшифрований результат першого файлу, можна вказувати просто назву файлу в корені або абсолютний шлях "Введіть секретний ключ для декодування" // вказуємо секретний ключ, який ми використовували для кодування файлу раніше У випадку успішного декодування буде відображено повідомлення «Декодування виконано успішно».
При натисканні " 3" програма відобразить: "Введіть та запам’ятайте секретний ключ" // вказуємо секретний ключ, який буде необхідний для того, щоб в наступному декодувати текст "Введіть текст для кодування" // вводимо текст, який необхідно закодувати У випадку успішного кодування буде відображено повідомлення «Закодований текст», яке буде його містити. При натисканні " 4" програма відобразить: "
Введіть секретний ключ" // вказуємо секретний ключ "Введіть текст для декодування" // вводимо текст, який необхідно декодувати У випадку успішного кодування буде відображено повідомлення «Декодований текст», яке буде його містити. При натисканні " 5" програма відобразить: Програма: Кодування/Декодування файлiв Завдання: Виконує кодування та декодування файлiв за заданим
ключем Коледж Галицького iнституту iменi В. Чорновола. Група К-28. Оплаканець Михайло http://werter.org.ua | werter.ua@gmail.com | Створено: 8/5/2010 | v. 0.1 beta При натисканні " 6" буде відображено коротку допомогу користувачеві. При натисканні " 7" виконається вихід із програми.
3 Тестування та від лагодження програмного коду Відладка і тестування – найважливіші етапи життєвого циклу програм. Не можна зробити висновки про правильність виконання програми тільки на підставі того, що вона відкомпільована і видає хоч якийсь результат. Спробуємо «вручну» зашифрувати певний фрагмент тексту. Тестування проведемо згідно плану: 1) перевірка меню 2) робота з файлами 3) правильсть процесу шифрування,
розшифрування 1)Випробування будь-якої системи є найбільш відповідальний та пов’язаний з найбільшими труднощами і найбільшими втратами часу. Шифр XOR - алгоритм шифрування, який у якості ключа використовує ключове слово та може бути записаний формулою Ci = Pi XOR Kj. де Kj - j-та літера ключового слова представлена в кодуванні ASCII. Ключове слово повторюється поки не отримано гаму, рівну довжині повідомлення.
Відкритий текст: "алгоритм шифрування, який у якості ключа використовує ключове слово" Ключ: "qwertyqwertyqwertyqwertyqwertyqwer tyqwertyqwertyqwertyqwertyqwertyqwerty&q uot; Зашифрований текст: "‘њ†њ„‘ѓ›EЉњЌЃ„‡’™”Ћ[EЌћ‘*W–R‹“џ†—Б T“љ‰’’T›™ќ‹‚њ€ѓ™‡ЃОY›њ›…љ›”W”™љ›џ" Спробуємо добитися такого результату програмою (рис. 3.2). Результати виконання зроблені «вручну» та в програмі – збігаються.
Отже, програма працює коректно (рис 3.1). ВИСНОВКИ Результатом роботи є програма кодування / декодування файлів та рядків тексту, що працює на методі XOR-шифрування. Обгрунтований вибір тієї чи іншої системи шифрування повинен спиратися на певні критерії ефективності. Найбільш простий критерій такої ефективності - імовірність розкриття ключа або потужність множини ключів (М).
Для чисельної оцінки можна використовувати також і складність розкриття шифру шляхом перебору всіх ключів. Програма має ряд переваг: - неможливість розкриття або осмисленої модифікації інформації на основі аналізу її структури, - мінімальний об'єм використовуваної ключової інформації, - мінімальна складність реалізації (у кількості машинних операцій), - висока оперативність. Недоліком програми є консольна робота, адже в консольному режимі не зручно копіювати та вставляти текст.
У перспективі розглядається розробка програми у об’єктно-орієнтовному середивощі, задля зручного графічного інтерфейсу користувача, та, можливо, розповсюдження програми в мережі інтернет за ліцензією GPL. СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ 1. Апатенок Р.Ф. Елементи лінійної алгебри та аналітичної геометрії. Мінськ: Вища школа, 1977 - 257 с. 2. Глушаков С.В. та
ін Мова програмування С + +. -Харків: Фоліо, 2002 500с. 3. ГОСТ 19.701-90. ЕСПД. Схеми алгоритмів, програм, даних і систем. Умовніипаи позначення і правила виконання М.: 1991. 4. Дейтел х.м. Дейтел П.Дж. Як програмувати на С + +: Пер. з англ М.: ЗАТ "Видавництво ,БИНОМ2000-1024 с.:
Іл. 5. Страуструп Б. Мова програмування С + +. Частина 1 Київ: "ДіаСофт", 1993 264 с. 6. Страуструп Б. Мова програмування С + +. Частина 2 Київ: "ДіаСофт",1993 296С 7. Холзнер С. VISUAL C + +6: навчальний курс - СПб: Видавництво "Пітер", 2000. -576 С.
Додатки Додаток А Схема алгоритму дешифрування Додаток Б Код програмного додатку /* Programming by Oplakanets Mykhaylo aka Werter http://werter.org.ua | werter.ua@gmail.com */ #include <conio.h> #include <windows.h> #include <iostream> using namespace std; // прототипи функцій int code_file(char *in_path, char *out_path, char *key); int code_text(char *in_text, char *out_text, char *key); void
_xor(char *word, char *key); void about(); void help(); int main() { setlocale (0, ""); // підключення кирилиці // заставка cout << " " << endl; cout << " " << "Кодування/Декодування файлiв" << endl; cout << " " << "Виконує кодування та декодування файлiв за заданим ключем" << endl; Sleep(5000); // затримка екрану system("cls"); // очистка екрану for (;;) { // вічний цикл
для меню cout << " Меню" << endl; cout << " 1. Закодувати файл" << endl; cout << " 2. Декодувати файл" << endl; cout << " 3. Закодувати текст" << endl; cout << " 4. Декодувати текст" << endl; cout << "
5. Про програму" << endl; cout << " 6. Допомога" << endl; cout << " 7. Вихiд" << endl; char c = _getch(); // перемикач відносно введення switch (c) { int err; char in[100], out[100], key[100]; char in_text[256]; char out_text[256]; case '1': // кодує файл system("cls"); cout << "Введiть шлях файлу для кодування" << endl; cin >> in;
cout << "Введiть шлях файлу де буде збережено результат" << endl; cin >> out; cout << "Введiть та запам'ятайте секретний ключ (буде необдiдний для декодування)" << endl; cin >> key; err = code_file(in, out, key); // виклик функції if (err == 0) cout << "Кодування виконано успішно" << endl; else if (err == 1) cout << "Файл не знайдено" << endl; else cout << "
Не можу створити файл з результатом" << endl; _getch(); system("cls"); break; case '2': // Декодування файлу system("cls"); cout << "Введiть шлях файлу для декодування" << endl; cin >> in; cout << "Введiть шлях файлу де буде збережено результат" << endl; cin >> out; cout <<
"Введiть секретний ключ для декодування" << endl; cin >> key; err = code_file(in, out, key); // виклик функції if (err == 0) cout << "Декодування виконано успішно" << endl; else if (err == 1) cout << "Файл не знайдено" << endl; else cout << "Не можу створити файл з результатом" << endl;
_getch(); system("cls"); break; case '3': // кодує текст system("cls"); cout << "Введiть та запам'ятайте секретний ключ (буде необдiдний для декодування)" << endl; cin >> key; cin.get(); cout << "Введіть текст для кодування" << endl; cin.getline(in_text, 255); code_text(in_text, out_text, key); cout << "Закодований текст:" << endl; cout << out_text << endl;
_getch(); system("cls"); break; case '4': // декодує текст system("cls"); cout << "Введiть секретний ключ" << endl; cin >> key; cin.get(); cout << "Введіть текст для декодування" << endl; cin.getline(in_text, 255); code_text(in_text, out_text, key); cout << "Розкодований текст:" << endl; cout << out_text << endl;
_getch(); system("cls"); break; case '5': // Про програму system("cls"); about(); // виклик функції cout << endl << "Натиснiть будь-яку клавiшу " << endl; _getch(); system("cls"); break; case '6': // Help system("cls"); help(); cout << endl << "Натиснiть будь-яку клавiшу " << endl; _getch(); system("cls"); break; case '7':
// Exit return 0; default: system("cls"); } } return 0; } int code_file(char *in_path, char *out_path, char *key) { FILE *in, *out; in = fopen(in_path, "r"); if (in == NULL) return 1; // файл не знайдено out = fopen(out_path, "w"); if (out == NULL) return 2; // не можу створити файл int key_len = strlen(key); char *key_str = new char[key_len]; int i = 0; key_str[i] = getc(in); i++; while (!feof(in)) { if (i == key_len) {
_xor(key_str, key); for (i = 0; i < key_len; i++) putc(key_str[i], out); i = 0; } key_str[i] = getc(in); i++; } if (i != 1) { int len = i - 1; for (i = 0; i < len; i++) putc(key_str[i] ^ key[i], out); } delete[] key_str; fclose(in); fclose(out); return 0; } int code_text(char *in_text, char *out_text, char *key) { int key_len = strlen(key); char *key_str = new char[key_len]; int i = 0; key_str[i] = *in_text; in_text++; i++; while (*(in_text - 1) != ) { if (i == key_len) {
_xor(key_str, key); for (i = 0; i < key_len; i++) { *out_text = key_str[i]; *out_text++; } i = 0; } key_str[i] = *in_text; in_text++; i++; } if (i != 1) { int len = i - 1; for (i = 0; i < len; i++) { *out_text = (key_str[i] ^ key[i]); out_text++; } } *out_text = ; delete[] key_str; return 0; } void about() { cout << "Програма: Кодування/Декодування файлiв" << endl; cout << "
Завдання: Виконує кодування та декодування файлiв за заданим ключем" << endl; cout << "Коледж Галицького iнституту iменi В. Чорновола. Група К-28. Оплаканець Михайло" << endl; cout << "http://werter.org.ua | werter.ua@gmail.com | Створено: 8/5/2010 | v. 0.1 beta" << endl; } void help() { FILE *hp; char line[100]; hp = fopen("help.txt", "r"); if (hp ==
NULL) { cout << "Файл з iнструкцiями не знайдено" << endl; return; } while (!feof(hp)) cout << fgets(line, 100, hp); } void _xor(char *word, char *key) { int i, len = strlen(key); for (i = 0; i < len; i++) word[i] = word[i] ^ key[i]; }