Engee 文档
Notebook

置换密码模式

我们使用简单置换(单字母密码)实现加密模型。

问题描述

置换密码是现代加密系统的另一个基本组成部分。它的各种变体在古代(凯撒密码、简单替换密码)和最现代算法的实现中都有使用,是加密的下一阶段。

我们要实现的密码被称为简单替换密码,其操作可归结为创建一个加密表,假设明文的每个字母对应密文的一个字母。我们将只使用 33 个字符--西里尔字母的大写部分(包括字母Ё )。

我们将逐个字符加密信息,通过替换表用相应的密文字符替换每个字符。

原始信息的字母表由 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 个字母,可能比原始信息中的字符数多,也可能比原始信息中的字符数少。

结论

我们通过一个简化示例展示了置换密码的工作原理,即信息以数字数组的形式发送,代表原始信息中每个字母在西里尔字母表(小写)中的位置。下一步是调整模型,通过替换ПодстановкаОбратная подстановка 中的代码,逐字节发送信息。

示例中使用的块