替代密码模型
我们使用简单的替换(单声道密码)来实现加密模型。
任务说明
替代密码是现代加密系统的另一个基本块。 它的各种变体在古代(凯撒密码,简单替换的密码)和最现代算法的实现中被用作加密的下一阶段。
我们正在实现的密码被称为简单替换密码,其工作归结为创建一个加密表,其中明文的每个字母都接受密文的单个字母。 我们将只使用33个字符-西里尔字母字符的大写部分(包括字母 Ё).
我们将逐字符加密消息,使用替换表将每个字符替换为其相应的密文字符。
In [ ]:
using Random
原始信息的字母表由33个字符组成:
In [ ]:
print( collect(1:33) )
密码字母表必须包含所有这些字符,但以伪随机顺序。:
In [ ]:
target_order = shuffle( Xoshiro(1), 1:33 );
print( target_order )
要在相反的方向上使用此表,我们需要应用排序:
In [ ]:
print( sortperm( target_order ) )
请注意,在引用命令时 shuffle 每次我们用一定的数字初始化随机数发生器 1. 这允许我们不时地获得相同的值的伪随机排序顺序(对于加密块和解密块相同)。
此模型对消息进行加密和解密。
排列块
运作模式 Перестановки 和 Обратной перестановки 使用块创建 LookupTableND,为方便那些配备了一个面具与控制。
排列块的前侧反映了两件事:
*编号 Seed,我们用来初始化随机数生成器
*置换是直接的还是反向的
排列块的参数设置在其掩码的设置中。
启动模型
让我们使用软件管理工具运行模型:
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 )
In [ ]:
alphabet_dict = Dict( zip( 1:33, "абвгдеёжзиёклмнопрстуфхцчшщъыьэюя" ))
print( "Расшифрованное сообщение: ", join( [alphabet_dict[d] for d in received_message], "" ) )
由于该消息在本演示中以圆圈传递,因此我们得到了11个字母,这些字母可能比原始消息中的字符数多或少。
结论
我们已经使用一个简化的示例展示了替换密码的工作原理,其中消息作为数字数组发送,指示原始消息的每个字母在西里尔字母(小写)中的位置。 下一步是通过替换块中的代码来调整模型以逐字节发送消息。 Подстановка 和 Обратная подстановка.