Документация Engee
Notebook

Шифр Bifid

Этот пример реализует шифрование и дешифрование с использованием квадрата Полибия — классического метода шифрования, который использовался еще в Древней Греции. Квадрат Полибия представляет собой таблицу, в которой каждая буква алфавита сопоставляется с координатами (строка и столбец). В данном коде квадрат Полибия создается динамически на основе заданного ключа, а затем используется для шифрования и дешифрования сообщений.

Описание

Шифр Bifid - это полиграфический шифр замещения, который был изобретен Феликсом Деластеллом примерно в 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".

  • Ключ: "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.


Заключение

Этот пример демонстрирует, как можно использовать квадрат Полибия для шифрования и дешифрования сообщений, а также как адаптировать его для работы с различными алфавитами и символами.