Программная реализация в 1С классического метода шифрования «Решетка Кардано»::Журнал СА 03.2019
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
О журнале
Журнал «БИТ»
Подписка
Где купить
Авторам
Рекламодателям
Магазин
Архив номеров
Вакансии
Контакты
   

ЭКСПЕРТНАЯ СЕССИЯ 2019


  Опросы

Какие курсы вы бы выбрали для себя?  

Очные
Онлайновые
Платные
Бесплатные
Я и так все знаю

 Читать далее...

1001 и 1 книга  
28.05.2019г.
Просмотров: 518
Комментарии: 1
Анализ вредоносных программ

 Читать далее...

28.05.2019г.
Просмотров: 645
Комментарии: 1
Микросервисы и контейнеры Docker

 Читать далее...

28.05.2019г.
Просмотров: 509
Комментарии: 0
Django 2 в примерах

 Читать далее...

28.05.2019г.
Просмотров: 412
Комментарии: 0
Введение в анализ алгоритмов

 Читать далее...

27.03.2019г.
Просмотров: 1000
Комментарии: 0
Arduino Uno и Raspberry Pi 3: от схемотехники к интернету вещей

 Читать далее...

Друзья сайта  

Форум системных администраторов  

sysadmins.ru

 Программная реализация в 1С классического метода шифрования «Решетка Кардано»

Архив номеров / 2019 / Выпуск №03 (196) / Программная реализация в 1С классического метода шифрования «Решетка Кардано»

Рубрика: Разработка /  Изучаем «1С»   | Дополнительные материалы

Кирилл Ткаченко КИРИЛЛ ТКАЧЕНКО, инженер 1-й категории, ФГАОУ ВО «Севастопольский государственный университет», tkachenkokirillstanislavovich@gmail.com

Программная реализация в 1С
классического метода шифрования «Решетка Кардано»

Программная реализация в 1С классического метода шифрования «Решетка Кардано»Рассматривается реализация классического метода шифрования «Решетка Кардано» на языке 1С. Эта реализация познакомит с историческим подходом к шифрованию, а также с основными языковыми конструкциями 1С

Современное шифрование достаточно сложно для неподготовленного специалиста. Но для введения в методы шифрования можно ограничиться теми, несложными сейчас, методами, что были известны уже несколько сотен лет назад. К таким методам относят и метод шифрования «Решетка Кардано» [1-3].

Метод на удивление прост и изначально предназначен для ручной реализации. Имеется лист для записи. Имеется решетка – лист, в котором есть отверстия-окошки. Прикладывая решетку к листу, в эти отверстия-окошки решетки записывается открытый текст по порядку. Когда открытый текст еще остался, а отверстия-окошки решетки уже заполнены, решетка поворачивается на 90 градусов. Оставшиеся свободным места листа заполняются произвольным текстом.

Для рассматриваемой ниже программной реализации предполагается, что лист квадратный, сторона N=4, решетка квадратная, сторона N=4, отверстий-окошек на решетке N=4, поворот происходит на 90 градусов по часовой стрелке, в отверстие-окошко можно записать только один символ. Также полагается, что при поворотах отверстия-окошки не накладываются друг на друга и исходный текст занимает ровно N2 символов. В таком виде, в силу значительного упрощения, имеются даже олимпиадные задачи по программированию на тему этого метода шифрования [4].

Поэтому целью настоящей работы является разработка программной реализации упрощенного варианта классического метода шифрования «Решетка Кардано» в 1С.

Для иллюстрации пусть исходная строка есть «АБВГДЕЁЖЗИЙКЛМНО», а решетка – «.*..*.....*....*» (по аналогии с [1, рис. 48, правый нижний фрагмент]), в которой отверстие-окошко обозначается «*», а отсутствие отверстия-окошка – «.». Решетка и применение ее к исходной строке изображаются на рис. 1.

Рисунок 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];
	КонецЦикла;
    КонецЦикла;

Функция возвращает результат:

    Возврат Рез;
КонецФункции

Функция Зашифровать(Решетка, СтрокаИсходная) возвращает результат шифрования исходной строки СтрокаИсходная на основе матрицы Решетка. В переменных СтрокаЗашифрованная располагается зашифрованная строка в виде строки, СтрокаЗашифрованнаяМассив – зашифрованная строка в виде массива, Счетчик – номер текущего рассматриваемого символа исходной строки, ijk – счетчики циклов:

Функция Зашифровать(Решетка, СтрокаИсходная)
    Перем СтрокаЗашифрованная;
    Перем СтрокаЗашифрованнаяМассив;
    Перем Счетчик;
    Перем 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];
	КонецЦикла;
    КонецЦикла;

Результат шифрования возвращается:

    Возврат СтрокаЗашифрованная;
КонецФункции

Функция Расшифровать(Решетка, СтрокаЗашифрованная) возвращает результат расшифровывания зашифрованной строки СтрокаЗашифрованная на основе матрицы Решетка.

В переменных СтрокаРасшифрованная располагается расшифрованная строка в виде строки, ijk – счетчики циклов:

Функция Расшифровать(Решетка, СтрокаЗашифрованная)
    Перем СтрокаРасшифрованная;
    Перем 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. Результат работы программы

Рисунок 2. Результат работы программы

Полученный результат дополняет ранее опубликованные в журнале «Системный администратор» программные реализации классических методов шифрования и подходит для ознакомления с основными языковыми конструкциями 1С.

  1. Перельман Я.И. Живая математика / Я.И. Перельман. – М.: Гос. изд. физ.-мат. лит., 1958. – 185 с.
  2. Решетка Кардано // Википедия. URL: https://ru.wikipedia.org/wiki/Решётка_Кардано (дата обращения: 05.12.2018).
  3. Cardan grille // Wikipedia. URL: https://en.wikipedia.org/wiki/Cardan_grille (дата обращения: 05.12.2018).
  4. 1712. Шифровальная решетка // Timus Online Judge. URL: http://acm.timus.ru/print.aspx?space=1&num=1712 (дата обращения: 05.12.2018).

Ключевые слова: решетка Кардано, классические методы шифрования, 1С.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru