置换密码模型
我们实现了一个置换密码模型,它改变了输入消息字符中的位顺序。
任务说明
我们正在实现的排列密码将对输入消息中的每个字节执行按位排列。 如果符号来到输入31 (00011111),然后在应用置换表之后 [2, 1, 5, 8, 4, 6, 7, 3] 我们将得到一个加密字符。 62 (00111110).
下面给出了描述此任务的模型。:
隐藏在排列块后面的是执行
*将输入符号分解为位数组(块 Integer to Bit Converter),
*使用块(块)排列位 Permute Matrix),
*从一个比特向量(块)形成一个UInt8数字 Bit to Integer Converter).
块前面的数字表示用于初始化随机数生成器的设定值。 更改此值时(字段 Seed block masks)元素内部的排列顺序自动复盖为函数设置的顺序 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], "" ) )
结论
我们创建了另一个用于构建加密系统的基本块–最简单的块,用于消息字符内的直接和"反向"位排列。