Engee 文档
Notebook

双歧代码

该示例使用波里比乌斯方阵实现加密和解密,波里比乌斯方阵是一种自古希腊就开始使用的经典加密方法。波里比乌斯方阵是一个表格,其中每个字母都映射到坐标(行和列)。在该代码中,波里比乌斯方阵是根据给定密钥动态创建的,然后用于加密和解密信息。

说明

比菲德 密码是。 是一种多图形置换密码,由 费利克斯-德拉斯特尔(Felix Delastell)于 1901 年左右发明的。为了加密 它使用大小为5 х 5波里比乌斯正方形,并结合移位和分数法来加密信息。 换位和分式。任何 大小的波里比乌斯正方形5 х 5 ,但是、 由于它只有 25 个单元格和 26 个(英文)字母,一个单元格必须代表两个字母 I 和 J、 这是通常的选择。

功能polybius(text)

该函数根据传递的文本(键)创建一个波里比乌斯正方形。

In [ ]:
polybius(text) = Char.(reshape(Int.(collect(text)), isqrt(length(text)), :)')
Out[0]:
polybius (generic function with 1 method)

*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]:
encrypt (generic function with 1 method)
  • 对于信息中的每个字符,(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]:
decrypt (generic function with 1 method)
  • 对于加密信息中的每个字符,它都会在波里比乌斯平方中找到其 在波里比乌斯方格中的坐标。

  • 这些坐标被组合成一个数字数组(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
Using polybius:
5×5 Matrix{Char}:
 'A'  'B'  'C'  'D'  'E'
 'F'  'G'  'H'  'I'  'K'
 'L'  'M'  'N'  'O'  'P'
 'Q'  'R'  'S'  'T'  'U'
 'V'  'W'  'X'  'Y'  'Z'
    Сообщение: ILOVEENGEE
   
    Зашифрованное: HPAMAQQZMZ

    Дешифрованное: ILOVEENGEE


Using polybius:
5×5 Matrix{Char}:
 'B'  'G'  'W'  'K'  'Z'
 'Q'  'P'  'N'  'D'  'S'
 'I'  'O'  'A'  'X'  'E'
 'F'  'C'  'L'  'U'  'M'
 'T'  'H'  'Y'  'V'  'R'
    Сообщение: EXPONENTA
   
    Зашифрованное: ANNSECNYW

    Дешифрованное: EXPONENTA


Using polybius:
8×8 Matrix{Char}:
 ' '  '.'  'A'  'B'  'C'  'D'  'E'  'F'
 'G'  'H'  'I'  'J'  'K'  'L'  'M'  'N'
 'O'  'P'  'Q'  'R'  'S'  'T'  'U'  'V'
 'W'  'X'  'Y'  'Z'  'a'  'b'  'c'  'd'
 'e'  'f'  'g'  'h'  'i'  'j'  'k'  'l'
 'm'  'n'  'o'  'p'  'q'  'r'  's'  't'
 'u'  'v'  'w'  'x'  'y'  'z'  '0'  '1'
 '2'  '3'  '4'  '5'  '6'  '7'  '8'  '9'
    Сообщение: Engee is the best environment for model based design.
   
    Зашифрованное: DiejDiBjmjyrrjmjmraeZqWaqjEI Cu5 m1 HjP N.T VFDkFFEgH

    Дешифрованное: Engee is the best environment for model based design.


结论

本例演示了如何使用波里比乌斯平方来加密和解密信息,以及如何调整它以适用于不同的字母和符号。