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

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

Неделя 2. Шифр многоалфавитной замены

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

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

Для шифрования применяется следующая процедура. Пробелу и каждой букве русского алфавита ставится в соответствие число от 0 до 31, причём 0 — это пробел, буква «А» имеет код 1, буква «Б» — код 2 и т. д. Договоримся, что буквы «Е» и «Ё» не различаются, а также не различаются буквы «Ъ» и «Ь» — причина всего этого будет ясна позже, главное, что теперь символов ровно 32 (это 25, поэтому для математика это число «круглое»). Хорошая новость заключается в том, что теперь коды букв можно складывать друг с другом. Сложив коды двух букв (открытого текста и ключа), получаем новую букву. Она-то и является буквой шифрограммы. Если в результате сложения получается код, больший 31, то от этого кода надо отнять 32 (в математике это представляет собой операцию сложения по модулю 32; да и вообще модульная арифметика, или арифметика остатков, очень часто нужна в деле криптографии).

Допустим, что в качестве ключа выбрано слово «БУКВА», тогда процедура шифрования выглядит следующим образом:

Вот так при применении ключа к открытому тексту получилась шифрограмма: «ЩЖЩВУВЯЩИАЪЭ У». Среди 14 букв этой шифрограммы трижды встречается буква «Щ», и это уже должно вызвать подозрение, что не всё так просто. Этот шифр более стойкий, чем простая одноалфавитная замена, но всё ещё настолько простой для обученного криптоаналитика, что применять его бесполезно — он будет взломан мгновенно.

Для удобства и ускорения работы можно сделать таблицу размером 32 × 32 ячейки:

По такой таблице сразу видно, что сложение букв «Б» и «В» даёт букву «Д» (ищем ячейку на пересечении «Б» и «В», причём неважно, в строке или в столбце стоят буквы, поскольку операция коммутативна) и т. д.

Теперь надо выполнить две несложные задачи:

1. Придумать сообщение, длина которого должна быть не менее 500 символов.

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

3. Зашифровать придуманное сообщение при помощи процедуры сложения с ключом.

Всё ранее описанное можно осуществить при помощи арифметики вычетов по модулю 32. Если каждому символу алфавита от пробела до буквы «Я» поставить в соответствие число от 0 до 31, то в совокупности с арифметическими операциями сложения и вычитания получится кольцо Z32. Тогда шифрование будет представлено в этом кольце как сложение кодов символов открытого текста и ключа, а дешифровка как вычитание кодов символов ключа из символов шифрограммы соответственно.

Давайте попробуем сделать такую шифровку. Здесь не будет открытого текста длиной не менее 500 символов, используем более короткий. Пусть это будет текст: «ХОРОШО ТЕМ КТО НАУЧИЛСЯ ШИФРОВАТЬ СООБЩЕНИЯ ХОРОШО», а ключом пусть будет слово «ШИФР». Как видно, здесь не используются знаки препинания. В принципе, они никогда не используются при шифровании, поскольку избыточны.

Начнём: Х + Ш = О. О + И = Ч. Р + Ф = Е. О + Р = ПРОБЕЛ. Ну и так далее. В итоге получается шифрограмма: «ОЧЕ СЧФГЯХФЫЛЧФЯЩЭМЩДЪУРССЙБЗЛХГФИЖ ЗКОЦЖСУРОЧЕ СЧ». Уже на этом простом примере видно, что такой шифр намного сложнее, чем использованный на прошлой неделе.

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

Неделя 3. Стеганография и код Фрэнсиса Бэкона

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

Что такое стеганография? Это набор методов и практик сокрытия сообщений. Основная цель стеганографии заключается в том, чтобы скрыть сам факт передачи тайного сообщения. Другими словами, тайное сообщение как бы прячется. Оно даже может быть не шифрованным. Но если спрятанное сообщение ещё и зашифровать каким-нибудь способом, то степень защиты будет повышена, особенно если метод шифрования нарушает частоты распределения символов в шифруемом тексте. Тогда найти стеганограмму намного сложнее, поскольку она начинает выглядеть как «шум». Непосвящённый человек не сможет выявить её, а у криптоаналитика будет очень мало зацепок, чтобы попытаться обнаружить стеганограмму (например, статистическими методами).

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

Помните, я не зря упомянул о том, что в нашем новом алфавите ровно тридцать два символа. Число 32 для криптографов и математиков — «круглое», поскольку в двоичной системе счисления записывается как «100000». Другими словами, для представления тридцати двух символов нам требуется 5 бит информации, поскольку 32 = 25. Мы можем воспользоваться этим для нового способа кодирования символов нашего алфавита:

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

Соответственно, чтобы зашифровать текст, необходимо выписать один за другим код каждого символа. Например, пусть есть текст «ПОДГОТОВЬ ИНГРЕДИЕНТЫ К МОЕМУ ПРИЕЗДУ». Этот текст шифруется при помощи представленного выше кода так:

10000011110010100100011111001101111000111101100000010010111000100100010011000101 01001001100111010011111000000001011000000110101111001100110110100000001000010001 0100100110010000010110100

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

Как видно, эта же шифрограмма «нанесена» на обычные слова в начале предыдущего абзаца, при этом использовались все символы для нанесения (то есть и цифры, и знаки препинания). Неподготовленный читатель даже не обратит внимания на такое странное начертание текста. Но грамотный криптоаналитик, конечно же, всё сразу поймёт, этим никого не удивишь. Поэтому обычно используют более тонкие свойства, которые не так тривиальны и не видны невооружённым глазом.

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

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