Шифр Виженера использует простой метод многоалфавитной замены. Исторически он представляет собой последовательность из нескольких шифров Цезаря с различными значениями сдвига.

Для работы алгоритма фиксируется алфавит. В нашей модели используется русский алфавит, включающий 32 маленькие буквы (без буквы «ё») и символ пробела, который для наглядности обозначается знаком подчеркивания _. Всего в таком алфавите 33 символа.

Суть алгоритма:

В качестве ключа выбирается секретное слово. Буквы ключа переводятся в индексы алфавита (от 0 до 32) и циклически подставляются под исходный текст. Если ключ короче текста, он повторяется сначала столько раз, сколько нужно для полного покрытия сообщения.

Далее индексы символов исходного текста и индексы символов ключа попарно складываются по модулю, соответствующему размеру алфавита (в нашем случае – по модулю 33).

Математическая модель шифрования: C = (P + K) mod 33

Математическая модель расшифрования: P = (C - K + 33) mod 33

Где:

  • P – индекс символа исходного текста.
  • C – индекс символа зашифрованного текста.
  • K – индекс символа ключа.

При расшифровании операции производятся в обратном порядке: из индексов шифртекста вычитаются индексы ключа. Если в процессе вычитания получается отрицательное число, к нему прибавляется размер алфавита (33), чтобы вернуть индекс в положительный диапазон.

Ниже представлен чистый код на языке Python, демонстрирующий работу шифра Виженера для зашифрования и расшифрования строки с учетом зафиксированного алфавита: