Шифр Bifid¶
Этот пример реализует шифрование и дешифрование с использованием квадрата Полибия — классического метода шифрования, который использовался еще в Древней Греции. Квадрат Полибия представляет собой таблицу, в которой каждая буква алфавита сопоставляется с координатами (строка и столбец). В данном коде квадрат Полибия создается динамически на основе заданного ключа, а затем используется для шифрования и дешифрования сообщений.
Описание¶
Шифр Bifid -
это полиграфический шифр замещения, который был изобретен
Феликсом Деластеллом примерно в 1901 году. Для шифрования
сообщения используется квадрат Полибия размером 5 х 5
в сочетании
с транспозицией и фракционированием. Можно использовать любой
квадрат Полибия размером 5 х 5
, но,
поскольку в нем всего 25 ячеек и 26 букв (английского) алфавита, одна ячейка должна представлять две буквы - I и J,
что является обычным выбором.
Функция polybius(text)
¶
Эта функция создает квадрат Полибия на основе переданного текста (ключа).
polybius(text) = Char.(reshape(Int.(collect(text)), isqrt(length(text)), :)')
collect(text)
преобразует строкуtext
в массив символов.Int.(...)
преобразует каждый символ в его числовое представление (ASCII-код).reshape(...)
преобразует массив чисел в квадратную матрицу. Размерность матрицы определяется как квадратный корень из длины текста(isqrt(length(text)))
.Char.(...)
преобразует числа обратно в символы.
Функция encrypt(message, poly)
¶
Эта функция шифрует сообщение с использованием квадрата Полибия.
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)
находит его координаты (строка и столбец) в квадрате Полибия с помощьюfindall(==(c), poly)
. - Координаты объединяются в один массив чисел
(numbers)
, где сначала идут все номера строк, а затем все номера столбцов. - Числа группируются попарно, и для каждой пары находится соответствующий символ в квадрате Полибия.
- Результат возвращается в виде зашифрованной строки.
Функция 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)
.Числа группируются попарно, и для каждой пары находится соответствующий символ в квадрате Полибия.
Результат возвращается в виде расшифрованной строки.
Основной цикл¶
В цикле проверяются различные комбинации ключей и сообщений:
Ключ: "
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
Заключение¶
Этот пример демонстрирует, как можно использовать квадрат Полибия для шифрования и дешифрования сообщений, а также как адаптировать его для работы с различными алфавитами и символами.