novoevmire.biz
Другое

Шифр Виженера. Разбор алгоритма на Python / Хабрахабр

Несмотря на то что шифр многократно перерабатывался, впервые его описал Джован Баттиста Беллазо в 1553 году. Впоследствии он получил имя французского дипломата Блеза Виженера. Данный вариант достаточно прост для реализации и понимания, поскольку он является наиболее доступным методом криптоанализа.

Описание метода

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

Для того чтобы лучше понять суть данного метода, рассмотрим шифрование текста на примере слова ATTACKATDAWN. Лицо, которое посылает текст, записывает ключевое слово «LEMON» до того момента, пока оно не будет соответствовать длине переданного текста. Ключевое слово будет иметь вид LEMONLEMONLE. Первый символ заданного текста — А — зашифрован последовательностью L, являющейся первым символом ключа. Данный символ располагается на пересечении строки L и столбца A. Для следующего символа заданного текста применяется второй символ ключа. Поэтому второй символ закодированного текста будет иметь вид X. Он получился в результате пересечения строки E и столбца T. Другие части заданного текста шифруются аналогичным способом. В результате получается слово LXFOPVEFRNHR.

Процесс расшифрования

Расшифрование слова осуществляется с помощью таблицы Виженера. Необходимо найти строку, которая соответствует первому символу ключевого слова. Строка будет содержать первый символ зашифрованного текста.

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

Важные советы

Предоставляя зашифрованный текст, необходимо задать ключевое слово. Оно понадобится для того, чтобы расшифровать код с помощью русского шифра Виженера в том числе. Для того чтобы убедиться в правильности кодировки, лучше дважды проверить текст. Если текст будет неправильно закодирован, его невозможно правильно расшифровать.

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

Предупреждение к методу

Шифр Виженера, как и многие другие, не является надежным, поскольку его легко взломать. Если есть необходимость передать секретную информацию, не нужно прибегать к использованию данного метода. Для таких целей разработаны другие методы. Шифр Виженера является одним из самых старых и популярных методов шифрования.

В качестве ключа выступает специальная фраза. Она несколько раз повторяется и пишется над шифруемым текстом. В результате каждая буква посылаемого сообщения сдвигается относительно заданного текста на определенное число, которое задается буквой ключевой фразы. На протяжении нескольких веков данный метод устойчиво занимал позицию самого надежного метода шифрования. В 19 веке отмечены первые попытки взлома шифра Виженера, которые основывались на определении длины ключевой фразы. Если известна ее длина, то текст можно разбить на определенные фрагменты, которые кодируются одним и тем же сдвигом.

Дополнительные методы расшифровки

Раскрыть исходное сообщение можно с помощью метода частотного анализа, если заданный текст достаточно длинный. Разгадка шифра во многом сводится к поиску длины ключевой фразы. Существуют два основных метода, которые позволяют определить длину ключевой фразы. Первый метод раскодирования шифра Виженера разработал Фридрих Касицкий. В основе данного метода лежит поиск биграмм. Его суть заключается в том, что если в закодированном сообщении повторяется одна и та же биграмма на расстоянии, которое кратно длине ключевой фразы, то существует большая доля вероятности, что она встретится на тех же позициях в зашифрованном тексте. Если найти данное расстояние, получить его делители, можно получить набор определенных чисел. Именно они и будут составлять длину ключевой фразы. Однако данный метод требует некоторой доли везения. В большом закодированном тексте можно найти случайные биграммы, что значительно усложнит процесс расшифровки.

Второй метод по расшифровке текста предложил Фридман. Его суть заключается в циклическом сдвиге закодированного сообщения. Полученный текст записывается под оригинальным зашифрованным текстом и подсчитывается количество совпавших букв в нижней и верхней строке. Полученные числа позволяют вычислить так называемый индекс совпадений. Он определяется соотношением совпадений к общей длине сообщения. Индекс совпадения для русских текстов составляет примерно 6%. Однако для случайных текстов данный индекс составляет приблизительно 3 или 1/32. Метод Фридмана основывается на данном факте. Закодированный текст записывается со сдвигом в 1,2,3 и т.д. позиций. Затем для каждого сдвига необходимо вычислить индекс совпадений. Таким образом, необходимо произвести циклический сдвиг всего сообщения. При сдвигании индекса на определенное количество символов его длина может резко увеличиться. Это говорит о том, что длина ключевого слова может приравниваться к определенному числу. Если происходит ситуация, при которой все символы сдвигаются на одну и ту же позицию, индекс совпадения будет иметь такое же значение, как и исходный текст. Если вычисляется индекс для шифра Виженера, в любом случае происходит сравнение фактически случайного текста.

Проведение анализа частоты

Если результат процесса дешифровки оказался положительным, можно вписывать текст в столбцы. Столбцы формируются на базе исходного текста. Касицкий изобрел наиболее усовершенствованную форму текста. Однако средства данного метода невозможно применять в том случае, если решетка уходит от стандартной последовательности букв в алфавите. Поэтому данный метод позволяет узнать длину ключей лишь в частных случаях.

История

Первое точное документированное описание многоалфавитного шифра было сформулированно Леоном Баттиста Альберти в 1467 году, для переключения между алфавитами использовался металлический шифровальный диск. Система Альберти переключает алфавиты после нескольких зашифрованных слов. Позднее, в 1518 году, Иоганн Трисемус в своей работе «Полиграфия» изобрел tabula recta — центральный компонент шифра Виженера.

То, что сейчас известно под шифром Виженера, впервые описал Джованни Батиста Беллазо в своей книге La cifra del. Sig. Giovan Battista Bellasо. Он использовал идею tabula recta Трисемуса, но добавил ключ для переключения алфавитов шифра через каждую букву.

Блез Виженер представил своё описание простого, но стойкого шифра перед комиссией Генриха III во Франции в 1586 году, и позднее изобретение шифра было присвоено именно ему. Давид Кан в своей книге «Взломщики кодов» отозвался об этом осуждающе, написав, что история «проигнорировала важный факт и назвала шифр именем Виженера, несмотря на то, что он ничего не сделал для его создания».

Шифр Виженера имел репутацию исключительно стойкого к «ручному» взлому. Известный писатель и математик Чарльз Лютвидж Доджсон (Льюис Кэрролл) назвал шифр Виженера невзламываемым в своей статье «Алфавитный шифр» англ. The Alphabet Cipher, опубликованной в детском журнале в 1868 году. В 1917 году Scientific American также отозвался о шифре Виженера, как о неподдающемся взлому. Это представление было опровергнуто после того, как Касиски полностью взломал шифр в XIX веке, хотя известны случаи взлома этого шифра некоторыми опытными криптоаналитиками ещё в XVI веке.

Шифр Виженера достаточно прост для использования в полевых условиях, особенно если применяются шифровальные диски. Например, «конфедераты» использовали медный шифровальный диск для шифра Виженера в ходе Гражданской войны. Послания Конфедерации были далеки от секретных, и их противники регулярно взламывали сообщения. Во время войны командование Конфедерации полагалось на три ключевых словосочетания: «Manchester Bluff», «Complete Victory» и — так как война подходила к концу — «Come Retribution».

Гилберт Вернам попытался улучшить взломанный шифр (он получил название шифр Вернама-Виженера в 1918 году), но, несмотря на его усовершенствования, шифр так и остался уязвимым к криптоанализу. Однако работа Вернама в конечном итоге всё же привела к получению шифра, который действительно невозможно взломать.

Описание

В шифре Цезаря каждая буква алфавита сдвигается на несколько строк; например в шифре Цезаря при сдвиге +3, A стало бы D, B стало бы E и так далее. Шифр Виженера состоит из последовательности нескольких шифров Цезаря с различными значениями сдвига. Для зашифровывания может использоваться таблица алфавитов, называемая tabula recta или квадрат (таблица) Виженера. Применительно к латинскому алфавиту таблица Виженера составляется из строк по 26 символов, причём каждая следующая строка сдвигается на несколько позиций. Таким образом, в таблице получается 26 различных шифров Цезаря. На разных этапах кодировки шифр Виженера использует различные алфавиты из этой таблицы. На каждом этапе шифрования используются различные алфавиты, выбираемые в зависимости от символа ключевого слова. Например, предположим, что исходный текст имеет вид:

 ATTACKATDAWN 

