Інформація про навчальний заклад

ВУЗ:
Національний технічний університет України Київський політехнічний інститут
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2023
Тип роботи:
Звіт
Предмет:
Алгоритмізація та програмування

Частина тексту файла (без зображень, графіків і формул):

Національний технічний університет України  «Київський політехнічний інститут імені Ігоря Сікорського» Алгоритмізація та програмування 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"); } Висновок: Поставлену задачу виконано. Було написано програму для розшифрування шифрів за допомогою методу Гілла.
Антиботан аватар за замовчуванням

03.05.2023 18:57

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!