Аль-Кинди понял, что это может служить шорткатом для расшифровки сообщения, закодированного шифром подстановки. Если произвести частотный анализ закодированного текста и сопоставить чаще всего встречающиеся буквы с теми, которые наиболее часто попадаются в тексте нешифрованном, можно начать расшифровывать сообщение. Частотный анализ вообще дает поразительный шорткат к расшифровке таких кодов, которые оказываются не столь надежными, как может показаться.
Во время Второй мировой войны немцы считали, что нашли хитроумный способ использования шифров подстановки, не позволяющий расшифровывать сообщения при помощи этого шортката. Идея заключалась в следующем: для кодирования каждой следующей буквы сообщения нужно использовать новый шифр подстановки. Например, если нужно было зашифровать последовательность букв
Одна из этих машин до сих пор выставлена на всеобщее обозрение в поместье Блетчли-Парк, в котором работали во время войны британские дешифровщики. На первый взгляд она кажется похожей на обычную пишущую машинку с клавиатурой, но выше клавиатуры имеется второй набор букв. Когда нажимаешь на одну из клавиш, над клавиатурой загорается одна из букв. Именно так кодируется каждая буква. Схема машины, по сути дела, перемешивает буквы, как в классическом шифре подстановки. Но при том же нажатии клавиши можно услышать щелчок и увидеть, как один из трех роторов, установленных в самом сердце машины, поворачивается на одно деление. Если нажать на ту же клавишу еще раз, загорится другая лампочка. Дело в том, что соединение между клавиатурой и лампочками изменилось. Соединительные провода проходят через роторы, и их повороты изменяют схему соединений в машине. Таким образом, вращение роторов обеспечивает использование нового шифра подстановки при кодировании каждой следующей буквы.
Казалось, что взломать такой шифр невозможно. Для настройки машины можно использовать шесть разных роторов, у каждого из которых есть 26 разных начальных состояний. Кроме того, в задней части машины имеется множество проводов, которые могут добавлять еще один уровень фиксированного шифрования. В общей сложности получается 158 миллионов миллионов миллионов вариантов настройки. Попытки определить, какой из них использовал оператор при зашифровке сообщения, казались буквальным воплощением идеи поисков иголки в стоге сена. Немцы были абсолютно уверены, что взломать эту машину невозможно.
Но они не приняли в расчет гениальность Гаусса XX века, математика Алана Тьюринга, который, работая в Блетчли-Парке, все же выискал в этой системе слабое место, позволявшее создать шорткат, который избавлял от необходимости перебора всех вариантов. Дело в том, что машина никогда не зашифровывала букву той же буквой. Ее схема всегда преобразовывала одну букву в какую-нибудь другую. Казалось бы, в этом нет ничего страшного. Но Тьюринг нашел способ использовать это свойство для получения гораздо более ограниченного набора вариантов шифровки конкретных сообщений.
Тем не менее для окончательных поисков ему все равно приходилось использовать машины. В домиках Блетчли-Парка ночи напролет жужжали «бомбы», как дешифровщики называли машины, которые реализовывали шорткат Тьюринга. Зато союзники каждую ночь получали доступ к сообщениям, которые немцы пересылали, считая их абсолютно защищенными от дешифровки.
Подозрительная простота
Коды, которые защищают сегодня наши кредитные карты, «летающие» по интернету, используют математические задачи, к решению которых, как мы считаем, в принципе не может быть шорткатов. В основе одного из таких шифров, который называется RSA[129], лежит загадочная категория чисел – простые числа. Каждый веб-сайт выбирает два секретных простых числа длиной порядка 100 знаков и перемножает их. Получившееся число, имеющее в длину около 200 знаков, можно опубликовать на сайте. Это кодовое число данного сайта. Когда я посещаю этот сайт, мой компьютер получает это 200-значное число, которое используется затем в математических операциях с моей кредитной картой. Зашифрованное таким образом число можно пересылать по интернету. Оно надежно защищено, так как для его расшифровки хакеру нужно было бы найти два простых числа, произведение которых дает 200-значное кодовое число веб-сайта. Такой шифр считается надежным, потому что эта задача, по-видимому, относится к категории задач об иголках в стогах сена. Математикам известен лишь один способ подбора таких простых чисел: перебирать эти числа одно за другим, надеясь случайно набрести на иголку, то есть на число, на которое кодовое число сайта делится без остатка.
О задаче разложения чисел на простые множители писал в своем великом трактате по теории чисел под названием «Арифметические исследования» (Disquisitiones Arithmeticae, 1801) сам Гаусс: «То, что задача о том, как отличать составные числа от простых и разлагать первые на их простые сомножители, принадлежит к важнейшим задачам всей арифметики и привлекала внимание как математиков древности, так и математиков нашего времени, настолько хорошо известно, что было бы излишним тратить здесь на это много слов… Кроме того, и интересы самой науки как таковой обязывают приложить все усилия к решению этой столь изящной и знаменитой проблемы»[130].
Он, разумеется, не сознавал, насколько важной станет эта задача в эпоху интернета и электронной торговли. Пока что никто, в том числе и сам великий Гаусс, не придумал шортката к нахождению простых делителей крупных чисел. Количество простых чисел, которые нужно перебрать, чтобы расшифровать 200-значное число, так велико, что любая такая попытка будет абсолютно нецелесообразной. Мы предполагаем, что задача факторизации – выражения числа в виде произведения меньших чисел – может быть сложной по самой своей природе. Это один из нерешенных вопросов, над которыми работают сейчас математики. Сможем ли мы доказать, что шортката к нахождению простых чисел не существует?
Но погодите. Как же тогда расшифровывает сообщения сам веб-сайт? Дело в том, что он начинает выполнение этого алгоритма с выбора двух простых чисел приблизительно по 100 знаков каждое, а затем перемножает их для получения 200-значного кодового числа. Простые числа, позволяющие произвести это вычисление в обратном порядке, известны только веб-сайту, и никому другому.
Тем не менее нахождение простых чисел – это одна из задач, которые математики еще не решили. Секрет расположения простых чисел в численной вселенной, так называемая гипотеза Римана, также входит в число семи Задач тысячелетия. Но, хотя на самом деле математики не понимают, как распределены простые числа, у нас есть один интересный шорткат, помогающий находить большие простые числа для таких интернет-кодов. Он основывается на свойстве простых чисел, которое открыл великий французский математик XVII века Пьер де Ферма. Он доказал, что если
Следовательно, если я хочу проверить, простое ли число, например,
В этой бочке меда есть, однако, своя ложка дегтя. Бывают числа, которые ведут себя как простые, и никакие свидетели Ферма их не выдают, но простыми они не являются. Их называют псевдопростыми. Тем не менее в конце 1980-х годов два математика, Гари Миллер и Майкл Рабин, сумели усовершенствовать метод Ферма и разработать безошибочный тест на простоту чисел, работающий за полиномиальное время. Единственная оговорка состояла в том, что для этого им пришлось предположить, что существует возможность покорения одной чрезвычайно высокой вершины – гипотезы Римана (или ее обобщенного варианта).
Миллер и Рабин смогли доказать, что, если математики найдут способ взойти на эту вершину, можно будет получить гарантированный шорткат к выявлению простых чисел. Одна из причин, по которым эта вершина так важна, связана именно с тем, что, как показали многие математики, с нее открывается путь к огромному множеству шорткатов. У меня самого есть несколько теорем, доказывающих истинность тех или иных утверждений при условии, что сперва я смогу доказать справедливость гипотезы Римана.
Однако никогда не следует терять надежды, что может найтись хитрая тропа, по которой гору можно обойти. В 2002 году математическое сообщество потрясла новость, что три индийских математика, Маниндра Агравал, Нирадж Каял и Нитин Саксена, работающие в Технологическом институте Канпура, открыли способ тестировать простоту чисел за полиномиальное время, не требующий перехода через гору Римана. Замечательно то обстоятельство, что двое из авторов этого открытия были студентами, писавшими дипломы под руководством Агравала. Даже сам Агравал, старший член этой группы, не был известен большинству математического сообщества. Многим это напомнило об истории великого Рамануджана, который внезапно ворвался на математическую сцену в начале XX века, написав о своих открытиях кембриджскому математику Г. Х. Харди.
Хотя открытие этой группы дало нам тест на простоту чисел, работающий за полиномиальное время и не требующий возможности перехода через гору Римана, в реальной жизни этот алгоритм был не слишком практичным. Как я уже говорил, важно знать степень используемого полинома. Если речь идет о квадратном полиноме, алгоритм работает быстро. Однако исходный алгоритм, который предложили Агравал, Каял и Саксена, имел полиномиальную сложность 12-й степени. Это число уменьшили до 6 американский математик Карл Померанс и голландский математик Хендрик Ленстр, но, как я уже объяснял, хотя с математической точки зрения такое решение и считается шорткатом, на практике оно очень быстро замедляется. По мере роста чисел, которые мы тестируем, работа алгоритма с полиномиальной сложностью шестой степени занимает существенно больше времени.
Раз безопасность в интернете зависит от наличия достаточного количества больших простых чисел, как же веб-сайтам удается быстро находить их для эффективного предоставления финансовых услуг? Для этого используются алгоритмы, которые по меньшей мере дают веб-сайту высокую вероятность того, что найденные ими числа простые, хотя и не гарантируют этого.
Вспомним, что если некое число не простое и не псевдопростое, то половина чисел, меньших его, не пройдут тест Ферма. Но что, если нам так сильно не повезет, что мы проверим именно те числа, которые пройдут этот тест? Казалось бы, чтобы найти свидетеля составного характера числа, необходимо проверить половину меньших его чисел. Но какова вероятность не попасть на такого свидетеля? Предположим, мы проверили 100 чисел и не нашли ни одного свидетеля. Это означает одно из двух: либо наше число простое или псевдопростое, либо нам действительно не попалось ни одного свидетеля, но вероятность такого события составляет 1 к 2100. Играть на таких условиях я согласен! – уж слишком мала эта вероятность.
Хотя у нас есть превосходные алгоритмы, как детерминированные, так и вероятностные, позволяющие находить простые числа для создания таких кодов, обычных алгоритмов для взлома этих кодов, по-видимому, не существует. А как насчет чего-нибудь не столь обычного?