Uploaded by Олег Н.

Шифр Кардано

advertisement
ЛАБОРАТОРНАЯ РАБОТА №1
Шифр Кардано
Цели: получить теоретические сведения и практические навыки работы с
шифром Кардано;
Задачи: изучить теоретический материал по принципу работы шифра
Кардано и применить полученные данные на практике;
Краткая теория
Решётка Кардано — инструмент кодирования и декодирования,
представляющий собой специальную прямоугольную (в частном случае —
квадратную) таблицу-карточку, часть ячеек которой вырезана.
Решетку можно разместить в 4 положениях — лицом вверх, лицом вниз,
вертикально и в перевернутом положении, что вчетверо увеличивает число
возможных размещений сетки. Если решетка Кардано - квадрат, то возможен
второй вариант размещений сетки, а именно, последовательные повороты
вокруг центра квадрата на 90°.
Когда зашифрованное сообщение составлено плохо, оно выделяется
неестественным языком и постоянно меняющимся стилем. Специалист может
попытаться восстановить решётку, если у него имеется несколько экземпляров
подозрительных сообщений из переписки. Когда сообщение зашифровано
хорошо, его трудно выявить. Даже если специалист считает сообщение
подозрительным, зашифрованный текст может содержать любая невинная
буква. Поэтому, на практике, единственное решение — это получить саму
решётку.
Чтобы прочитать закодированное сообщение, необходимо наложить
решётку Кардано на текст нужное число раз и прочитать буквы,
расположенные в вырезанных ячейках.
Метод является медленным и требует наличия литературных навыков. Но
самое главное, что любой шифровальный аппарат может быть утерян, украден
или конфискован. Таким образом, потерять одну решётку — значит потерять
всю секретную переписку, шифровавшуюся с помощью этой решётки.
Исходный текст:
gukoa
rdxoe
bnaej
utpnw
nowmp
Зашифрованный текст: kardano
Рисунок 1 – Шифрование текста методом Кардано
Листинг
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char* argv[])
{
const int SIZE = 5;
char *buf[SIZE] = {"gukoa",
"rdxoe",
"bnaej",
"utpnw",
"nowmp"}; // матрица с
зашифрованным текстом
int grid[SIZE][SIZE] ={{0, 0, 1, 0, 1},
{1, 1, 0, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 0, 1, 0},
{0, 1, 0, 0, 0}};// решетка
Кардано
// размер обоих матриц должен быть
одинаковым
// вывод зашифрованного сообщения
for (int i = 0; i < SIZE; i++)
cout << buf[i] << endl;
// прямой обход решетки
cout << "0:" << endl;
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
if (grid[i][j] == 1)
cout << buf[i][j];
cout << endl;
// поворот решетки на 90 градусов по
часовой стрелке
cout << "90:" << endl;
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
if (grid[SIZE-j-1][i] == 1)
cout <<
buf[i][j];
cout << endl;
// поворот решетки на 180 градусов по
часовой стрелке
cout << "180:" << endl;
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
if (grid[SIZE-i-1][SIZE-j-1] == 1)
cout << buf[i][j];
cout << endl;
// поворот решетки на 270 градусов по
часовой стрелке
cout << "270:" << endl;
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
if (grid[j][SIZE-i-1] == 1)
buf[i][j];
system("pause"); return 0;
}
cout <<
Download