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

  Опросы
1001 и 1 книга  
12.02.2021г.
Просмотров: 8288
Комментарии: 1
Коротко о корпусе. Как выбрать системный блок под конкретные задачи

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

11.02.2021г.
Просмотров: 8598
Комментарии: 0
Василий Севостьянов: «Как безболезненно перейти с одного продукта на другой»

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

20.12.2019г.
Просмотров: 15796
Комментарии: 0
Dr.Web: всё под контролем

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

04.12.2019г.
Просмотров: 14977
Комментарии: 12
Особенности сертификаций по этичному хакингу

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

28.05.2019г.
Просмотров: 16143
Комментарии: 3
Анализ вредоносных программ

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

Друзья сайта  

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

sysadmins.ru

 Реализация классического метода «Шифр четырех квадратов» в 1С

Архив номеров / 2018 / Выпуск №10 (191) / Реализация классического метода «Шифр четырех квадратов» в 1С

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

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

Реализация классического метода
«Шифр четырех квадратов» в 1С

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

Современные системные администраторы – это специалисты широкого профиля, требования к ним неуклонно возрастают с каждым днем. Одним из таких требований является правка решений на основе 1С, для которой необходимо владеть элементами языка 1С. Эти элементы можно изучить, в том числе, и при решении небольших задач программирования.

Интересными в этом плане задачами являются те, что связаны с классическими алгоритмами и методами криптографии [1]. Один из таких – метод «Шифр четырех квадратов» [2, 3]. Его программная реализация в 1С дополнит существующие решения по другим способам шифрования [4].

Целью настоящей работы является разработка учебного программного модуля управляемого приложения, который осуществляет шифрование и дешифрование на основе классического метода «Шифр четырех квадратов».

Этот шифр достаточно прост и удобен как для ручного счета, так и для программной реализации. Для этого шифра в отличие от некоторых других требуется не один пароль, а два. Алфавит фиксирован, хорошо, когда количества символов точно хватает для заполнения квадрата целиком.

Перед процедурами шифрования и дешифрования должно быть выполнено формирование матрицы, содержащей четыре квадрата.

  • Левый верхний и правый нижний квадраты формируются на основе алфавита путем заполнения всех ячеек слева направо сверху вниз символами алфавита.
  • Правый верхний квадрат формируется на основе первого пароля.
  • Левый нижний квадрат формируется на основе второго пароля

Алгоритм:

  • Вначале символы паролей приводятся к верхнему регистру.
  • Затем исключаются все символы, не входящие в алфавит, после – все уже ранее встретившиеся в пароле.
  • Получившиеся символы пароля записываются в ячейки нужного квадрата слева направо сверху вниз.
  • Оставшиеся незаполненными символами ячейки заполняются неиспользованными символами алфавита.

Текст, который требуется зашифровать, преобразуется: его символы приводятся к верхнему регистру и из их числа исключаются символы, которые не встречаются в алфавите.

Разработаем модуль управляемого приложения, который осуществляет шифрование и дешифрование

Поскольку шифрование и расшифровывание происходят по парам символов, открытый текст дополняется до четного числа символов в случае необходимости.

По каждой паре символов левый и правый символы в соответственно левом верхнем и правом нижнем квадратах становятся вершинами прямоугольника.

В противоположных по горизонтали от этих символов ячейках квадрата открытого текста лежат символы шифрованного текста.

Дешифрование обратно шифрованию, зашифрованные символы формируют две вершины прямоугольника, левый символ пары – в правом верхнем квадрате, правый – в левом нижнем. Расшифрованные символы находятся противоположно по горизонтали.

Для иллюстрации шифрования пары символов на рис. 1 и 2 изображается координатная сетка, иллюстрирующая соответствие индексов для формирования четырех квадратов для последующего шифрования и дешифрования.

Рисунок 1. Действие «Зашифровать» Рисунок 2. Действие «Расшифровать»
Рисунок 1. Действие «Зашифровать» Рисунок 2. Действие «Расшифровать»

На рис. 1: I – зашифрованный левый символ в паре, II – зашифрованный правый символ в паре.

На рис. 2: I – расшифрованный левый символ в паре, II – расшифрованный правый символ в паре.

Для значительного упрощения весь исходный текст программы будет располагаться в модуле управляемого приложения.

Определяются переменные, которые будут доступны всем подпрограммам:

  • Размер содержит сторону квадрата,
  • Алфавит – строка, содержащая все возможные символы, которые участвуют в шифровании,
  • Матрица – двумерный массив для хранения четырех квадратов.