Человек, посылающий сообщение, записывает ключевое слово («LEMON») циклически до тех пор, пока его длина не будет соответствовать длине исходного текста:

 LEMONLEMONLE 

Первый символ исходного текста A зашифрован последовательностью L, которая является первым символом ключа. Первый символ L шифрованного текста находится на пересечении строки L и столбца A в таблице Виженера. Точно так же для второго символа исходного текста используется второй символ ключа; то есть второй символ шифрованного текста X получается на пересечении строки E и столбца T. Остальная часть исходного текста шифруется подобным способом.

 Исходный текст: ATTACKATDAWN Ключ: LEMONLEMONLE Зашифрованный текст: LXFOPVEFRNHR 

Расшифровывание производится следующим образом: находим в таблице Виженера строку, соответствующую первому символу ключевого слова; в данной строке находим первый символ зашифрованного текста. Столбец, в котором находится данный символ, соответствует первому символу исходного текста. Следующие символы зашифрованного текста расшифровываются подобным образом.

Если буквы A-Z соответствуют числам 0-25, то шифрование Виженера можно записать в виде формулы:

C_i \equiv (P_i + K_i) \mod\ 26

Расшифровка:

P_i \equiv (C_i - K_i + 26) \mod\ 26

Криптоанализ

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

  1. Поиск длины ключа. Можно анализировать распределение частот в зашифрованном тексте с различным прореживанием. То есть брать текст, включающий каждую 2-ю букву зашифрованного текста, потом каждую 3-ю и т. д. Как только распределение частот букв будет сильно отличаться от равномерного (например, по энтропии), то можно говорить о найденной длине ключа.
  2. Криптоанализ. Совокупность l шифров Цезаря (где l — найденная длина ключа), которые по отдельности легко взламываются.

Тесты Фридмана и Касиски могут помочь определить длину ключа.

Метод Касиски

В 1863 году Фридрих Касиски был первым, кто опубликовал успешный алгоритм атаки на шифр Виженера, хотя Чарльз Беббидж разработал этот алгоритм уже в 1854 году. В то время когда Беббидж занимался взломом шифра Виженера, John Hall Brock Thwaites представил новый шифр в «Journal of the Society of the Arts»; когда Беббидж показал, что шифр Thwaites’а является лишь частным случаем шифра Виженера, Thwaites предложил ему его взломать. Беббидж расшифровал текст, который оказался поэмой «The Vision of Sin» Альфреда Теннисона, зашифрованной ключевым словом Emily — именем жены поэта.

Тест Касиски опирается на то, что некоторые слова, такие как «the» могут быть зашифрованы одинаковыми символами, что приводит к повторению групп символов в зашифрованном тексте. Например: сообщение, зашифрованное ключом ABCDEF , не всегда одинаково зашифрует слово «crypto»:

 Ключ: ABCDEF AB CDEFA BCD EFABCDEFABCD Исходный текст: CRYPTO IS SHORT FOR CRYPTOGRAPHY Шифрованный текст: CSASXT IT UKSWT GQU GWYQVRKWAQJB 

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

 Ключ: ABCDAB CD ABCDA BCD ABCDABCDABCD Исходный текст: CRYPTO IS SHORT FOR CRYPTOGRAPHY Шифрованный текст: CSASTP KV SIQUT GQU CSASTPIUAQJB 

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

 Шифрованный текст: DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD 

Расстояние между повторяющимися DYDUXRMH равно 18, это позволяет сделать вывод, что длина ключа равна одному из значений: 18,9,6,3 или 2. Расстояние между повторяющимися NQD равно 20. Из этого следует, что длина ключа равна 20 или 10, или 5, или 4 или 2. Сравнивая возможные длины ключей, можно сделать вывод, что длина ключа (почти наверняка) равна 2.

Тест Фридмана

Тест Фридмана (иногда называемый каппа-тест) был изобретен Вильямом Фридманом в 1920 году. Фридман использовал индекс совпадения, который измеряет частоты повторения символов, чтобы взломать шифр. Зная вероятность \kappa_p того, что два случайно выбранных символа текста совпадают (примерно 0,067 для англ. языка) и вероятность совпадения двух случайно выбранных символов алфавита \kappa_r (примерно 1 / 26 = 0,0385 для англ. языка), можно оценить длину ключа как:

