КИРИЛЛ ТКАЧЕНКО, инженер 1-й кат., ФГАОУ ВО «Севастопольский государственный университет», tkachenkokirillstanislavovich@gmail.com
Реализация классического метода «Шифр четырех квадратов» в 1С
Предлагается программная реализация классического метода «Шифр четырех квадратов» на языке программирования 1С. Эта реализация может улучшить владение основными конструкциями языка 1С
Современные системные администраторы – это специалисты широкого профиля, требования к ним неуклонно возрастают с каждым днем. Одним из таких требований является правка решений на основе 1С, для которой необходимо владеть элементами языка 1С. Эти элементы можно изучить, в том числе, и при решении небольших задач программирования.
Интересными в этом плане задачами являются те, что связаны с классическими алгоритмами и методами криптографии [1]. Один из таких – метод «Шифр четырех квадратов» [2, 3]. Его программная реализация в 1С дополнит существующие решения по другим способам шифрования [4].
Целью настоящей работы является разработка учебного программного модуля управляемого приложения, который осуществляет шифрование и дешифрование на основе классического метода «Шифр четырех квадратов».
Этот шифр достаточно прост и удобен как для ручного счета, так и для программной реализации. Для этого шифра в отличие от некоторых других требуется не один пароль, а два. Алфавит фиксирован, хорошо, когда количества символов точно хватает для заполнения квадрата целиком.
Перед процедурами шифрования и дешифрования должно быть выполнено формирование матрицы, содержащей четыре квадрата.
- Левый верхний и правый нижний квадраты формируются на основе алфавита путем заполнения всех ячеек слева направо сверху вниз символами алфавита.
- Правый верхний квадрат формируется на основе первого пароля.
- Левый нижний квадрат формируется на основе второго пароля
Алгоритм:
- Вначале символы паролей приводятся к верхнему регистру.
- Затем исключаются все символы, не входящие в алфавит, после – все уже ранее встретившиеся в пароле.
- Получившиеся символы пароля записываются в ячейки нужного квадрата слева направо сверху вниз.
- Оставшиеся незаполненными символами ячейки заполняются неиспользованными символами алфавита.
Текст, который требуется зашифровать, преобразуется: его символы приводятся к верхнему регистру и из их числа исключаются символы, которые не встречаются в алфавите.
Разработаем модуль управляемого приложения, который осуществляет шифрование и дешифрование |
Поскольку шифрование и расшифровывание происходят по парам символов, открытый текст дополняется до четного числа символов в случае необходимости.
По каждой паре символов левый и правый символы в соответственно левом верхнем и правом нижнем квадратах становятся вершинами прямоугольника.
В противоположных по горизонтали от этих символов ячейках квадрата открытого текста лежат символы шифрованного текста.
Дешифрование обратно шифрованию, зашифрованные символы формируют две вершины прямоугольника, левый символ пары – в правом верхнем квадрате, правый – в левом нижнем. Расшифрованные символы находятся противоположно по горизонтали.
Для иллюстрации шифрования пары символов на рис. 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 – координаты четного по порядку символа исходного текста в матрице, относящейся к правому нижнему квадрату, i, j и 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 – координаты четного по порядку символа зашифрованного текста в матрице, относящейся к правому нижнему квадрату, i, j и 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];
КонецЦикла;
Результат возвращается:
Возврат Результат;
КонецФункции
Процедура ПечатьДвумерногоМассива(массив) сообщает пользователю содержимое двумерного массива. В переменной Результат находится результат, вначале равный пустой строке, i, j – счетчики циклов:
Процедура ПечатьДвумерногоМассива(массив)
Перем Результат;
Перем 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С, с другой стороны, может быть в некоторых случаях использован для целей компьютерной безопасности.
- Жельников В. Криптография от папируса до компьютера / В. Жельников. – М.: ABF, 1996. – 335 с. ISBN 5-87484-054-0.
- Four-square cipher // Wikipedia. URL: https://en.wikipedia.org/wiki/Four-square_cipher (дата обращения: 29.08.2018).
- Шифр четырех квадратов // Википедия. URL: https://ru.wikipedia.org/wiki/Шифр_четырех_квадратов (дата обращения: 29.08.2018).
- Ткаченко К. Программная реализация энигмоподобной системы в среде 1С. // «Системный администратор», № 4, 2017 г. – С. 72-74. ISSN 1813-5579. URL: http://samag.ru/archive/article/3414 (дата обращения: 29.08.2018).
Ключевые слова: 1С, шифрование.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|