Engee 文档
Notebook

置换密码模式

让我们来实现一个改变输入信息中字符位顺序的置换密码模型。

问题描述

我们要实现的置换密码将对输入信息的每个字节进行逐位置换。如果输入的字符是 3100011111 ),那么在应用[2, 1, 5, 8, 4, 6, 7, 3] 的置换表后,我们将得到加密字符 6200111110 )。

下面给出了描述这项任务的模型:

image.png

置换块背后是隐藏的子系统,这些子系统执行以下功能

  • 将输入符号分解成比特数组 (blockInteger 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], "" ) )
Расшифрованное сообщение: экспонентаэкспонентаэ

结论

我们创建了另一个用于构建密码系统的基本模块--用于对信息符号中的比特进行正向和 "反向 "排列的最简单模块。