Индекс совпадений

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

Индекс совпадений — один из методов криптоанализа шифра Виженера. Описание было опубликовано Уильямом Фридманом в 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{ \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]. Как упоминалось выше, на основе этих значений взаимный индекс совпадений может быть вычислен для любого сдвига.

Для русского языка:
Сдвиг Взаимный индекс
0 0,0553
1 0,0366
2 0,0345
3 0,0400
4 0,0340
5 0,0360
6 0,0326
7 0,0241
8 0,0287
9 0,0317
10 0,0265
11 0,0251
12 0,0244
13 0,0291
14 0,0322
15 0,0244
16 0,0249
Для английского языка:
Сдвиг Взаимный индекс
0 0,0644
1 0,0394
2 0,0319
3 0,0345
4 0,0436
5 0,0332
6 0,0363
7 0,0389
8 0,0338
9 0,0342
10 0,0378
11 0,0440
12 0,0387
13 0,0428

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

Алгоритм нахождения длины ключа

Разобьём текст [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. 1,0 1,1 Пилиди, 2009, с. 55.
  2. 2,0 2,1 2,2 2,3 2,4 Friedman, 1938, p. 117.

См. также

Литература