Шифр Виженера использует простой метод многоалфавитной замены. Исторически он представляет собой последовательность из нескольких шифров Цезаря с различными значениями сдвига.
Для работы алгоритма фиксируется алфавит. В нашей модели используется русский алфавит, включающий 32 маленькие буквы (без буквы «ё») и символ пробела, который для наглядности обозначается знаком подчеркивания _. Всего в таком алфавите 33 символа.
Суть алгоритма:
В качестве ключа выбирается секретное слово. Буквы ключа переводятся в индексы алфавита (от 0 до 32) и циклически подставляются под исходный текст. Если ключ короче текста, он повторяется сначала столько раз, сколько нужно для полного покрытия сообщения.
Далее индексы символов исходного текста и индексы символов ключа попарно складываются по модулю, соответствующему размеру алфавита (в нашем случае – по модулю 33).
Математическая модель шифрования:
C = (P + K) mod 33
Математическая модель расшифрования:
P = (C - K + 33) mod 33
Где:
P– индекс символа исходного текста.C– индекс символа зашифрованного текста.K– индекс символа ключа.
При расшифровании операции производятся в обратном порядке: из индексов шифртекста вычитаются индексы ключа. Если в процессе вычитания получается отрицательное число, к нему прибавляется размер алфавита (33), чтобы вернуть индекс в положительный диапазон.
Ниже представлен чистый код на языке Python, демонстрирующий работу шифра Виженера для зашифрования и расшифрования строки с учетом зафиксированного алфавита: