КИРИЛЛ ТКАЧЕНКО, инженер 1-й категории, ФГАОУ ВО «Севастопольский государственный университет», tkachenkokirillstanislavovich@gmail.com
Программная реализация в 1С классического метода шифрования «Решетка Кардано»
Рассматривается реализация классического метода шифрования «Решетка Кардано» на языке 1С. Эта реализация познакомит с историческим подходом к шифрованию, а также с основными языковыми конструкциями 1С
Современное шифрование достаточно сложно для неподготовленного специалиста. Но для введения в методы шифрования можно ограничиться теми, несложными сейчас, методами, что были известны уже несколько сотен лет назад. К таким методам относят и метод шифрования «Решетка Кардано» [1-3].
Метод на удивление прост и изначально предназначен для ручной реализации. Имеется лист для записи. Имеется решетка – лист, в котором есть отверстия-окошки. Прикладывая решетку к листу, в эти отверстия-окошки решетки записывается открытый текст по порядку. Когда открытый текст еще остался, а отверстия-окошки решетки уже заполнены, решетка поворачивается на 90 градусов. Оставшиеся свободным места листа заполняются произвольным текстом.
Для рассматриваемой ниже программной реализации предполагается, что лист квадратный, сторона N=4, решетка квадратная, сторона N=4, отверстий-окошек на решетке N=4, поворот происходит на 90 градусов по часовой стрелке, в отверстие-окошко можно записать только один символ. Также полагается, что при поворотах отверстия-окошки не накладываются друг на друга и исходный текст занимает ровно N2 символов. В таком виде, в силу значительного упрощения, имеются даже олимпиадные задачи по программированию на тему этого метода шифрования [4].
Поэтому целью настоящей работы является разработка программной реализации упрощенного варианта классического метода шифрования «Решетка Кардано» в 1С.
Для иллюстрации пусть исходная строка есть «АБВГДЕЁЖЗИЙКЛМНО», а решетка – «.*..*.....*....*» (по аналогии с [1, рис. 48, правый нижний фрагмент]), в которой отверстие-окошко обозначается «*», а отсутствие отверстия-окошка – «.». Решетка и применение ее к исходной строке изображаются на рис. 1.
Рисунок 1. Иллюстрация шифрования методом «Решетка Кардано»
Вся программа помещается в модуль управляемого приложения пустой конфигурации. В начале модуля определяется переменная, содержащая сторону квадрата решетки шифрования и одновременно с этим число отверстий в решетке и число поворотов N:
Перем N;
Процедура Инициализация() присваивает N значение 4:
Процедура Инициализация()
N = 4;
КонецПроцедуры
Функция ИсходнаяРешетка(РешеткаТекст) производит построение и возврат удобного внутреннего представления решетки для программы на основе строкового представления РешеткаТекст. Двумерный массив Решетка служит для этого построения, а i и j играют роль счетчиков:
Функция ИсходнаяРешетка(РешеткаТекст)
Перем Решетка;
Перем i, j;
Создается новый двумерный массив Решетка:
Решетка = Новый Массив(N, N);
Всем ячейкам этого массива, по строкам и столбцам:
Для i = 0 По N - 1 Цикл
Для j = 0 По N - 1 Цикл
Присваивается значение соответствующего значения символа РешеткаТекст, номер которого в символьной строке определяется с учетом конкатенации по строкам матрицы:
Решетка[i][j] = Сред(РешеткаТекст, i * N + j + 1, 1);
КонецЦикла;
КонецЦикла;
Полученное представление решетки возвращается:
Возврат Решетка;
КонецФункции
Процедура ВывестиРешетку(Решетка) сообщает пользователю значение решетки. В переменной Рез находится результат:
Процедура ВывестиРешетку(Решетка)
Перем Рез;
Вначале Рез пуст:
Рез = "";
По всем строкам и столбцам матрицы решетки:
Для i = 0 По N - 1 Цикл
Для j = 0 По N - 1 Цикл
Значение ячейки накапливается:
Рез = Рез + Решетка[i][j];
КонецЦикла;
В конце каждой строки помещается терминатор:
Рез = Рез + ""
"";
КонецЦикла;
Результат сообщается пользователю:
Сообщить(Рез);
КонецПроцедуры
Функция ПовернутьРешетку(Решетка) производит поворот решетки на 90 градусов по часовой стрелке. В переменной Рез находится результат поворота, i и j служат счетчиками циклов:
Функция ПовернутьРешетку(Решетка)
Перем Рез;
Перем i, j;
Создается новый двумерный массив Рез:
Рез = Новый Массив(N, N);
По всем строкам и столбцам матрицы решетки:
Для i = 0 По N - 1 Цикл
Для j = 0 По N - 1 Цикл
Для поворота исходные столбцы становятся строками результата прямо, а строки в прямом порядке становятся столбцами в обратном:
Рез[j][N - 1 - i] = Решетка[i][j];
КонецЦикла;
КонецЦикла;
Функция возвращает результат:
Возврат Рез;
КонецФункции
Функция Зашифровать(Решетка, СтрокаИсходная) возвращает результат шифрования исходной строки СтрокаИсходная на основе матрицы Решетка. В переменных СтрокаЗашифрованная располагается зашифрованная строка в виде строки, СтрокаЗашифрованнаяМассив – зашифрованная строка в виде массива, Счетчик – номер текущего рассматриваемого символа исходной строки, i, j, k – счетчики циклов:
Функция Зашифровать(Решетка, СтрокаИсходная)
Перем СтрокаЗашифрованная;
Перем СтрокаЗашифрованнаяМассив;
Перем Счетчик;
Перем i, j, k;
Вначале СтрокаЗашифрованная становится пустой строкой, СтрокаЗашифрованнаяМассив – новым двумерным массивом, а Счетчик указывает на не принадлежащий исходной строке номер:
СтрокаЗашифрованная = "";
СтрокаЗашифрованнаяМассив = Новый Массив(N, N);
Счетчик = 0;
Для всех четырех поворотов решетки шифрования по часовой стрелке:
Для k = 1 По N Цикл
По всем строкам и столбцам матрицы решетки:
Для i = 0 По N - 1 Цикл
Для j = 0 По N - 1 Цикл
Если в решетке в этом месте находится отверстие-окошко, то в результат шифрования в виде матрицы в это место помещается текущий символ исходной строки:
Если Решетка[i][j] = "*" Тогда
Счетчик = Счетчик + 1;
СтрокаЗашифрованнаяМассив[i][j] = Сред(СтрокаИсходная, Счетчик, 1);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Решетка поворачивается:
Решетка = ПовернутьРешетку(Решетка);
КонецЦикла;
По всем строкам и столбцам зашифрованной строки в виде матрицы символ из матрицы добавляется к результирующей строке:
Для i = 0 По N - 1 Цикл
Для j = 0 По N - 1 Цикл
СтрокаЗашифрованная = СтрокаЗашифрованная + СтрокаЗашифрованнаяМассив[i][j];
КонецЦикла;
КонецЦикла;
Результат шифрования возвращается:
Возврат СтрокаЗашифрованная;
КонецФункции
Функция Расшифровать(Решетка, СтрокаЗашифрованная) возвращает результат расшифровывания зашифрованной строки СтрокаЗашифрованная на основе матрицы Решетка.
В переменных СтрокаРасшифрованная располагается расшифрованная строка в виде строки, i, j, k – счетчики циклов:
Функция Расшифровать(Решетка, СтрокаЗашифрованная)
Перем СтрокаРасшифрованная;
Перем i, j, k;
СтрокаРасшифрованная изначально пуста:
СтрокаРасшифрованная = "";
Для всех четырех поворотов решетки шифрования по часовой стрелке:
Для k = 1 По N Цикл
По всем строкам и столбцам матрицы решетки:
Для i = 0 По N - 1 Цикл
Для j = 0 По N - 1 Цикл
Если в решетке в этом месте находится отверстие-окошко, то к результату расшифровывания добавляется символ зашифрованной строки, который располагается по координатам этой строки и столбца решетки:
Если Решетка[i][j] = "*" Тогда
СтрокаРасшифрованная = СтрокаРасшифрованная + Сред(СтрокаЗашифрованная, i * N + j + 1, 1);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Решетка поворачивается:
Решетка = ПовернутьРешетку(Решетка);
КонецЦикла;
Расшифрованная строка возвращается:
Возврат СтрокаРасшифрованная;
КонецФункции
Процедура Главная() выполняет взаимосвязь описанных выше подпрограмм. В переменной Решетка находится решетка шифрования в виде матрицы, СтрокаИсходная, СтрокаЗашифрованная, СтрокаРасшифрованная – это соответственно исходная, зашифрованная и расшифрованная строки:
Процедура Главная()
Перем Решетка;
Перем СтрокаИсходная, СтрокаЗашифрованная, СтрокаРасшифрованная;
Сначала происходит присваивание N=4, после решетка шифрования преобразуется во внутреннее программное представление, затем решетка сообщается пользователю:
Инициализация();
Решетка = ИсходнаяРешетка(".*..*.....*....*");
ВывестиРешетку(Решетка);
Задается исходная строка, которая вначале шифруется, а затем результат шифрования расшифровывается:
СтрокаИсходная = "АБВГДЕЁЖЗИЙКЛМНО";
СтрокаЗашифрованная = Зашифровать(Решетка, СтрокаИсходная);
СтрокаРасшифрованная = Расшифровать(Решетка, СтрокаЗашифрованная);
Строки исходная, зашифрованная и расшифрованная сообщаются пользователю:
Сообщить(СтрокаИсходная);
Сообщить(СтрокаЗашифрованная);
Сообщить(СтрокаРасшифрованная);
КонецПроцедуры
Происходит вызов Главная():
Главная();
Полный исходный текст программы находится на сайте журнала http://samag.ru, результат работы представлен на рис. 2.
Рисунок 2. Результат работы программы
Полученный результат дополняет ранее опубликованные в журнале «Системный администратор» программные реализации классических методов шифрования и подходит для ознакомления с основными языковыми конструкциями 1С.
- Перельман Я.И. Живая математика / Я.И. Перельман. – М.: Гос. изд. физ.-мат. лит., 1958. – 185 с.
- Решетка Кардано // Википедия. URL: https://ru.wikipedia.org/wiki/Решётка_Кардано (дата обращения: 05.12.2018).
- Cardan grille // Wikipedia. URL: https://en.wikipedia.org/wiki/Cardan_grille (дата обращения: 05.12.2018).
- 1712. Шифровальная решетка // Timus Online Judge. URL: http://acm.timus.ru/print.aspx?space=1&num=1712 (дата обращения: 05.12.2018).
Ключевые слова: решетка Кардано, классические методы шифрования, 1С.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|