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

Модель XOR-шифрования

Реализуем очень базовый алгоритм симметричного шифрования XOR (гаммирование) и изучим процент ошибок.

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

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

Операция XOR (исключающее ИЛИ) осуществляет над входными битами следующую операцию:

a b XOR(a, b)
1 1 0
0 1 1
1 0 1
0 0 0

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

image.png

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

Если в промежуточном канале возникнут задержки передачи, сравнение Сообщения и Шифротекста в блоке Error Rate Calculation можно делать со смещением (см. настройки блока).

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

Модель можно запустить при помощи команд программного управления:

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

model_data = engee.run( "xor_cipher_model" );

Выведем количество ошибок расшифровки:

In [ ]:
print( "Количество ошибок расшифровки: ", Int32(model_data["Кол-во ошибок"].value[end]) )
Количество ошибок расшифровки: 0

Посмотрим, какие биты пришли после расшифровки:

In [ ]:
out_vector = collect(model_data["Расшифровка"]).value;
received_bytes = [ UInt8(evalpoly(2, reverse(out_vector[1+8*start:8*start+8]))) for start in 0:div(length(out_vector),8)-1 ]
Out[0]:
25-element Vector{UInt8}:
 0xd0
 0xa1
 0xd0
 0xbe
 0xd0
 0xbe
 0xd0
 0xb1
 0xd1
 0x89
 0xd0
 0xb5
 0xd0
 0xbd
 0xd0
 0xb8
 0xd0
 0xb5
 0xd0
 0xa1
 0xd0
 0xbe
 0xd0
 0xbe
 0xd0

Чтобы собрать Unicode-строку из байтов:

In [ ]:
String( received_bytes )
Out[0]:
"СообщениеСоо\xd0"

Мы получили на выходе то же сообщение, которе отправили на вход.

Результат работы модели можно изучать без скриптов, достаточно изучить информацию на панели Графики.

image.png

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

Заключение

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

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