Перем Размер, Алфавит, Матрица;

Первой подпрограммой является Инициализация(), которая присваивает конкретные значения переменным Размер и Алфавит:

Процедура Инициализация()
    Размер = 5;
    Алфавит = "ABCDEFGHIJKLMNOPRSTUVWXYZ";
КонецПроцедуры

Следующей является ОграничитьсяАлфавитом(текст). Единственный аргумент текст – это строка, символы которой будут переведены в верхний регистр, а затем из их числа исключены все не входящие в алфавит.

Переменная ТекстПрописные будет содержать символы исходной строки в верхнем регистре, Результат – результирующую строку, Символ – символ строки, i – счетчик цикла:

Функция ОграничитьсяАлфавитом(текст)
    Перем ТекстПрописные, Результат, Символ, i;
    Результат = "";
    ТекстПрописные = ВРег(текст);

Для всех символов в преобразованной строке, если символ содержится в алфавите, то он накапливается с результатом:

    Для i = 1 По СтрДлина(ТекстПрописные) Цикл
	Символ = Сред(ТекстПрописные, i, 1);
	Если Найти(Алфавит, Символ) <> 0 Тогда
	    Результат = Результат + Символ;
	КонецЕсли;
    КонецЦикла;

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

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

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

Функция Дополнить(текст)
    Перем Врем, Результат, Символ, i;
    Результат = "";
    Врем = текст + Алфавит;

По всем символам временной строки, если символ не содержится в результате, то он конкатенируется с результатом:

    Для i = 1 По СтрДлина(Врем) Цикл
	Символ = Сред(Врем, i, 1);
	Если Найти(Результат, Символ) = 0 Тогда
	    Результат = Результат + Символ;
	КонецЕсли;
    КонецЦикла;

Строка для заполнения квадрата возвращается:

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

Процедура СоздатьМатрицу(пароль1, пароль2) создает матрицу, в которой содержатся четыре квадрата. В переменных ПарольДляМатрицы1 и ПарольДляМатрицы2 содержатся пароли, на основании которых можно сформировать квадраты, в i и j – счетчики циклов:

Процедура СоздатьМатрицу(пароль1, пароль2)
    Перем ПарольДляМатрицы1, ПарольДляМатрицы2;
    Перем i, j;

Создается Матрица – новый двумерный массив, который по размерам подходит для хранения четырех квадратов. Формируются пароли для матрицы, для этого исходные пароли, во-первых, ограничиваются применяемым алфавитом, а во-вторых, дополняются символами алфавита для заполнения квадрата:

    Матрица = Новый Массив(Размер + Размер, Размер + Размер);
    ПарольДляМатрицы1 = Дополнить(ОграничитьсяАлфавитом(пароль1));
    ПарольДляМатрицы2 = Дополнить(ОграничитьсяАлфавитом(пароль2));

Теперь происходит непосредственно заполнение четырех квадратов. По каждой ячейке отдельного квадрата:

    Для i = 0 По Размер - 1 Цикл
	Для j = 0 По Размер - 1 Цикл

Учитывая расположение отдельных квадратов в матрице, присваивается соответственно ячейкам левого верхнего квадрата – символы алфавита, правого нижнего – также символы алфавита, правого верхнего – первый пароль, левого нижнего – второй пароль:

	    Матрица[i][j] = Сред(Алфавит, i * Размер + j + 1, 1);
	    Матрица[i + Размер][j + Размер] = Сред(Алфавит, i * Размер + j + 1, 1);
	    Матрица[i][j + Размер] = Сред(ПарольДляМатрицы1, i * Размер + j + 1, 1);
	    Матрица[i + Размер][j] = Сред(ПарольДляМатрицы2, i * Размер + j + 1, 1);

Циклы повторяются по всем ячейкам и процедура завершается.

	КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Функция Зашифровать(текст) возвращает зашифрованный текст. В переменной Результат помещается результирующий шифрованный текст, ТекстДляМатрицы – ограниченный алфавитом и дополненный до четного числа символов не шифрованный текст, x1 и y1 – координаты нечетного по порядку символа исходного текста в матрице, относящейся к левому верхнему квадрату, x2 и y2 – координаты четного по порядку символа исходного текста в матрице, относящейся к правому нижнему квадрату, ij и k – счетчики циклов:

Функция Зашифровать(текст)
    Перем Результат, ТекстДляМатрицы;
    Перем x1, y1, x2, y2;
    Перем i, j, k;