{\kappa_p-\kappa_r}\over{\kappa_o-\kappa_r}

Из наблюдения за частотой совпадения следует:

\kappa_o=\frac{\sum_{i=1}^{c}n_i(n_i -1)}{N(N-1)}

Где С — размер алфавита (26 символов для англ. языка), N — длина текста, и n_1 до n_c — наблюдаемые частоты повторения символов зашифрованного текста. Однако, это только приблизительное значение, точность которого увеличивается при большем размере текста. На практике это было бы необходимо для перебора различных ключей приближаясь к исходному.

Частотный анализ

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

Варианты

Вариант running key (бегущий ключ) шифра Виженера когда-то был невзламываемым. Эта версия использует в качестве ключа блок текста, равный по длине исходному тексту. Так как ключ равен по длине сообщению, то методы предложенные Фридманом и Касиски не работают (так как ключ не повторяется). В 1920 году Фридман первым обнаружил недостатки этого варианта. Проблема с running key шифра Виженера состоит в том, что криптоаналитик имеет статистическую информацию о ключе (учитывая, что блок текста написан на известном языке) и эта информация будет отражаться в шифрованном тексте. Если ключ действительно случайный, его длина равна длине сообщения и он использовался единожды, то шифр Виженера теоретически будет невзламываемым.

Виженер фактически изобрёл более стойкий шифр — шифр с автоключом. Несмотря на это, «шифр Виженера» ассоциируется с более простым многоалфавитным шифром. Фактически эти два шифра часто путали, называя их le chiffre indechiffrable. Беббидж фактически взломал более стойкий шифр с автоключом, в то время когда Касиски издал первое решение взлома многоалфавитного шифра с фиксированным ключом. Метод Виженера зашифровки и расшифровки сообщений иногда относится к «варианту Битфорда». Его отличие от шифра Битфорда, изобретенного сэром Френсисом Битфордом, который, тем не менее, подобен шифру Виженера, заключается в использовании немного измененного механизма шифрования и таблиц.

Несмотря на очевидную стойкость шифра Виженера, он широко не использовался в Европе. Большее распространение получил шифр Гронсфилда, созданный графом Гронсфилдом, идентичный шифру Виженера, за исключением того, что он использовал только 10 различных алфавитов (соответствующих цифрам от 0 до 9). Преимущество шифра Гронсфилда состоит в том, что в качестве ключа используется не слово, а недостаток — в небольшом количестве алфавитов. Шифр Гронсфилда широко использовался по всей Германии и Европе, несмотря на его недостатки.

Шифр Виженера — метод полиалфавитного шифрования буквенного текста с использованием ключевого слова.


В шифре Цезаря каждая буква алфавита сдвигается на несколько позиций; например в шифре Цезаря при сдвиге +3, A стало бы D, B стало бы E и так далее. Шифр Виженера состоит из последовательности нескольких шифров Цезаря с различными значениями сдвига. Для зашифровывания может использоваться таблица алфавитов, называемая tabula recta или квадрат (таблица) Виженера. Применительно к латинскому алфавиту таблица Виженера составляется из строк по 26 символов, причём каждая следующая строка сдвигается на несколько позиций. Таким образом, в таблице получается 26 различных шифров Цезаря. На каждом этапе шифрования используются различные алфавиты, выбираемые в зависимости от символа ключевого слова.

Квадрат Виженера

Например, предположим, что исходный текст имеет вид:

ATTACKATDAWN 

Человек, посылающий сообщение, записывает ключевое слово («LEMON») циклически до тех пор, пока его длина не будет соответствовать длине исходного текста:

LEMONLEMONLE 

Первый символ исходного текста A зашифрован последовательностью L, которая является первым символом ключа. Первый символ L шифрованного текста находится на пересечении строки L и столбца A в таблице Виженера. Точно так же для второго символа исходного текста используется второй символ ключа; то есть второй символ шифрованного текста X получается на пересечении строки E и столбца T. Остальная часть исходного текста шифруется подобным способом.

