Применение Bifid-шифра
Шифр 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
Заключение
Этот пример демонстрирует, как можно использовать квадрат Полибия для шифрования и дешифрования сообщений, а также как адаптировать его для работы с различными алфавитами и символами.