双歧密码
本示例使用古希腊使用的经典加密方法Polybius square实现加密和解密。 Polybius正方形是一个表格,其中字母表的每个字母都映射到坐标(行和列)。 在此代码中,Polybius平方基于给定密钥动态创建,然后用于加密和解密消息。
资料描述
[双歧密码][1]
是一种发明的多边形替代密码
费利克斯*德拉斯特尔在1901年左右。
[Polybius square][2]大小用于加密消息。 5 х 5 合并后
用换位和分馏。 任何
可使用Polybius〇。 5 х 5 但是
由于它只有25个单元格和(英文)字母表的26个字母,因此一个单元格应该代表两个字母-I和J,
这是一个常见的选择。
[1]:https://en.wikipedia.org/wiki/Bifid_cipher
[2]:https://ru.wikipedia.org/wiki/Square_Polybius
功能 polybius(text)
此函数根据传输的文本(键)创建一个Polybius正方形。
polybius(text) = Char.(reshape(Int.(collect(text)), isqrt(length(text)), :)')
collect(text)转换字符串text成字符数组。Int.(...)将每个字符转换为其数字表示形式(ASCII码)。reshape(...)将数字数组转换为方阵。
矩阵的维数定义为长度的平方根
的文本(isqrt(length(text))).Char.(...)将数字转换回字符。
功能 encrypt(message, poly)
此函数使用Polybius平方对消息进行加密。
function encrypt(message, poly)
positions = [findall(==(c), poly)[1] for c in message]
numbers = vcat([c[1] for c in positions], [c[2] for c in positions])
return String([poly[numbers[i], numbers[i+1]] for i in 1:2:length(numbers)-1])
end
*对于消息中的每个字符 (message) 找到它的
坐标(行和列)在Polybius广场使用
findall(==(c), poly).
*坐标组合成一个数字数组 (numbers),
其中所有行号先去,然后是所有列号。
*数字是成对分组的,每对有
相应的符号在Polybius正方形中。
*结果作为加密字符串返回。
功能 decrypt(message, poly)
此函数解密用正方形加密的消息。
波利比乌斯。
function decrypt(message, poly)
n = length(message)
positions = [findall(==(c), poly)[1] for c in message]
numbers = reduce(vcat, [[c[1], c[2]] for c in positions])
return String([poly[numbers[i], numbers[i+n]] for i in 1:n])
end
*对于加密消息中的每个字符,找到它
在波利比乌斯广场的坐标。
*坐标组合成一个数字数组 (numbers).
*数字是成对分组的,每对有
相应的符号在Polybius正方形中。
*结果作为解密字符串返回。
主要周期
在循环中检查键和消息的各种组合。:
*关键:"ABCDEFGHIKLMNOPQRSTUVWXYZ",留言:"ILOVEENGEE".
*关键:"BGWKZQPNDSIOAXEFCLUMTHYVR",留言:"EXPONENTA".
*键:扩展字母(包括空格,数字和符号),
信息:"Engee is the best environment for model based developement."
for (key, text) in [("ABCDEFGHIKLMNOPQRSTUVWXYZ", "ILOVEENGEE"), ("BGWKZQPNDSIOAXEFCLUMTHYVR", "EXPONENTA"),
([' '; '.'; 'A':'Z'; 'a':'z'; '0':'9'], "Engee is the best environment for model based design.")]
poly = polybius(key)
encrypted = encrypt(text, poly)
decrypted = decrypt(encrypted, poly)
println("Using polybius:")
display(poly)
println("\n Сообщение: $text\n
Зашифрованное: $encrypted\n
Дешифрованное: $decrypted\n\n")
end
结论
此示例演示如何使用Polybius square加密和解密消息,以及如何调整它以使用不同的字母和符号。