置换密码模式¶
我们使用简单置换(单字母密码)实现加密模型。
问题描述¶
置换密码是现代加密系统的另一个基本组成部分。它的各种变体在古代(凯撒密码、简单替换密码)和最现代算法的实现中都有使用,是加密的下一阶段。
我们要实现的密码被称为简单替换密码,其操作可归结为创建一个加密表,假设明文的每个字母对应密文的一个字母。我们将只使用 33 个字符--西里尔字母的大写部分(包括字母
Ё
)。
我们将逐个字符加密信息,通过替换表用相应的密文字符替换每个字符。
原始信息的字母表由 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 个字母,可能比原始信息中的字符数多,也可能比原始信息中的字符数少。
结论¶
我们通过一个简化示例展示了置换密码的工作原理,即信息以数字数组的形式发送,代表原始信息中每个字母在西里尔字母表(小写)中的位置。下一步是调整模型,通过替换Подстановка
和Обратная подстановка
中的代码,逐字节发送信息。