Индекс совпадений
Индекс совпадений — один из методов криптоанализа шифра Виженера. Описание было опубликовано Уильямом Фридманом в 1920 году.
Метод основывается на вычислении вероятности того, что два случайных элемента текста совпадут. Эту вероятность называют индексом совпадений. Уильям Фридман показал, что значения индекса совпадений существенно отличаются для текстов различной природы. Это позволяет сначала определить длину ключа шифра, а затем найти и сам ключ.
Появление метода индекса совпадений открыло новые возможности в криптоанализе шифра Виженера. По сравнению с распространённым в то время методом Касиски, новый метод был менее трудоёмким, требовал меньшей длины текста, был более пригоден для автоматизации и менее подвержен ошибкам. Индекс совпадений являлся более эффективным и допускал анализ шифров с длинными ключами.
История
Блез Виженер представил описание простого, но стойкого шифра перед комиссией Генриха III во Франции в 1586 году, и позднее изобретение шифра было присвоено именно ему. Шифр Виженера имел репутацию исключительно стойкого к «ручному» взлому. Первая успешная атака на шифр Виженера была проведена Фридрихом Касиски в 1863 году. Его метод оставался основным методом криптоанализа шифра Виженера вплоть до 1920 года, когда Уильям Фридман опубликовал монографию «Индекс совпадения и его применение в криптоанализе» (англ. «Index of Coincidence and Its Applications in Cryptography»). Новый метод, описанный Фридманом, предлагал более эффективный и устойчивый к ошибкам способ определения длины ключа. Метод индекса совпадений получил широкое применение. Позднее он стал использоваться в криптоанализе с помощью машин.
Метод криптоанализа шифра Виженера
Шифр Виженера является полиалфавитным шифром. Его криптоанализ можно разбить на 2 этапа:
- Сначала пытаются определить длину ключа. Длина ключа задаёт количество используемых алфавитов и период шифрования этими алфавитами. Поэтому на этом этапе исследуется периодичность шифротекста;
- После того, как найдена длина, приступают к поиску конкретного вида ключа. Для этого вычисляют относительные сдвиги используемых алфавитов, а затем подбирают ключ перебором.
Индекс совпадений
Ниже приведены формулы для вычисления индекса совпадений. Сначала рассматривается общий случай. Потом рассматриваются несколько частных случаев, в которых индекс совпадений можно оценить без анализа текста.
Общий случай
Рассмотрим текст, написанный на некотором языке. Алфавит данного языка будем полагать состоящим из [math]\displaystyle{ n }[/math] символов. Рассмотрим достаточно длинную строку [math]\displaystyle{ \vec x }[/math] из [math]\displaystyle{ n }[/math] символов. Индексом совпадения называют вероятность совпадения двух произвольных символов в строке. Если [math]\displaystyle{ f_i }[/math] — количество [math]\displaystyle{ i }[/math]-го символа алфавита в строке [math]\displaystyle{ \vec x }[/math], то индекс совпадения вычисляется по формуле:
- [math]\displaystyle{ I \left( \vec x \right) = \sum\limits_{i=1}^m {\frac{f_i\left({f_i - 1}\right)}{{n\left( {n - 1} \right)}}} }[/math] [math]\displaystyle{ (1) }[/math]
Будем оценивать вероятность как отношение благоприятных исходов (количество пар одинаковых символов в строке) к общему числу исходов (количество различных пар символов в строке).
Количество различных пар [math]\displaystyle{ {\displaystyle i} }[/math]-ого символа в строке равно:
[math]\displaystyle{ {\displaystyle k_{i}=C_{f_{i}}^{2}={\frac {f_{i}\left({f_{i}-1}\right)}{2}}} }[/math]
Количество пар одинаковых символов в строке:
[math]\displaystyle{ {\displaystyle k=\sum _{i=1}^{m}k_{i}=\sum _{i=1}^{m}{\frac {f_{i}\left({f_{i}-1}\right)}{2}}} }[/math]
Число различных пар символов в строке:
[math]\displaystyle{ {\displaystyle K=C_{n}^{2}={\frac {n\left({n-1}\right)}{2}}} }[/math]
Отсюда получаем:
[math]\displaystyle{ {\displaystyle I\left({\vec {x}}\right)={\frac {k}{K}}=\sum \limits _{i=1}^{m}{\frac {f_{i}\left({f_{i}-1}\right)}{n\left({n-1}\right)}}} }[/math]
Открытый текст
Допустим, строка [math]\displaystyle{ \vec{x} }[/math] является открытым текстом либо получена из него простой перестановкой. В этом случае индекс совпадений удобно выразить через вероятности появления [math]\displaystyle{ i }[/math]-го символа. Обозначим их [math]\displaystyle{ p_i }[/math]. Тогда получим следующую формулу:
- [math]\displaystyle{ I \left( \vec x \right) = \sum\limits_{i=1}^m p_i^2 }[/math] [math]\displaystyle{ (2) }[/math]
Т.к. величины [math]\displaystyle{ p_i }[/math] имеют вполне определённые значения, то для открытого текста индекс совпадений не зависит от его содержания, а зависит только от языка, на котором написан текст. Более того, значения [math]\displaystyle{ p_i }[/math] исследованы и известны, что позволяет рассчитать значения индекса совпадений открытого текста для различных языков.
Язык | Индекс совпадений |
---|---|
русский | 0.0553[1] |
английский | 0.0644[1] 0.0667[2] |
итальянский | 0.0738[2] |
испанский | 0.0775[2] |
немецкий | 0.0762[2] |
французский | 0.0778[2] |
ведийский санскрит | 0.021076696 |
пракрит | 0.046635758 |
классический санскрит | 0.045567736 |
хинди | 0.041837864 |
урду | 0.057535302 |
Случайная строка
Наконец, пусть [math]\displaystyle{ \vec{x} }[/math] — случайная строка. Тогда вероятность появления каждого символа равна
- [math]\displaystyle{ p_i = \frac{1}{m} }[/math]
Используя формулу [math]\displaystyle{ (2) }[/math], получим:
- [math]\displaystyle{ I \left( \vec x \right) = \sum_{i=1}^m {1 \over m^2} = {1 \over m} }[/math] [math]\displaystyle{ (3) }[/math]
Этой формулой можно пользоваться для оценки индекса совпадений полиалфавитного шифра. Для английского языка индекс совпадений полиалфавитного шифра составит 0,03846, для русского (без буквы «ё») — 0,03125.
Значения индекса совпадений для открытого текста и для полиалфавитного шифра существенно различаются. Это позволяет, зная индекс совпадений, определить, получен ли текст из открытого простой перестановкой, или является полиалфавитным шифром.
Взаимный индекс совпадений
Ещё одним важным понятием является взаимный индекс совпадений.
Общий случай
Рассмотрим две строки [math]\displaystyle{ \vec x }[/math] и [math]\displaystyle{ \vec y }[/math] с длинами [math]\displaystyle{ n }[/math] и [math]\displaystyle{ n' }[/math] соответственно. Алфавит, как и прежде, состоит из [math]\displaystyle{ m }[/math] символов. Взаимным индексом совпадений этих строк называют вероятность того, что символ, случайно выбранный из первой строки, совпадёт со случайно выбранным символом второй строки. Пусть [math]\displaystyle{ f_i, g_i }[/math] — количество [math]\displaystyle{ i }[/math]-го символа алфавита в первой и второй строках соответственно. Тогда взаимный индекс совпадений будет равен:
- [math]\displaystyle{ MI\left( {\vec x,\vec y} \right) = {{\sum\limits_{i=1}^m \frac{f_i g_i }{nn'} }} }[/math] [math]\displaystyle{ (4) }[/math]
Доказательство данной формулы аналогично доказательству формулы [math]\displaystyle{ (1) }[/math].
Строки со сдвигом
Практически важным для метода индекса совпадений является частный случай, когда обе строки получены сдвигом алфавита открытого текста. Обозначим [math]\displaystyle{ p_i }[/math] — вероятности появления [math]\displaystyle{ i }[/math]-го символа в строке [math]\displaystyle{ \vec x }[/math], [math]\displaystyle{ s }[/math] — сдвиг алфавита строки [math]\displaystyle{ \vec y }[/math] относительно алфавита строки [math]\displaystyle{ \vec x }[/math] (влево). Тогда вероятности появление [math]\displaystyle{ i }[/math]-го символа алфавита в строке [math]\displaystyle{ \vec y }[/math] равны [math]\displaystyle{ p_{i+s} }[/math] (используется нумерация алфавита строки [math]\displaystyle{ \vec x }[/math]). Для взаимного индекса совпадений получаем следующую формулу:
- [math]\displaystyle{ MI\left( {\vec x ,\vec y } \right) = \sum\limits_{i=1}^m {p_i p_{i+s } } }[/math] [math]\displaystyle{ (5) }[/math]
Заметим, что т.к. сдвиг циклический, то
- [math]\displaystyle{ \sum\limits_{i=1}^m {p_i p_{i+s } } = \sum\limits_{i=1}^m {p_{i-s } p_i } = \sum\limits_{i=1}^m {p_{i+m-s } p_i } }[/math]
и взаимный индекс совпадений для сдвигов [math]\displaystyle{ s }[/math] и [math]\displaystyle{ m-s }[/math] принимает одно и то же значение.
Ниже приведены значения взаимного индекса совпадений в зависимости от сдвига для русского и английского языков. Значения приведены для сдвигов от [math]\displaystyle{ 0 }[/math] до [math]\displaystyle{ m/2 }[/math]. Как упоминалось выше, на основе этих значений взаимный индекс совпадений может быть вычислен для любого сдвига.
Для русского языка:
|
Для английского языка:
|
Отметим, что при нулевом сдвиге взаимный индекс совпадений заметно больше, чем при ненулевых сдвигах. А значит, по известному значению взаимного индекса совпадений можно сделать вывод, является сдвиг алфавитов строк нулевым, или нет.
Алгоритм нахождения длины ключа
Разобьём текст [math]\displaystyle{ x_1 }[/math] [math]\displaystyle{ x_2 }[/math] [math]\displaystyle{ ... }[/math] [math]\displaystyle{ x_n }[/math] на столбцы размера [math]\displaystyle{ t }[/math].
- [math]\displaystyle{ x_1 }[/math] [math]\displaystyle{ x_{t+1} }[/math] [math]\displaystyle{ x_{2t+1} }[/math] [math]\displaystyle{ ... }[/math]
- [math]\displaystyle{ x_2 }[/math] [math]\displaystyle{ x_{t+2} }[/math] [math]\displaystyle{ x_{2t+2} }[/math] [math]\displaystyle{ ... }[/math]
- [math]\displaystyle{ ... }[/math] [math]\displaystyle{ ... }[/math] [math]\displaystyle{ ... }[/math] [math]\displaystyle{ ... }[/math]
- [math]\displaystyle{ x_t }[/math] [math]\displaystyle{ x_{2t} }[/math] [math]\displaystyle{ x_{3t} }[/math] [math]\displaystyle{ ... }[/math]
Если [math]\displaystyle{ t }[/math] кратно длине ключа, то каждые два элемента текста, отстоящие друг от друга на [math]\displaystyle{ a\times t }[/math] позиций, [math]\displaystyle{ a\in N }[/math], зашифрованы одним и тем же алфавитом. А это означает, что каждая строка в выписанной выше таблице получена из открытого текста перестановкой. Если же [math]\displaystyle{ t }[/math] не кратно длине ключа, то строки являются полиалфавитным шифром.
Ранее было показано, что индекс совпадений для перестановки открытого текста и для полиалфавитного шифра заметно отличается. Таким образом, перебирая различные значения [math]\displaystyle{ t }[/math] и вычисляя для каждого из них индекс совпадений, мы можем выделить те [math]\displaystyle{ t }[/math], которые кратны длине ключа. Определить длину ключа по этим данным не составляет труда.
Алгоритм нахождения ключа
Предположим, мы определили длину ключа [math]\displaystyle{ t }[/math]. Найдём теперь сам ключ.
Вновь выпишем текст в столбцы размера [math]\displaystyle{ t }[/math].
- [math]\displaystyle{ x_1 }[/math] [math]\displaystyle{ x_{t+1} }[/math] [math]\displaystyle{ x_{2t+1} }[/math] [math]\displaystyle{ ... }[/math]
- [math]\displaystyle{ x_2 }[/math] [math]\displaystyle{ x_{t+2} }[/math] [math]\displaystyle{ x_{2t+2} }[/math] [math]\displaystyle{ ... }[/math]
- [math]\displaystyle{ ... }[/math] [math]\displaystyle{ ... }[/math] [math]\displaystyle{ ... }[/math] [math]\displaystyle{ ... }[/math]
- [math]\displaystyle{ x_t }[/math] [math]\displaystyle{ x_{2t} }[/math] [math]\displaystyle{ x_{3t} }[/math] [math]\displaystyle{ ... }[/math]
Рассмотрим две строки этой таблицы. Сдвинем алфавит одной из строк на [math]\displaystyle{ s }[/math] символов и вычислим взаимный индекс совпадений полученных строк. Т.к. каждая из этих двух строк получена сдвигом алфавита открытого текста, то максимум взаимного индекса совпадений будет наблюдаться при нулевом конечном относительном сдвиге.
Поэтому применяется следующий алгоритм: вычисляется взаимный индекс совпадений для различных [math]\displaystyle{ s }[/math], ищется значение [math]\displaystyle{ s }[/math], при котором взаимный индекс совпадений максимален. Тогда начальный относительный сдвиг строк будет равен [math]\displaystyle{ m-s }[/math] ([math]\displaystyle{ m }[/math] — размер алфавита). Вычисляются относительные сдвиги между всеми парами строк. Т.к. сдвиги строк таблицы соответствуют сдвигам букв ключа, то остаётся перебрать [math]\displaystyle{ m }[/math] возможных ключей и выбрать из них наиболее правдоподобный.
Пример использования
Пусть дан некоторый текст, зашифрованный шифром Виженера. Найдём ключевое слово и прочитаем открытый текст.
влцдутжбюцхъяррмшбрхцэооэцгбрьцмйфктъъюьмшэсяцпунуящэйтаьэдкцибр ьцгбрпачкъуцпъбьсэгкцъгуущарцёэвърюуоюэкааэбрняфукабъарпяъафкъиьжяффнйо яфывбнэнфуюгбрьсшьжэтбэёчюъюръегофкбьчябашвёэуъъюаднчжчужцёэвлрнчулб юпцуруньъшсэюъзкцхъяррнрювяспэмасчкпэужьжыатуфуярюравртубурьпэщлафоуф бюацмнубсюкйтаьэдйюнооэгюожбгкбрънцэпотчмёодзцвбцшщвщепчдчдръюьскасэг ъппэгюкдойрсрэвоопчщшоказръббнэугнялёкьсрбёуыэбдэулбюасшоуэтъшкрсдугэфл бубуъчнчтртпэгюкиугюэмэгюккъъпэгяапуфуэзьрадзьжчюрмфцхраююанчёчюъыхьъ цомэфъцпоирькнщпэтэузуябащущбаыэйчдфрпэцъьрьцъцпоилуфэдцойэдятррачкубу фнйтаьэдкцкрннцюабугюуубурьпйюэъжтгюркующоъуфъэгясуоичщщчдцсфырэдщэ ъуяфшёчцюйрщвяхвмкршрпгюопэуцчйтаьэдкцибрьцыяжтюрбуэтэбдуящэубъибрюв ъежагибрбагбрымпуноцшяжцечкфодщоъчжшйуъцхчщвуэбдлдъэгясуахзцэбдэулькнъ щбжяцэьрёдъьвювлрнуяфуоухфекьгцчччгэъжтанопчынажпачкъуъмэнкйрэфщэъьбуд эндадъярьеюэлэтчоубъцэфэвлнёэгфдсэвэёкбсчоукгаутэыпуббцчкпэгючсаъбэнэфърк ацхёваетуфяепьрювържадфёжбьфутощоявьъгупчршуитеачйчирамчюфчоуяюонкяжы кгсцбрясшчйотъъжрсщчл
Ввиду того, что полный алгоритм поиска длины ключа является крайне громоздким, вычислим индекс совпадений только для [math]\displaystyle{ t =5 }[/math] и убедимся, что длина ключа действительно равна 5.
втхмцццтмцяаццацсъавоаябяъфянюстюебаудуву... лжъшэгмъшпщьигчпэгръюэфъъиффэгшбъгьшънжлл... цбябобйъэуээббкъгуцрэбуааьнынбьэюочвъчцрб... дюррорфюснйдрръбкуёюкркрфжйвфржёрфяёюжёню... уцрхэькьяуткьпуьцщэуанапкяобуьэчъкбэачэчп...
Значения индекса совпадений для каждой из строк:
Строка | Индекс совпадений |
---|---|
1 | 0.05676 |
2 | 0.05896 |
3 | 0.06340 |
4 | 0.05810 |
5 | 0.07230 |
Процесс поиска относительных сдвигов строк также приведём в кратком виде:
Строка | Сдвиг | Взаимный индекс совпадений |
---|---|---|
1 | — | — |
2 | 6 | 0.05494 |
3 | 3 | 0.05798 |
4 | 16 | 0.06068 |
5 | 3 | 0.06045 |
Найденное ключевое слово: «слово».
После расшифровки получаем следующий открытый текст:
развебытьздоровымтожесамоечтонебытьбольнымопределенноздоровьеэтонечтоболь шеедлянасфизическоездоровьеэтоисостояниеиспособностьиэнергиязаниматьсятемчт онамнеобходимополучатьприэтомудовольствиеивыздоравливатьбезвсякойпомощиз доровьепарадоксальновынеможетенепосредственнозаставитьсебястатьздоровымвам остаетсятольконаблюдатьзатемкакудивительнаяспособностьвашегоорганизмаисцеля тьсебяначинаетдействоватьсамасобойивашебогатствоилибедностьжестокостьилидоб родетельностьнеимеютздесьповидимомуникакогозначенияздоровьеэтонечтопозитив ноеононеозначаетотказотудовольствияздоровьеявляетсяестественнымследствиемна шегообразажизнивзаимоотношенийдиетыокружающейобстановкиздоровьеэтонепре дметсобственностиэтопроцессэтоточтомыделаемрезультатнашихмыслейичувствэтоо бразсуществованияинтересночтонаправлениемедицинскихисследованийвсебольшеи большеотклоняетсявсторонутойобластикотораядосихпорсчиталасьсферойдеятельно стипсихологовисейчасужетруднопровестичеткиеразграничениямеждуфизическимии ментальнымифакторамизаболеваний
Примечания
- ↑ 1,0 1,1 Пилиди, 2009, с. 55.
- ↑ 2,0 2,1 2,2 2,3 2,4 Friedman, 1938, p. 117.
См. также
Литература
- William Frederick Friedman. Military Cryptanalysis. Part II. Simpler vrieties of polyalphabetic substitution systems. — Washington: United States goverment printing office, 1938. — 120 p. Архивная копия от 11 сентября 2010 на Wayback Machine
- Пилиди В. С. Криптография. Вводные главы. — Ростов-на-Дону: ЮФУ, 2009. — 110 с.
- Бауэр Ф., Расшифрованные секреты. Методы и принципы криптологии: Пер. сангл. - М.: Мир, 2007. - 550 с. — ISBN 5-03-003551-6
- Жданов О.Н., Куденкова И.А. Криптоанализ классических шифров — Красноярск 2008