Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Алгоритмізація та програмування 1: Базові концепції програмування
ЗВІТ
До модульної контрольної роботи №2
Варіант 3
Дата «15» грудня 2021
Завдання на модульну контрольну роботу:
На початку завдання дано зашифроване слово, та початкову матрицю.
За допомогою цих даних потрібно розшифрувати дане слово за допомогою шифру Гілла.
Результат роботи повинен відобразити:1. Обернену матрицю;2. Розшифроване повідомлення.
Скріншот завдання:
/
/
Хід роботи
На початку виконання програми отримується рядок символів(строку): Зашифроване слово та початкова матриця ( матриця-ключ ). Далі проводиться його конвертація у матрицю індексів, згідно англійського алфавіту. Шукається обернена матриця до матриці-ключа та виконується її перетворення до потрібного вигляду. За допомогою множення матриць знаходиться кінцева матриця. Далі за допомогою англійського алфавіту, по індексам букв перетворюємо кінцеву матрицю індексів у матрицю символів і виводимо у консоль кінцеве розшифроване слово.
Посилання на Repl.it:
https://replit.com/join/molvlvfddn-tr-15fundamient
Результати виконання програми:
/
Код програми:
#include <stdio.h>
#include <math.h>
#define SIZE 2
#define WORDSIZE 4
int main(void) {
char arr[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char originalWord[WORDSIZE] = "dvdz";
char text[SIZE][SIZE] = {{},{}};
int selec = 0;
// Перевод зашифрованого слова у матрицю символів
while( selec < WORDSIZE) {
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
text[i][j] = originalWord[selec];
selec++;
}
}
}
printf("\033[1;31m");
printf("Зашифроване слово: \n");
printf("\033[0m");
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
printf("%c", text[i][j]);
}
}
printf("\n\n");
int key[SIZE][SIZE] = {
{6,9},
{3,5}
};
printf("\033[1;31m");
printf("Матриця шифрування: \n");
printf("\033[0m");
for(int i = 0; i < SIZE; i++) {
printf("| ");
for(int j = 0; j < SIZE; j++) {
printf("%d ", key[i][j]);
}
printf("|\n");
}
printf("\n");
int mat[SIZE][SIZE] = {{},{}};
// перетворення матриці символів у матрицю індексів
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
for(int c = 0; c < 26; c++) {
if(text[i][j] == arr[c]) {
mat[i][j] = c;
}
}
}
}
int det = key[0][0]*key[1][1]-key[1][0]*key[0][1];
if(det == 0){
printf("\033[1;31m");
printf("EROR: determinant = 0");
printf("\033[0m");
return 0;
} else if(det < 0) {
det = det + 26;
}
int obertKey[SIZE][SIZE] = {{},{}};
obertKey[0][0] = key[1][1];
obertKey[0][1] = -key[0][1];
obertKey[1][0] = -key[1][0];
obertKey[1][1] = key[0][0];
// Транспонування матриці ключа
int buff = 0;
buff = key[0][1];
key[0][1] = key[1][0];
key[1][0] = buff;
double obertKey1[SIZE][SIZE];
for(int i = 0; i < SIZE; i++){
for(int j = 0; j < SIZE; j++) {
obertKey1[i][j] = (pow(-1, i+j)*key[SIZE-1-i][SIZE-1-j])/det;
}
}
printf("\033[1;31m");
printf("Обернена матриця шифрування: \n");
printf("\033[0m");
for(int i = 0; i < SIZE; i++) {
printf("| ");
for(int j = 0; j < SIZE;j++) {
printf("%.2f ",obertKey1[i][j]);
}
printf("|\n");
}
printf("\n");
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
if(obertKey[i][j] < 0)
obertKey[i][j] = obertKey[i][j] + 26;
}
}
int q = 0;
int count = 0;
int koef = 0;
while((q*det)%26 != 1) {
q++;
count = q;
}
koef = count;
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
obertKey[i][j] = (obertKey[i][j]*koef) % 26;
}
}
printf("\033[1;31m");
printf("Обернена матриця перетворена mod26: \n");
printf("\033[0m");
for(int i = 0;i < SIZE; i++) {
printf("| ");
for(int j = 0; j < SIZE;j++) {
printf("%d ",obertKey[i][j]);
}
printf("|\n");
}
printf("\n");
int count1 = 0;
int resultMat[SIZE][SIZE] = {{},{}};
// Обрахування кінцевої матриці
int count2 = 0;
for(int i = 0; i < SIZE; i++) {
count2 = 0;
for(int k = 0; k < SIZE; k++) {
for(int j = 0; j < SIZE; j++) {
resultMat[count1][count2] += obertKey[k][j]*mat[i][j];
}
count2++;
}
count1++;
}
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
resultMat[i][j] = resultMat[i][j] % 26;
}
}
printf("\033[1;31m");
printf("Кінцева матриця: \n");
printf("\033[0m");
for(int i = 0;i< SIZE; i++) {
printf("| ");
for(int j = 0; j < SIZE;j++) {
printf("%d ",resultMat[i][j]);
}
printf("|\n");
}
printf("\n");
// Перетворення кінцевої матриці, у матрицю сиволів розшифрованого слова
char resultWord[SIZE][SIZE] = {{},{}};
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
for(int q = 0; q < 26; q++) {
if(resultMat[i][j] == q) {
resultWord[i][j] = arr[q];
}
}
}
}
printf("\033[1;31m");
printf("Отримане слово внаслідок розшифрування:\n");
printf("\033[0m");
for(int i = 0; i < SIZE; i++) {
for(int j = 0; j < SIZE; j++) {
printf("%c", resultWord[i][j]);
}
}
printf("\n");
}
Висновок: Поставлену задачу виконано. Було написано програму для розшифрування шифрів за допомогою методу Гілла.