Математика и криптография — страница 6 из 23

методом Фрэнсиса Бэкона.

Фрэнсис Бэкон — английский философ, историк, политик. Создал метод кодирования и сокрытия информации, из-за которого в дальнейшем произошло множество интересных случаев с поиском скрытых сообщений там, где их нет. Например, последователи этого метода пытались доказать, что все пьесы Уильяма Шекспира на самом деле были написаны Бэконом.

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

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

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

Неделя 4. Операция XOR

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

Да, действительно, не всё. Математики придумали огромное количество операций , которые можно производить над различными математическими объектами. И те операции над числами, которые изучают в школе, — лишь капля в океане чистого математического знания. Но мы не будем изучать весь океан, а рассмотрим только одну новую математическую операцию (которая очень нравится всем криптографам и криптоаналитикам). Эта операция называется «XOR», или, по-русски, «Исключающее ИЛИ», и обозначается значком ⊕. Ее выполняют не над числами, а над битами. На прошлой неделе мы уже выяснили, что такое бит — это «0» или «1».

Что ж, давай кратко изучим, что такое булевая логика, которая определяет операции над битами. Объектами в булевой логике являются биты, то есть два числа 0 и 1. Их можно рассматривать как значения истинности, когда 0 обозначает ЛОЖЬ, а 1 — ИСТИНА. Над такими значениями истинности определены различные операции. Например, самыми известными операциями являются НЕ (обозначается как ~), И (обозначается как ⊕) и ИЛИ (обозначается как |). У каждой операции есть так называемая таблица истинности. Рассмотрим их.

Операция НЕ:

— 0 = 1

— 1 = 0

Операция И:

0 ⊕ 0 = 0

0 ⊕ 1 = 0

1 ⊕ 0 = 0

1 ⊕ 1 = 1

Операция ИЛИ:

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

Вернёмся к операции ИСКЛЮЧАЮЩЕЕ ИЛИ, которая определяется очень просто. Выучи наизусть следующую таблицу истинности:

0 ⊕ 0 = 0

0 ⊕ 1 = 1

1 ⊕ 0 = 1

1 ⊕ 1 = 0

Эту операцию можно применять и к длинным двоичным числам. В этом случае она просто выполняется над каждым битом числа. Если выписать два двоичных числа в столбик друг под другом, то операция XOR выглядит очень просто:

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

Чтобы лучше понять эту новую математическую операцию, можешь проделать такой опыт. Возьми монетку и подкинь её 100 раз (если ты хочешь схитрить и прочитать это число в двоичной системе счисления, чтобы делать меньше работы, то, так и быть, подкинь монетку 99 раз). Каждый раз записывай результат. «Орёл» обозначай битом 0, а «решка» — 1. Запиши это длинное число в одну строку. Во второй строке прямо под первым числом запиши это же самое число, но задом наперёд. Затем проведи длинную горизонтальную линию и под ней вычисли результат применения операции XOR к этим двум числам. Проверь себя: этот результат должен читаться одинаково как справа налево, так и слева направо. Сможешь объяснить почему?

А теперь я расскажу, почему эта операция так полюбилась криптографам. Всё просто. Пусть у тебя есть два различных числа — X и Y. Если применить операцию XOR к этим числам, то получится новое число Z = (X Y). А если теперь к числу Z снова применить операцию XOR c числом Y, то результатом будет не что иное, как X!

Для примера давай вернемся к паре чисел, что мы рассматривали немного выше. Возьмем результат выполнения над ними операции XOR (10010), и теперь применим к нему эту операцию с тем же самым числом 11011:

Что получилось? Правильно, первое число — 01001.

Это важное свойство обратимости результата постоянно используется в криптографии. Давай посмотрим почему.

