置换密码模式¶
让我们来实现一个改变输入信息中字符位顺序的置换密码模型。
问题描述¶
我们要实现的置换密码将对输入信息的每个字节进行逐位置换。如果输入的字符是 31 (00011111
),那么在应用[2, 1, 5, 8, 4, 6, 7, 3]
的置换表后,我们将得到加密字符 62 (00111110
)。
下面给出了描述这项任务的模型:
置换块背后是隐藏的子系统,这些子系统执行以下功能
- 将输入符号分解成比特数组 (block
Integer to Bit Converter
)、 - 通过块(块
Permute Matrix
)对比特进行置换、 - 从位矢量生成 UInt8 数字(程序块
Bit to Integer Converter
)。
区块面上的数字表示初始化随机数发生器的设定值。当改变该值(数据块掩码的字段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 )
解码信息:
In [ ]:
alphabet_dict = Dict( zip( 1:33, "абвгдеёжзиёклмнопрстуфхцчшщъыьэюя" ))
print( "Расшифрованное сообщение: ", join( [alphabet_dict[d] for d in received_message], "" ) )
结论¶
我们创建了另一个用于构建密码系统的基本模块--用于对信息符号中的比特进行正向和 "反向 "排列的最简单模块。