双歧代码¶
该示例使用波里比乌斯方阵实现加密和解密,波里比乌斯方阵是一种自古希腊就开始使用的经典加密方法。波里比乌斯方阵是一个表格,其中每个字母都映射到坐标(行和列)。在该代码中,波里比乌斯方阵是根据给定密钥动态创建的,然后用于加密和解密信息。
说明¶
功能polybius(text)
¶
该函数根据传递的文本(键)创建一个波里比乌斯正方形。
In [ ]:
polybius(text) = Char.(reshape(Int.(collect(text)), isqrt(length(text)), :)')
Out[0]:
*collect(text)
将字符串text
转换为字符数组。
*Int.(...)
将每个字符转换成数字表示(ASCII 码)。
*reshape(...)
将数字数组转换为方阵。
矩阵的维数定义为文本长度的平方根。
的平方根(isqrt(length(text)))
。
*Char.(...)
将数字转换回字符。
功能encrypt(message, poly)
¶
该函数使用波里比乌斯方阵加密信息。
In [ ]:
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
Out[0]:
- 对于信息中的每个字符,
(message)
。 中的坐标(行和列)。findall(==(c), poly)
. - 坐标被组合成一个数字数组
(numbers)
、 所有行号在前,所有列号在后。 - 将这些数字成对分组,并为每对数字找出 波里比乌斯方阵中的相应符号。
- 结果以加密字符串的形式返回。
函数decrypt(message, poly)
¶
该函数用于解密用 波里比乌斯
In [ ]:
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
Out[0]:
对于加密信息中的每个字符,它都会在波里比乌斯平方中找到其 在波里比乌斯方格中的坐标。
这些坐标被组合成一个数字数组
(numbers)
。数字成对组合,每对组合都有一个波里比乌斯方阵中的对应符号。 波里比乌斯方格中的相应符号。
结果以解码字符串的形式返回。
主循环¶
循环检查按键和信息的各种组合:
键:"
ABCDEFGHIKLMNOPQRSTUVWXYZ
",信息:"ILOVEENGEE
"。Key: "
BGWKZQPNDSIOAXEFCLUMTHYVR
", message: "EXPONENTA
".键:扩展字母表(包括空格、数字和符号)、 信息:"
Engee is the best environment for model based developement.
"。
In [ ]:
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
结论¶
本例演示了如何使用波里比乌斯平方来加密和解密信息,以及如何调整它以适用于不同的字母和符号。