Вначале результат пуст, а в ТекстДляМатрицы помещается ограниченный алфавитом и дополненный до четного числа символов открытый текст:

    Результат = "";
    ТекстДляМатрицы = ОграничитьсяАлфавитом(текст);
    Если СтрДлина(ТекстДляМатрицы) % 2 <> 0 Тогда
	ТекстДляМатрицы = ТекстДляМатрицы + "X";
    КонецЕсли;

По всем парам символов в строке для шифрования выделяются левый символ Символ1, нечетный по порядку, и правый символ Символ2, четный по порядку:

    Для k = 1 По Цел(СтрДлина(ТекстДляМатрицы) / 2) Цикл
	Символ1 = Сред(ТекстДляМатрицы, 2 * k - 1, 1);
	Символ2 = Сред(ТекстДляМатрицы, 2 * k, 1);

Для определения координат символов в матрице эти координаты изначально равны нулю:

	y1 = 0;
	x1 = 0;
	y2 = 0;
	x2 = 0;

По всем ячейкам матрицы, соответствующим левому верхнему и правому нижнему квадрату. Если в левом верхнем квадрате найден первый символ, то запоминается его местоположение в матрице:

	Для i = 0 По Размер - 1 Цикл
	    Для j = 0 По Размер - 1 Цикл
		Если Матрица[i][j] = Символ1 Тогда
		    y1 = i;
		    x1 = j;
		КонецЕсли;

Если в правом нижнем квадрате найден второй символ, то запоминается его местоположение в матрице:

		Если Матрица[i + Размер][j + Размер] = Символ2 Тогда
			    y2 = i + Размер;
			    x2 = j + Размер;
		КонецЕсли;
	    КонецЦикла;
	КонецЦикла;

По координатам в соответствии с рис. 1 определяются зашифрованные символы, которые конкатенируются с результатом:

	Результат = Результат + Матрица[y1][x2] + Матрица[y2][x1];
    КонецЦикла;

Результат возвращается:

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

Функция Расшифровать(текст) выполняет расшифровку зашифрованного текста из аргумента текст. В переменной Результат помещается результирующий расшифрованный текст, ТекстДляМатрицы – ограниченный алфавитом и дополненный до четного числа символов зашифрованный текст, x1 и y1 – координаты нечетного по порядку символа зашифрованного текста в матрице, относящейся к левому верхнему квадрату, x2 и y2 – координаты четного по порядку символа зашифрованного текста в матрице, относящейся к правому нижнему квадрату, ij и k – счетчики циклов:

Функция Расшифровать(текст)
    Перем Результат, ТекстДляМатрицы;
    Перем x1, y1, x2, y2;
    Перем i, j, k;

Результат изначально пуст, а в ТекстДляМатрицы помещается, чтобы избежать ошибок, ограниченный алфавитом и дополненный до четного числа символов зашифрованный текст, два последних символа которого в случае ошибки будут неверны:

    Результат = "";
    ТекстДляМатрицы = ОграничитьсяАлфавитом(текст);
    Если СтрДлина(ТекстДляМатрицы) % 2 <> 0 Тогда
	ТекстДляМатрицы = ТекстДляМатрицы + "X";
    КонецЕсли;

Далее по всем парам наших символов в строке для расшифровывания выделяются левый символ Символ1, нечетный по порядку, и правый символ Символ2, четный по порядку:

    Для k = 1 По Цел(СтрДлина(ТекстДляМатрицы) / 2) Цикл
	Символ1 = Сред(ТекстДляМатрицы, 2 * k - 1, 1);
	Символ2 = Сред(ТекстДляМатрицы, 2 * k, 1);

Для определения координат символов в матрице эти координаты изначально равны нулю:

	y1 = 0;
	x1 = 0;
	y2 = 0;
	x2 = 0;

Теперь пройдемся по всем ячейкам матрицы, соответствующим правому верхнему и левому нижнему квадрату. Если же в правом верхнем квадрате будет найден первый символ, то далее запоминается его местоположение в матрице:

	Для i = 0 По Размер - 1 Цикл
	    Для j = 0 По Размер - 1 Цикл
		Если Матрица[i][j + Размер] = Символ1 Тогда
		    y1 = i;
		    x1 = j + Размер;
		КонецЕсли;

Если в левом нижнем квадрате найден второй символ, то запоминается его местоположение в матрице:

		Если Матрица[i + Размер][j] = Символ2 Тогда
		    y2 = i + Размер;
		    x2 = j;
		КонецЕсли;
	    КонецЦикла;
	КонецЦикла;

