Engee 文档
Notebook

双歧密码

本示例使用古希腊使用的经典加密方法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正方形。

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)

此函数使用Polybius平方对消息进行加密。

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) 找到它的
坐标(行和列)在Polybius广场使用
findall(==(c), poly).
*坐标组合成一个数字数组 (numbers),
其中所有行号先去,然后是所有列号。
*数字是成对分组的,每对有
相应的符号在Polybius正方形中。
*结果作为加密字符串返回。

功能 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).

*数字是成对分组的,每对有
相应的符号在Polybius正方形中。

*结果作为解密字符串返回。

主要周期

在循环中检查键和消息的各种组合。:

*关键:"ABCDEFGHIKLMNOPQRSTUVWXYZ",留言:"ILOVEENGEE".

*关键:"BGWKZQPNDSIOAXEFCLUMTHYVR",留言:"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.


结论

此示例演示如何使用Polybius square加密和解密消息,以及如何调整它以使用不同的字母和符号。