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

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

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

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

Перестановочный шифр, который мы реализуем, будет осуществлять побитовую перестановку каждого байта из входного сообщения. Если на вход придет символ 31 (00011111), то после применения таблицы перестановки [2, 1, 5, 8, 4, 6, 7, 3] мы получим зашифрованный символ 62 (00111110).

Модель с описанием этой задачи приведена ниже:

image.png

За блоками пермутации скрыты подсистемы, которые осуществляют

  • разложение входного символа на битовый массив (блок Integer to Bit Converter),
  • пермутацию бит при помощи блока (блок Permute Matrix),
  • формирование числа UInt8 из вектора битов (блок Bit to Integer Converter).

image.png

Число на лицевой стороне блока обозначает заданное значение для инициализации генератора случайных чисел. При изменении этого значения (поле Seed маски блока) порядок перестановки внутри элемента автоматически перезаписывается на заданный функцией shuffle порядок пермутации.

Запуск модели и анализ результатов

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

model_data = engee.run( "permutation_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 )
Отправленное сообщение: [31, 12, 19, 17, 16, 15, 6, 15, 20, 1, 31, 12, 19, 17, 16, 15, 6, 15, 20, 1, 31]
Шифротекст сообщение: [62, 36, 26, 24, 8, 54, 6, 54, 12, 16, 62, 36, 26, 24, 8, 54, 6, 54, 12, 16, 62]
Полученное сообщение: [31, 12, 19, 17, 16, 15, 6, 15, 20, 1, 31, 12, 19, 17, 16, 15, 6, 15, 20, 1, 31]

Декодируем сообщение:

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

Заключение

Мы создали еще один базовый блок для построения криптографических систем - простейший блок для прямой и "обратной" пермутации бит внутри символов сообщения.

Блоки, использованные в примере