По координатам в соответствии с рис. 2 определяются расшифрованные символы, которые конкатенируются с результатом:

	Результат = Результат + Матрица[y1][x2] + Матрица[y2][x1];
    КонецЦикла;

Результат возвращается:

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

Процедура ПечатьДвумерногоМассива(массив) сообщает пользователю содержимое двумерного массива. В переменной Результат находится результат, вначале равный пустой строке, ij – счетчики циклов:

Процедура ПечатьДвумерногоМассива(массив)
    Перем Результат;
    Перем i, j;
    Результат = "";

По всем строкам массива для каждой ячейке в строке ее содержимое конкатенируется с результатом:

    Для i = 0 По массив.Количество() - 1 Цикл
	Для j = 0 По массив[0].Количество() - 1 Цикл
	    Результат = Результат + " " + массив[i][j];
	КонецЦикла;

В конец строки добавляется терминатор:

	Результат = Результат + ""
	    "";
    КонецЦикла;

Пользователю сообщается результат:

    Сообщить(Результат);
КонецПроцедуры

Процедура Главная() осуществляет взаимосвязь остальных подпрограмм.

Переменные пароль1 и пароль2 хранят первый и второй пароли, СтрокаИсходнаяСтрокаЗашифрованнаяСтрокаРасшифрованная – исходную, зашифрованную и расшифрованную строки:

Процедура Главная()
    Перем пароль1, пароль2;
    Перем СтрокаИсходная, СтрокаЗашифрованная, СтрокаРасшифрованная;

Происходит инициализация переменных:

    Инициализация();

Присваиваются текущие пароли:

    пароль1 = "Example";
    пароль2 = "SAMAG";

Создается матрица с четырьмя квадратами:

    СоздатьМатрицу(пароль1, пароль2);

Происходит шифрование и дешифрование:

    СтрокаИсходная = "http://samag.ru/";
    СтрокаЗашифрованная = Зашифровать(СтрокаИсходная);
    СтрокаРасшифрованная = Расшифровать(СтрокаЗашифрованная);

Отображаются рабочие переменные:

    Сообщить(Алфавит);
    Сообщить(пароль1);
    Сообщить(пароль2);
    ПечатьДвумерногоМассива(Матрица);

и результаты работы:

    Сообщить(СтрокаИсходная);
    Сообщить(СтрокаЗашифрованная);
    Сообщить(СтрокаРасшифрованная);
КонецПроцедуры

Происходит вызов головной процедуры:

Главная();

Полный текст программы можно скачать на сайте http://samag.ru.

Результаты работы программы:

ABCDEFGHIJKLMNOPRSTUVWXYZ

Example
SAMAG
 A B C D E E X A M P
 F G H I J L B C D F
 K L M N O G H I J K
 P R S T U N O R S T
 V W X Y Z U V W Y Z
 S A M G B A B C D E
 C D E F H F G H I J
 I J K L N K L M N O
 O P R T U P R S T U
 V W X Y Z V W X Y Z

http://samag.ru/
DRNTNMGMBPRZ
HTTPSAMAGRUX
ABCDEFGHIJKLMNOPRSTUVWXYZ

Example
SAMAG
 A B C D E E X A M P
 F G H I J L B C D F
 K L M N O G H I J K
 P R S T U N O R S T
 V W X Y Z U V W Y Z
 S A M G B A B C D E
 C D E F H F G H I J
 I J K L N K L M N O
 O P R T U P R S T U
 V W X Y Z V W X Y Z

Kirill Stanislavovich Tkachenko
JCSDHJSRMICTGAZIYCAENLASFMGLIZ
KIRILLSTANISLAVOVICHTKACHENKOX

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

  1. Жельников В. Криптография от папируса до компьютера / В. Жельников. – М.: ABF, 1996. – 335 с. ISBN 5-87484-054-0.
  2. Four-square cipher // Wikipedia. URL: https://en.wikipedia.org/wiki/Four-square_cipher (дата обращения: 29.08.2018).
  3. Шифр четырех квадратов // Википедия. URL: https://ru.wikipedia.org/wiki/Шифр_четырех_квадратов (дата обращения: 29.08.2018).
  4. Ткаченко К. Программная реализация энигмоподобной системы в среде 1С. // «Системный администратор», № 4, 2017 г. – С. 72-74. ISSN 1813-5579. URL: http://samag.ru/archive/article/3414 (дата обращения: 29.08.2018).

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


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

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

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

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

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