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个字母,这些字母可能比原始消息中的字符数多或少。

结论

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

示例中使用的块