Напомню, что на прошлой неделе мы ввели новый алфавит, состоящий из тридцати двух символов, включая пробел. Каждому символу было сопоставлено пятизначное двоичное число от 00000 до 11111. Собственно, после этого уже было все понятно: мы же можем применять к кодам символов операцию XOR! Действительно, такое применение — просто другой способ использования шифра подстановки. Но этот способ намного проще: не надо искать соответствия в таблицах, а можно просто применить операцию XOR. Причём и для шифрования, и для расшифровки необходимы одинаковые действия.

Давай рассмотрим этот процесс на примере. Пусть нам необходимо зашифровать слово «ОГОНЬ». В качестве ключа возьмём единственную букву «Р». Вот что получится:

Так из слова «ОГОНЬ» получилось слово «ЮФЮЯЙ». Расшифровка происходит таким же образом:

Математически это можно записать так: «ОГОНЬ ⊕ РРРРР = ЮФЮЯЙ» и «ЮФЮЯЙ ⊕ РРРРР = ОГОНЬ». Как ты понимаешь, сейчас мы использовали просто шифр подстановки с одноалфавитной заменой. Это неинтересно. Интересно здесь то, что шифрование и расшифровка происходят при помощи одного и того же действия.

Теперь рассмотрим иной пример. Пусть нам опять надо зашифровать слово «ОГОНЬ», но теперь в качестве ключа мы будем использовать слово «МАГИЯ». Что получится? А вот что:

Абсолютно так же производится расшифровка:

Получается, что мы теперь можем «складывать» друг с другом целые слова: «ОГОНЬ ⊕ МАГИЯ = БДКЖГ». Это действительно какая-то магия. Только что мы при помощи этой прекрасной операции XOR применили шифр многоалфавитной замены, который изучали на второй неделе. Одна и та же операция позволяет применять сразу два шифра, которые мы уже изучили. Это прекрасно!

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

У этой таблицы много примечательных свойств. Если ты внимательно её изучишь, то найдёшь в ней разнообразные закономерности. Обрати, например, внимание на то, как в таблице располагаются буквы А, В, Ж, О и Я, а потом посмотри на их двоичное представление. И таких узоров в ней большое количество. Это — следствие разных свойств, которыми обладают двоичные числа и двоичная система счисления.

Теперь давай потренируемся. Итак, у тебя есть послание следующего вида:

«ПРИВеТ МОЙ ДороГОй ДРУГ СеГОдНЯ Я хОЧу РАССКаЗаТь ТЕбе оДну ЗаниМАТеЛьНуЮ ИстоРию КОТОрАЯ СлучилАСЬ сО МНоЙ мНого Лет НАзад КоГДА я бЫЛ Ещё СОвСем мАЛЕНьким Я ТоГдА Жил в ДаЛёкОй ДЕРевНЕ и БЫл нАмноГо БЛИЖЕ к пРИрОДе чем СЕЙЧАс и ВоТ Однажды я шёл по лесу и увидел за деревьями яркий красный свет также было слышно странное жужжание подкравшись поближе я увидел марсиан».

Как ты уже понимаешь, на самом деле здесь два текста. Первый текст — это «обманка», призванная затуманить секрет. Странная история про марсиан. На самом-то деле скрытое послание закодировано в размере букв. Так как конец текста полностью состоит из строчных букв, можно предположить, что именно строчная буква обозначает бит 0. А заглавная буква, соответственно, обозначает бит 1. Если ты тщательно проделаешь операцию декодирования, то должно получиться следующее:

11110 11111 00011 01111 10110 11101 10111 11010 10110 00100 10001 11010 10110 00100 11110 11100 00011 10111 01010 00100 11000 10111 00111 00110 10001 11100 00110 10110 00101 11001 10110 01000 10111 11001 10110 00011 11100 10110

Использование уже известной тебе таблицы для преобразования двоичных чисел в буквы даёт такой текст:

«ЮЯВОХЭЦЩХГРЩХГЮЫВЦЙГЧЦЖЕ РЫЕХДШХЗЦШХВЫХ».

На первый взгляд выглядит странно, и первая мысль, которая приходит в голову, — возможно, в процессе декодирования мы допустили ошибку.

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