Документация Engee
Notebook

Модель шифра подстановки

Реализуем модель шифрования при помощи простой замены (моноалфавитный шифр).

Описание задачи

Шифры подстановки - еще один базовый блок современных систем шифрования. Его различные варианты применялись как в античности (шифр Цезаря, шифр простой замены), так и внутри реализаций самых современных алгоритмов, в качестве очередного этапа шифрования.

Шифр, который мы реализуем, называется шифром простой замены, и его работа сводится к созданию таблицы шифрования, в которой для каждой буквы открытого текста принята единственная буква шифротекста. Мы будем использовать только 33 символа - прописную часть символов кириллического алфавита (включая букву Ё).

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

In [ ]:
using Random

Алфавит исходного сообщения состоит из 33 символов:

In [ ]:
print( collect(1:33) )
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]

Шифр-алфавит должен содержать все эти символы, но в псевдослучайном порядке:

In [ ]:
target_order = shuffle( Xoshiro(1), 1:33 );
print( target_order )
[16, 13, 10, 3, 2, 22, 26, 33, 5, 25, 31, 27, 14, 28, 7, 29, 30, 12, 11, 9, 23, 4, 17, 6, 20, 8, 24, 15, 21, 19, 1, 18, 32]

Чтобы использовать эту таблицу в обратном направлении, нам нужно будет применить сортировку:

In [ ]:
print( sortperm( target_order ) )
[31, 5, 4, 22, 9, 24, 15, 26, 20, 3, 19, 18, 2, 13, 28, 1, 23, 32, 30, 25, 29, 6, 21, 27, 10, 7, 12, 14, 16, 17, 11, 33, 8]

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

image.png

Такая модель осуществляет шифрование и расшифровку сообщения.

Блоки перестановки

Моделей операции Перестановки и Обратной перестановки созданы при помощи блоков LookupTableND, для удобства снабженных маской с элементами управления.

На лицевой стороне блока перестановки отражает две вещи:

  • число Seed, которым мы инициализируем генератор случайных чисел
  • является ли перестановка прямой или обратной

image.png

Параметры блока перестановки устанавливаются в настройках его маски.

Запуск модели

Запустим модель средствами программного управления:

In [ ]:
# Загрузим модель, если она еще не открыта на холсте
if "substitution_cipher_model"  getfield.(engee.get_all_models(), :name)
    engee.load( "$(@__DIR__)/substitution_cipher_model.engee");
end

model_data = engee.run( "substitution_cipher_model" );
In [ ]:
source_message = collect(model_data["Сообщение"]).value
cipher_text = Int.(collect(model_data["Шифротекст"]).value)
received_message = Int.(collect(model_data["Расшифровка"]).value)

println( "Отправленное сообщение: ", source_message )
println( "Зашифрованное сообщение: ", cipher_text )
println( "Полученное сообщение: ", received_message )
Отправленное сообщение: [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
Зашифрованное сообщение: [16, 13, 10, 3, 2, 16, 13, 10, 3, 2, 16]
Полученное сообщение: [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
In [ ]:
alphabet_dict = Dict( zip( 1:33, "абвгдеёжзиёклмнопрстуфхцчшщъыьэюя" ))
print( "Расшифрованное сообщение: ", join( [alphabet_dict[d] for d in received_message], "" ) )
Расшифрованное сообщение: абвгдабвгда

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

Заключение

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