Professional Documents
Culture Documents
Савченко ТР-з01 Курсова
Савченко ТР-з01 Курсова
Теплоенергетичний факультет
Кафедра АПЕПС
КУРСОВА РОБОТА
з дисципліни «Алгоритмізація та програмування – 2: Процедурне
програмування»
На тему:
«Програмна система для шифрування даних методом Хілла»
Київ - 2021
Анотація
Anotation
2
Київський політехнічний інститут імені Ігоря Сікорського
Теплоенергетичний факультет
ЗАТВЕРДЖУЮ
В.о. зав. кафедри АПЕПС
ЗАВДАННЯ
на курсову роботу студента
1. Тема роботи:
Програмна система для шифрування даних методом Хілла.
КАЛЕНДАРНИЙ ПЛАН
Студент: ____________
(підпис)
ЗМІСТ
ВСТУП.........................................................................................................................6
Шифрування та їх види...........................................................................................6
1.3 Криптостійкість.............................................................................................13
2.2 Бібліотеки..........................................................................................................16
2.3 Функції..............................................................................................................17
Висновки...................................................................................................................22
Додаток А..................................................................................................................24
5
6
ВСТУП
Шифрування та їх види
Шифрування - алгоритмічне (криптографічне) перетворення даних, яке
виконується у посимвольній послідовності з метою одержання шифрованого
тексту[1].
Існує два види шифрувань: симетричне та асиметричне шифрування.
Симетричне шифрування
В симетричному шифруванні один і той самий ключ (що зберігається в
секреті) використовується як для шифрування, так і для розшифрування.
Розроблено ефективні (швидкі й надійні) методи шифрування.
Переваги:
7
1) Шифри із симетричним ключем спроектовані так, щоб мати велику
пропускну здатність.
2) Ключі для шифрів із симетричним ключем відносно короткі.
3) Шифри із симетричним ключем можна використати як примітиви для
побудови різних криптографічних механізмів включно з
псевдовипадковими генераторами чисел, геш-функціями,
обчислювально-ефективних схем підпису.
4) Шифри із симетричним ключем можна комбінувати для отримання
сильніших шифрів.
Недоліки:
1) При зв'язку між двома особами, ключ потрібно тримати в секреті на
обох кінцях.
2) У великій мережі потрібно опікуватись багатьма ключами.
3) У зв'язку між двома особами криптографічна практика вимагає частої
зміни ключів.
Асиметричне шифрування
Проблемою симетричного шифрування є необхідність передачі ключа, для
розшифрування інформації, таким чином ключ може бути перехоплений
кимось іншим.
Будь хто, знаючи секретний ключ, може розшифрувати інформацію. Тоді
як в асиметричному шифруванні є два пов'язаних ключа — пара ключів.
Відкритий ключ (англ. public key) — публічний, до нього повинні мати доступ
всі ті, хто матиме потребу зашифрувати інформацію. Тоді як закритий ключ —
приватний ключ (англ. private key), повинен бути доступним лише тому хто має
право розшифрувати інформацію, за своїм розміром він значно більший від
секретного ключа симетричного шифрування[2].
Будь-яку інформацію, зашифровану за допомогою відкритого ключа
можна розшифрувати лише застосовуючи той самий алгоритм, але з
використанням відповідного приватного ключа. Також всю інформацію,
8
зашифровану за допомогою приватного ключа, можна розшифрувати лише за
допомогою відповідного відкритого ключа. Це означає, що немає необхідності
хвилюватись за передачу ключа, відкритий ключ повинен бути публічним. Але
асиметричне шифрування є значно повільнішим від симетричного. Також
потребує значно більше обчислювальної потужності як для шифрування, так і
для розшифрування інформації.
Через вади в швидкодії асиметричного методу цей метод доводиться
використовувати разом з симетричним (асиметричні методи на 3 — 4 порядки
повільніші). Так, для розв'язання задачі ефективного шифрування з
передаванням секретного ключа, використаного відправником, інформація
спочатку симетрично зашифровується випадковим ключем, потім цей ключ
зашифровують відкритим асиметричним ключем одержувача, після чого
повідомлення і ключ відправляються по мережі.
Шифр Хілла
Шифр Хілла — поліграмний шифр підстановки, заснований на лінійній
алгебрі. Лестер Хілл винайшов цей шифр у 1929 році, і це був перший шифр,
який дозволяв на практиці оперувати більш ніж з трьома символами за раз.
Процес шифрування: Кожній букві спершу зіставляється число. Блок з n
букв розглядається як n-мірний вектор і множиться на n × n матрицю по
модулю 26. (Якщо як основа модуля використовується число більше 26, то
можна використовувати іншу числову схему для зіставлення буквах чисел і
додати прогалини і знаки пунктуації.) Матриця повністю є ключем шифру. Для
можливості дешифрування повідомлення, необхідно створити обернену
матрицю, що може скласти велику проблему, якщо визначник матриці буде
дорівнювати 0.
Процес дешифрування: Для того, щоб дешифрувати повідомлення,
необхідно обернути зашифрований текст назад в вектор і потім просто
помножити на обернену матрицю ключа.
9
Криптостійкість: На жаль, стандартний шифр Хілла вразливий до атаки
по обраному відкритому тексту, тому що він повністю лінійний.
Криптоаналітик, який перехопить n2 пар символів повідомлення або символів
вже зашифрованого тексту зможе скласти систему лінійних рівнянь, яку
зазвичай не складно вирішити. Якщо виявиться, що система не вирішувана, то
необхідно всього лише додати ще кілька пар символів повідомлення або
зашифрованих символів. Такого роду розрахунки засобами звичайних
алгоритмів лінійної алгебри вимагає зовсім небагато часу.
10
безліч дійсно працюють алгоритмів на доступному рівні для основної маси
цікавляться читачів. Автори постаралися зробити пояснення до кожного, навіть
досить складного, алгоритму максимально доступними для читача. Також для
ознайомлення з алгоритмами допоможе книга Ханта Ендрю, Томаса Девіда
«Програміст-прагматик. Шлях від підмайстри до майстра»[6].
Після знайомства з алгоритмами можна переходити до вивчання самого
шифрування, в цьому чудово допоможе «криптографічна класика» Саймона
Сінгха «Книга шифрів»[7] - ця книга пояснює, що таке шифрування та як його
застосовувати.
11
1. Математична модель методу Хілла
12
найпростіша схема: A = 0, B = 1, ..., Z = 25, але це не є істотним властивістю
шифру. Алфавіт починається з нуля для зручності запрограмовування
програми, оскільки алфавіт – це масив, а перший елемент масиву – це 0. Блок з
n букв розглядається як n-мірний вектор і множиться по модулю 26 на матрицю
розміру n × n. Якщо в якості підстави модуля використовується число більше
ніж 26, то можна використовувати іншу числову схему для зіставлення букв,
чисел і додати прогалини і знаки пунктуації. Елементи матриці є ключем. Для
можливості використання операції розшифрування необхідно мати обернену
матрицю цього ключа.
або
1.3 Криптостійкість
Довжина ключа
Довжина ключа - це двійковий логарифм від кількості всіх можливих
ключів. Існує 26n*n матриць розміру n × n. Отже, log2(26n*n) 4,7n2 - верхня межа
довжини ключа для шифру Хілла, котрий використовує матриці n × n. Це
тільки верхня грань, оскільки не кожна матриця обернена, а тільки такі матриці
можуть бути ключами. Кількість обернених матриць може бути розрахована за
допомогою Китайської теореми про залишки. Матриця обернена по модулю 26
тоді і тільки тоді, коли вона обернена і по модулю 2, і по модулю 13.
14
Кількість обернених по модулю 2 і 13 матриць розміру n × n рівне порядку
лінійної групи GL (n, Z2) і GL (n, Z13) відповідно:
15
2. Опис проектного рішення шифрування методу Хілла
16
Рисунок 3 – Блок-схема алгоритму роботи шифру Хілла
2.2 Бібліотеки
2.3 Функції
18
Функція Encryption() – функція, яка виконує зашифрування повідомлення
методом, перемножуючи матрицю з повідомленням.
Функція Decryption() – функція, що виконує розшифрування повідомлення
перемножуючи обернену матрицю з повідомленням.
Функція getMsg() – функція, яка виконує операцію читання з файлу та
зчитує всю інформацію у тип даних string.
19
3. Налагоджування та тестування системи, огляд результатів
3.2 Тестування ПЗ
20
виявлених помилок та на скільки функція задовольняє умовам за 5тибальною
шкалою, де 5 – якісна, 1 - погана.
Функція Час роботи, с Кількість помилок Якість
Mod26() 0,0001 0 5
CofactorMatrix() 0,0003 0 5
DetMatrix() 0,0002 0 5
TransMatrix() 0,0007 0 5
InverseMatrix() 0,0013 2 3
Encryption() 0,0003 0 5
Decryption() 0,0024 0 5
getMsg() 0,0001 0 5
Після того як користувач ввів розмірність масиву, він має ввести всі
елементи щойно створеного масиву (див. Рисунок 5). ПРИМІТКА! Для
розшифрування повідомлення, визначник цього масиву не має дорівнювати 0.
21
іншому ж випадку програма знайде обернену матрицю та виведе про це
інформацію на екран. Після цього програма розшифровує повідомлення та
виводить його на екран (див. Рисунок 6).
22
Висновки
23
Перелік використаних джерел
24
Додаток А
25
}
}
}
}
//Детермінант матриці
int DetMatrix(vector<vector<int>> &key, int n, int N){
int D = 0;
//Якщо розмірність ключа 1, то детермінантом буде цей елемент матриці
if(n == 1) return key[0][0];
vector<vector<int>> temp(N, vector<int>(N));
int sign = 1;
for(int f = 0;f < n; f++){
CofactorMatrix(key, temp, 0, f, n);
D += sign * key[0][f] * DetMatrix(temp, n - 1, N);
sign = -sign;
}
return D;
}
//Транспонована матриця
void TransMatrix(vector<vector<int>> &key, vector<vector<int>> &adj, int N){
if(N == 1){
adj[0][0] = 1;
return;
}
int sign = 1;
vector<vector<int> > temp(N, vector<int>(N));
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
CofactorMatrix(key, temp, i, j, N);
sign = ((i+j)%2==0)? 1: -1;
adj[j][i] = (sign)*(DetMatrix(temp, N-1 , N));
}
}
}
//Обернена матриця
26
bool InverseMatrix(vector<vector<int>> &key, vector<vector<int>> &inv, int N){
int det = DetMatrix(key, N, N);
//Якщо детермінант = 0 то оберненої матриці не існує
if(det == 0){
cout << "\nОбернена матриця не існує\n";
exit(1);
}
int invDet = Mod26(det);
vector<vector<int>> adj(N, vector<int>(N));
TransMatrix(key, adj, N);
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
inv[i][j] = (adj[i][j] * invDet) % 26;
}
}
return true;
}
//Зашифрування повідомлення
string Encryption(int n, string en_msg, vector<vector<int>> &key){
string msg = "";
int k = 0;
int temp = (n - en_msg.size() % n) % n;
for(int i = 0; i < temp; i++){
en_msg += 'x';
}
while(k < en_msg.size()){
for(int i = 0; i < n; i++){
int sum = 0;
int temp = k;
for(int j = 0; j < n; j++){
sum += (key[i][j] % 26 * (en_msg[temp++] - 'a') % 26) % 26;
sum = sum % 26;
}
msg += (sum + 'a');
}
27
k += n;
}
return msg;
}
//Розшифрування повідомлення
string Decryption(string de_msg, int n, vector<vector<int>> &inv ){
int k = 0;
string msg = "";
while(k < de_msg.size()){
for(int i = 0; i < n; i++){
int sum = 0;
int temp = k;
for(int j = 0; j < n; j++){
sum += ((inv[i][j] + 26) % 26 * (de_msg[temp++] - 'a') % 26) % 26;
sum = sum % 26;
}
msg += (sum + 'a');
}
k += n;
}
return msg;
}
//Читання з файлу повідомлення
string getMsg(){
string msg;
ifstream file("msg.txt");
while(!file.eof()){
file >> msg;
}
file.close();
return msg;
}
int main(){
int x, y, n;
28
string en_msg, de_msg, msg;
msg = getMsg();
cout<<"Введене повідомлення: " << msg << endl;
cout<<"Введіть розмірність ключа: "; cin >> n;
vector<vector<int> > key(n, vector<int>(n));
vector<vector<int> > adj(n, vector<int>(n));
vector<vector<int> > inv(n, vector<int>(n));
int f = de_msg.size() - 1;
while(de_msg[f] == 'x'){
f--;
}
cout << "\nРозшифроване повідомлення: ";
for(int i = 0; i <= f; i++){
cout << de_msg[i];
}
cout<<'\n';
return 0;
}
29
30