Исходный текст: ATTACKATDAWN  Ключ: LEMONLEMONLE  Зашифрованный текст: LXFOPVEFRNHR 

Криптоанализ шифра может быть построен в два этапа:

  1. Поиск длины ключа. Можно анализировать распределение частот в зашифрованном тексте с различным прореживанием. То есть брать текст, включающий каждую 2-ю букву зашифрованного текста, потом каждую 3-ю и т. д. Как только распределение частот букв будет сильно отличаться от равномерного (например, по энтропии), то можно говорить о найденной длине ключа.
  2. Криптоанализ. Совокупность l шифров Цезаря (где l — найденная длина ключа), которые по отдельности легко взламываются.

Задание:

Необходимо расшифровать данный текст:

LoatuvftYejeerzAgibeejwzriyazfrkknxefvoxvhanvmsxlizyjzhnxmvhnjwyhnonafjgmiunfrbjxnzrrgfkgearfywv.Bnotfrqgwesiprqzbvotvvgomcumozbklszuqzsypizhslbjtmkngrzggdgpccwkwsiireqk,tsceycoyvuztveu-kwgktrtvthlugvvgggdonafjgmibengdxhaihrj.HnxUtiivfybte’scfgomiunvehnxngtvfbgeutiivfybterneyoggypefjoweyprigatsovrvjowetcrkcomsgcuzsbxmkngj,ovhsotvmsofamenergiaysvfblhrkxpvzrxnie:FWsjNwgsnnoxwejtuv5hnilgcrzbzaeGnalorBnjecvbjxnzNnkwugarUazjkksotlIotditgf.JTkwUkqhzdybtygerrattksjzhnxsyeakwgesqiycgzhgovrkvkfaiozgszbtovrrrbtnzatvknxnotpfakltugrkhogggjbs.HnxktojcsjzegcdlwxxdgtFWsjNetaocsymhkmgfpuedrysrqkmhkdrdotwsgnqtvgelkntvguytne21fkqkgtarlrgcxlrafkcihnzrvsizxtutuvrkoerocdstmoltuvzuvarcbdaagizy.

Решение:

Для быстрого и качественного решения используем программу Cryptools: Вставляем наш текст в созданное окно:

Выбираем вкладку Analysis > Symmetric encryption (classic) > Ciphertext-only > Vigenere

Далее программа находит длину ключа :

Жмём > Continue Далее находит сам ключ:

Жмём> Decrypt , и получаем расшифрованный текст:

Расшифрованный текст: SoutdernFederalUnivensityisamodernreoearchuniversitysithemphasisoninjovationsandentrapreneurship.Initoacademicactiviteesitcombinesstuzieswithfundamenpalandappliedsciance,aswellascutteng-edgetechnologeesandinnovativewpproaches.TheUnirersity’spositionenthenationalunirersityrankingspnovidespersuasivaevidencetoitsacdievements,apositeveimageandapasseonforexcellence:OFedUwasawardedtde5thplaceintheAnjualIndependentNwtionalUniversituRankings.SFedUeqqipsitsgraduatessithessentialskihlstogivethemacoipetitiveadvantacewhenitcomestogattingajob.TheknosledgeacquiredatOFedUenablesthempoboldlyfacethedamandsandchallencesofthe21stcenturuaswellastocontrebutetothedevelolmentofthelocalckmmunity.

Скачать программу можно здесь: https://www.cryptool.org/en/ct1-downloads


Шифрование

m = "ATTACKATDAWN" # исходное сообщение k = "LEMON" # ключ  k *= len(m) // len(k) + 1 # подгоняем ключ c = ''.join([chr((ord(j) + ord(k[i])) % 26 + ord('A')) for i, j in enumerate(m)]) # шифруем print(c) # LXFOPVEFRNHR 

Расшифровывание

c = "LXFOPVEFRNHR" # шифрованое сообщение k = "LEMON" # ключ  k *= len(c) // len(k) + 1 # подгоняем ключ m = ''.join([chr((ord(j) - ord(k[i])) % 26 + ord('A')) for i, j in enumerate(c)]) # расшифровываем print(m) # ATTACKATDAWN 

Еще по теме