Шифр Виженера

А также шифр Цезаря

1. Алгоритм шифра Виженера с примерами

Есть такой шифр - шифр Цезаря. Это частный случай аффинной системы подстановок. Суть шифра Цезаря - каждый символ текста заменяется на некоторый другой, причём одинаковые символы заменяются одинаково. Если данный символ - k-ый в N-символьном алфавите, то он заменяется (k + C) mod N - ым символом алфавита. Нумерация символов начинается с нуля - не очень привычно для не прогеров, но что поделать... Здесь C - ключ шифра.

Допустим, C = 2, алфавит русский. Зашифруем слово ЯМА. Буква Я имеет номер 32 (не 33, хотя мы не убивали букву Ё). (32 + 2) mod 33 = 1, то есть берём букву Б (внимание: буква А имеет нулевой номер). Буква М заменяется на то, что стоит в алфавите на две позиции справа. Для всех адекватных людей это буква О. Буква А заменяется, как уже можно было додуматься, на В. Болучается шифртекст БОВ. Хорошо, хоть не боров!

Другое дело, что вряд ли Цезарь додумался бы до такого примера, но он и прогать-то не умел. А также не знал нормального русского языка и компах ничего не понимал.

К чему эта вся ерунда? Зададимся вопросом. А что, если взять несколько ключей C и циклически их применять? Например, первый символ сдвигать на 1 позицию, второй вообще не сдвигать, третий сдвигать на 3, четвёртый - снова на 1, пятый не сдвигать. Ну и так далее, пока всё не зашифруем. То как раз-таки и будет шифр Виженера. Только обычно ключ задают не группой чисел (в только что выданном примере был бы набор {1, 0, 3}), а в виде слова. Вместо каждой C записывается символ, который стоит C-ым в алфавите (нумерация опять с нуля). То есть вместо {1, 0, 3} ключом мы пишем слово БАГ (А - символ номер 0, Б - 1, Г - 3). Итак, в шифре Виженера мы имеем дело с последовательностью сдвигов, циклически повторяющейся.

Теперь примерчик по шифру Виженера. Алфавит - русский. Пусть ключевым словом является БАГ (программисты меня поймут). Зашифруем слово ВЕДРО.
В сдвигаем на 1 позицию, получаем Г.
Е никуда не сдвигаем и вообще оставляем в покое.
Д сдвигаем на 3 позиции. Если не дискриминировать букву Ё, вместо Д будет Ж.
Р меняется на С - то есть следующую по алфавиту букву.
О остаётся на месте.
ВЕДРО превращается в ГЕЖСО.

Алфавит: АБВ...ЕЁЖ...Я
Открытый текстВЕДРО
Применение ключаБАГБА
Сдвиг10310
Шифрованный текстГЕЖСО


Такой ключ чисто для простоты примера, вообще не очень хорошо, когда ключ короткий, и при том часть букв ещё и не сдвигается. В приведённом примере по сути поочерёдно брались 3 правила цифра Цезаря. Другое дело, что этот фокус придумал явно не он, даже по названию шифра ясно.

Теперь покажем шифр Виженера на примере помудрёнее. Русский алфавит плюс пробел (34 символа в итоге), ключ БЕГ, шифруем текст МЫ ЗА РОДИНУ.

Алфавит: АБВ...ЕЁЖ...Я_
Открытый текстМЫ_ЗА_РОДИНУ
Применение ключаБЕГБЕГБЕГБЕГ
Сдвиг153153153153
Шифрованный текстН_ВИЕВСУЖЙТЦ


Сначала текущий символ ключа - Б (сдвиг 1), потому М сдвигаем на 1 и получаем Н. Потом берём символ ключа Е (сдвиг 5) и применяем к Ы (символ номер 28, если А считать нулевым), (28 + 5) mod 34 = 33, то есть получаем пробел. Теперь на очереди символ ключа Г (сдвиг 3), шифруем пробел (номер 33): (33 + 3) mod 34 = 2, то есть это В, ибо А имеет номер 0. Далее опять переходим к началу ключа, то есть Б (сдвиг 1). Шифруем З, меняя на следующую букву (так как сдвиг = 1). В итоге получаем И. И так далее.

Шифр Виженера тем сильнее, чем длиннее ключ, меньше в нём символов номер ноль, больше символов в алфавите.

Если все символы ключа одинаковые, то это совсем слабый ключ, а шифр Виженера вырождается в шифр Цезаря.

А как же расшифровывать? Если верно, что q = (k + C) mod N, то k = (q - C + N) mod N. Здесь k - номер текущего символа открытого текста в алфавите, С - текущий сдвиг из нашего ключевого набора, q - номер полученного символа шифртекста в алфавите, N - количество символов в алфавите, нумеруемом с нуля. И так для каждого символа.

А что делать, если в тексте есть пробелы? Или заменить их чем-то, или включить в алфавит. Так же можно сделать со всем знаками препинания.

2. Аналоги и частный случай шифра Виженера

Шифр Виженера во многом сходен с шифром Гронсфельда. При этом в шифре Гронсфельда каждый символ ключевого слова может принимать одно из 10 значений, так как ключ состоит из цифр. Поскольку широко известные алфавиты - русский, английский и т.д. - обычно состоят из нескольких десятков символов, шифр Виженера явно крепче товарища своего при одинаковом числе символов в ключе.