В начале 1970-х годов существовал только один вид шифрования: симметричный. Но уже к концу десятилетия появилась альтернатива. Сложно сказать, насколько революционной была идея асимметричного шифрования: она с самого начала была направлена на решение проблемы распространения симметричных ключей и позволила двум людям, которые предварительно не согласовали ключ, сделать это на виду у злоумышленника.
Асимметричное шифрование может показаться волшебством. И это недалеко от истины. Оно способствовало развитию многих других потрясающих технологий, ставших возможными благодаря криптографии: цифровых подписей, электронных платежей в цифровой валюте и голосования через Интернет.
Чтобы по достоинству оценить возможности асимметричного шифрования, вернемся к предыдущему примеру, в котором вам неожиданно понадобился ключ для шифрования взаимодействия с незнакомым сайтом. Что вам потребовалось бы для решения этой задачи с использованием одной лишь симметричной криптографии?
Я уже отмечал, что ключ можно было бы доставить какими-то физическими средствами. Вы или работники магазина могли бы сгенерировать криптографический ключ и договориться о передаче его другой стороне – лично или, скажем, с помощью службы доставки. Это стоило бы вам денег и, что важнее, времени. В контексте интернет-покупок эта идея выглядит нелепо.
Ключами можно было бы обменяться еще до того, как зайти на сайт. Но поскольку у каждого сайта должен быть ключ не просто отдельный, но и уникальный, вам пришлось бы запастись ключами для всех онлайн-ресурсов, которые вы собираетесь когда-либо посетить.
Главная проблема этого подхода в его масштабности. В киберпространстве более 1,5 миллиарда сайтов. Ради возможности когда-нибудь зайти на любой из них вам придется хранить более 1,5 миллиарда симметричных ключей. Учитывая, что доступ в Интернет есть примерно у половины населения планеты, каждый продавец, который хочет сделать свой товар доступным, должен хранить 3,5 миллиарда ключей.
Интересно, что проблема отнюдь не в емкости хранилищ. Если бы каждый из этих ключей был создан в формате AES длиной 128 бит, то для них всех продавцу пришлось бы выделить 45 гигабайт (карта памяти такого объема стоит меньше, чем обед на двоих в дешевом ресторане). Кошмарной идею делает необходимость управлять всеми этими ключами. Как вы будете их распространять? Как вы будете следить, к каким сайтам относятся какие ключи? Как справиться с тем, что каждую минуту каждого дня в году появляются все новые и новые сайты?
Есть еще один вариант: можно было бы создать глобальный центр обмена ключами, которому доверяли бы все пользователи Интернета. Каждый из нас мог бы заранее получить свой симметричный ключ, например, на смарт-карте, подобно тому, как банк выдает вам ключ в конверте с банковской картой. Если вам нужно сгенерировать новый ключ для безопасного взаимодействия с сайтом, вы тоже можете обратиться в глобальный центр, и результат будет отправлен вам зашифрованным при помощи ключа, который есть как у центра, так и у вас. Похожим образом тот же ключ отправлялся бы и сайту.
Все просто?
Ах если бы.
Первыми вступят в игру проблемы политического характера. Кому все пользователи Интернета могут доверить создание такого глобального центра ключей? Американцы не доверяют русским, те не доверяют британцам, которые, в свою очередь, с подозрением относятся к французам, которые не в восторге от руританцев и т. д. Возможно, эту обязанность можно было бы возложить на ООН, но даже если это сработает, встанет проблема централизованности такой конструкции: каждый раз, когда кто-то захочет с кем-то пообщаться, им обоим придется сначала обратиться в глобальный центр ключей. Это невероятно замедлило бы любые взаимодействия. К тому же, если глобальный центр окажется временно недоступным или скомпрометированным, последствия будут катастрофическими.
Однако стоит отметить, что решение с центром ключей идеально подходит для отдельных организаций. Какая-то частная компания вполне может предоставить каждому работнику по ключу. Более того, у многих компаний есть собственные централизованные сети, что делает запрос ключей из центрального хранилища действенным решением. Правда, такие пользователи, связанные с центром ключей через работодателя, не будут в полной мере «незнакомцами». А в масштабах многочисленного и менее структурированного населения (читай – все или почти все пользователи Интернета) это просто не будет работать.
Итак, для обмена ключами с незнакомцами одного лишь симметричного шифрования, как правило, недостаточно.
Чтобы понять, как лучше обмениваться секретной информацией с незнакомцем, попробуем вдохновиться примером из реального мира. Возможно, это нелепая и немного надуманная история, но я надеюсь, что она будет достаточно наглядной.
Представьте, что вы получили имя и адрес незнакомца, живущего на другом конце города, и вам нужно написать ему конфиденциальное письмо. Звучит неправдоподобно, поэтому пусть незнакомцем будет юрист, с которым вы уже говорили по телефону, но не встречались, а передать вы хотите свое завещание.
Проще всего было бы запечатать письмо в конверт и бросить в почтовый ящик. Но какой бы замечательной ни была почта, всегда может найтись слишком любопытный работник, который откроет конверт с помощью пара и заглянет внутрь. Чтобы избежать этого, письмо можно было бы положить в чемодан, который закрывается на ключ, и отправить его курьером. Но где юрист возьмет ключ, чтобы открыть чемодан?
Как вы помните, физические замки бывают двух типов. Одни открываются и закрываются одним и тем же ключом, другие, навесные, требуют ключ только для открытия, а закрыть их может кто угодно.
Рассмотрим другую версию той же истории: вы кладете письмо в чемодан и закрываете его навесным замком, ключ к которому есть только у вас. Курьер отвозит ваш чемодан юристу. Он надежен, но по дороге может попытаться заглянуть внутрь, чтобы прочитать письмо – отсюда и необходимость в замке (криптографы назвали бы такого курьера «честным, но любопытным»).
Получив чемодан, юрист не может его открыть: у него все еще нет ключа к вашему навесному замку. Поэтому он вешает на чемодан еще один замок, ключ к которому есть только у него, возвращает чемодан курьеру и просит передать его вам. Этот чемодан никогда еще не был настолько защищенным: у него теперь есть два замка, и ни у кого нет ключей к обоим.
Приняв чемодан, вы открываете свой навесной замок, а другой оставляете, и снова просите курьера доставить его юристу. Раздраженный, но явно довольный тройной оплатой, курьер снова везет чемодан на другой конец города. И наконец на этот раз юрист открывает свой замок и извлекает письмо.
Сумасшедшая, но рабочая процедура. Что же на самом деле происходит? Чемодан катается туда и обратно, чтобы на нем в итоге остался замок, который может открыть юрист. Это вполне рабочее и довольно забавное, но все-таки переусложненное решение для безопасной доставки конфиденциального письма. Однако небольшая корректива могла бы сэкономить вам время и деньги, а также сократить выбросы углекислого газа (если курьер ездит не на велосипеде). Вы могли бы сначала позвонить юристу по телефону и попросить его прислать навесной замок. Получив его, вы могли бы повесить этот замок на чемодан, вручить тому же курьеру и отослать все вместе обратно юристу.
Эта идея с навесными замками по-прежнему кажется немного громоздкой, но это уже лучше, чем тройная доставка. Что важнее, именно на этой модели основано асимметричное шифрование.
Настоящий навесной замок приходится доставлять физическими средствами. Но что если бы вопреки всем законам физики он мог бы мгновенно телепортироваться туда, где он нужен? В этом случае мы бы получили эффективное решение проблемы обмена секретной информацией с незнакомцами в материальном мире.
К счастью, в киберпространстве телепортация почти возможна. На концептуальном уровне цифровой «навесной замок» можно передать со скоростью света (например, по электронной почте) и затем с его помощью «защелкнуть» цифровой эквивалент чемодана. Реализация этой идеи позволила бы нам обмениваться секретной информацией с незнакомцами, поскольку при подключении к сайту, который мы никогда прежде не посещали, было бы достаточно воспользоваться цифровым навесным замком. Именно это делает возможным асимметричное шифрование.
Навесной замок теоретически может закрыть любой, но открыть его может только тот, у кого есть ключ. Таким образом его цифровой аналог представляет собой вид шифрования, доступный кому угодно, тогда как возможность расшифровки остается только у заданного получателя. В связи с этим криптографический ключ должен быть известен всем, то есть не должен быть секретным. Такой ключ называют открытым, так как его можно сделать публично доступным. По этой причине асимметричное шифрование часто называют шифрованием с открытым ключом.
С другой стороны, заданный получатель должен быть единственным, кому под силу открыть цифровой навесной замок. Как и в симметричном шифровании, ключ, используемый для расшифровки, должен храниться в тайне. Его обычно называют закрытым ключом, поскольку он принадлежит только получателю, и его нельзя никому раскрывать (аналогично ключу для настоящего, физического навесного замка). В асимметричных шифрах для шифрования и расшифровки используются разные ключи. Тем не менее эти ключи должны быть как-то связаны между собой.
Давайте поразмыслим, что требуется для асимметричного шифрования. Зашифровать данные с помощью открытого ключа может любой, но расшифровать их может только тот, у кого есть закрытый ключ. Таким образом процесс шифрования доступен всем, но только закрытый ключ позволяет его обернуть вспять. Как это возможно?
Если подумать, то жизнь полна примеров того, что легко сделать, но сложно вернуть в первоначальный вид. Взять хотя бы приготовление ужина. Состряпать что-то вкусное с нуля легко, но извлечь исходные продукты из уже приготовленного блюда обычно невозможно, так как химические процессы необратимо изменили их и связали между собой.
Готовка – хорошая, но не идеальная аналогия для асимметричного шифрования, поскольку изначальные ингредиенты уже невозможно получить обратно. В асимметричном шифровании мы хотим сделать обратный процесс невозможным для всех, кроме одного человека – владельца закрытого ключа. Таким образом, расшифровка возможна, но только в особых обстоятельствах. В связи с этим нам придется смириться с небольшим компромиссом. Тем, кому неизвестен закрытый ключ, должно быть крайне сложно выполнить расшифровку.
Метод асимметричного шифрования должен состоять из действий, которые легко выполнить на компьютере, но очень сложно обратить. Превратить людей в интернет-рабов? Забрать их свободное время? Спровоцировать бессонницу? Все это действительно сложно исправить, но нам нужно что-то более точное. Мы должны выбрать вычислительную задачу, которая не составит труда для компьютеров, но ее результаты будут сложно обратимыми.
Чтобы получить представление о разработке методов асимметричного шифрования, стоит поговорить о том, что компьютеру делать сложно.
Представьте, что вам нужно решить непростую вычислительную задачу. Не жалея денег, вы купили мощный компьютер, запрограммировали его и нажали клавишу Enter. Компьютер начал усердно работать. Прошло несколько часов, затем дней. По прошествии недель и месяцев он начал нагреваться. В итоге из его задней панели пошел дым. Что дальше? Купить компьютер побольше и помощнее?
Возможно! Но лучшее ли это решение? Компьютеры – чрезвычайно мощные устройства, способные на удивительные вещи, однако некоторые вычислительные задачи быстро выходят из-под контроля даже на самом производительном оборудовании. Если попросить компьютер выполнить такую задачу, он, может, и не задымит, но результат вы точно не получите.
Чтобы понять, почему это происходит, представьте себе задачу, вполне посильную для человека, но требующую некоторых усилий. Еженедельная уборка в доме подойдет. Сколько времени у вас на нее уходит, скажем, полдня (я живу с человеком, который назвал бы такую оценку оптимистичной)? Да, это работа, и она утомляет, но ее можно выполнить в приемлемые сроки. Допустим, у вас талант к уборке, и вы решили этим зарабатывать. Для начала вам придется прорекламировать свои услуги.
Самая очевидная маркетинговая стратегия – договориться с соседями. Женщина из соседнего дома просит вас прибрать ее дом, и вот у вас уже есть полдня оплачиваемой работы. Потом оказывается, что уборщик нужен семье дальше по улице, да и их соседям по обе стороны. Позвонив еще в несколько дверей, вы расширяете список клиентов до шести. Это уже постоянная работа. Можно было бы остановиться, но вы обнаруживаете, что спрос на услуги уборщиков в вашем районе довольно высок. Вы нанимаете работника, потом другого, и вскоре вам удается построить небольшой бизнес. Можно сказать, что ваше молодое предприятие имеет успех в мире коммерции, и важно, что вам удается полностью контролировать его уверенный рост.
Теперь давайте рассмотрим другую маркетинговую стратегию. В этом сценарии вы решили рекламировать свои услуги в социальных сетях. Допустим, у вас есть 100 друзей, и 10 из них откликнулись на ваше предложение. Это значит, что вы сразу получили работу на неделю вперед. Теперь представим, что в ходе своей рекламной кампании вы попросили друзей поделиться этим предложением со всеми, с кем они дружат. Предположим, что у каждого из них по 100 других друзей, с которыми вы не знакомы, и доля положительных откликов среди них та же (в этом примере мы много всего допускаем, поэтому не стоит зацикливаться на подробностях). Таким образом с вашим предложением ознакомилось целых 10 000 человек, и на вас обрушилась тысяча заявок на уборку. Ого! Если вы не хотите терять этот шанс, вам срочно нужно нанять не меньше сотни уборщиков!
Неожиданно для себя вы начали превращаться из мелкого частного предпринимателя в важную по локальным меркам компанию. Если, упаси боже, каждый из этих 10 000 друзей ваших друзей покажет ваше объявление своим друзьям, круг ваших потенциальных клиентов расширится до миллиона, и вам придется готовиться к еще 100 000 заявок. В мгновение ока затея вышла из-под контроля. Всего за два дополнительных цикла этой вирусной рекламной кампании у вас окажется миллиард клиентов и перспектива убирать все – от иглу в Арктике до соломенных хижин в Калахари.
Суть этого примера в том, что некоторые задачи хорошо и просто масштабируются по мере увеличения чисел, а другие растут экспоненциально и неуправляемо. Это в равной степени касается как домашней уборки, так и вычислительных задач. С некоторыми вещами компьютеры справляются легко. Например, они умеют очень хорошо складывать. Вы можете вводить все большие и большие числа, и компьютер будет покорно возвращать вам их сумму, словно собака палку. В какой-то момент компьютер достигнет предела своих вычислительных возможностей и откажется выдавать ответ. Если вам все равно необходимо сложить эти гигантские числа, достаточно будет купить компьютер помощнее. Но некоторые вычислительные задачи работают совсем иначе: подобно нашему примеру с вирусной рекламой они быстро выходят за рамки возможностей любого компьютера. Даже если взять самое мощное оборудование в мире, в ответ удастся получить лишь мигающий курсор, который так и продолжит мигать, пока вы живы.
Именно сочетание этих разновидностей вычислительных задач необходимо для реализации асимметричного шифрования. Алгоритм шифрования должен быть относительно простой операцией, доступной любому компьютеру. Но компьютер, который попытается выполнить алгоритм расшифровки без ключа, будет лишь беспомощно мигать курсором точно как вы, если бы вам на завтра нужно было найти 100 миллионов уборщиков.
Немногие по-настоящему понимают роль криптографии в защите компьютерных систем (вы как раз на пути к тому, чтобы стать исключением), но один факт, похоже, общеизвестен: безопасность компьютеров имеет какое-то отношение к простым числам. В криптографии они используются повсеместно, однако именно их роль в алгоритмах асимметричного шифрования привлекла к ним больше всего внимания.
Простые числа – это целые числа больше 1 с одним общим элементарным арифметическим свойством: они должны делиться без остатка только на себя и 1. Самое малое из них – 2 (и это единственное четное простое число, поскольку все остальные четные числа делятся на 2 без остатка). Дальше идут 3, 5 и 7. А вот число 9 уже не простое, так как делится на 3. Следующие простые числа – 11 и 13, но не 15, которое делится на 3 и на 5. Эту цепочку можно продолжать до бесконечности, поскольку простых чисел бесконечно много.
В каком-то смысле простые числа – элементарные компоненты всех целых чисел, потому что любое целое число можно получить путем умножения нескольких простых. Например, 4 = 2 × 2, 15 = 3 × 5, 36 = 2 × 2 × 3 × 3. Собственно, любое целое число и есть результат перемножения одного уникального набора простых чисел. Например, 100 = 2 × 2 × 5 × 5. Никакой другой набор простых чисел, умноженных друг на друга, не даст 100. Таким образом простые числа 2,2,5,5, известные также как простые множители 100, составляют его уникальную «ДНК».
Эта прямая связь между числом и его простыми множителями лежит в основе самого известного асимметричного алгоритма шифрования, RSA – по именам его создателей Ривеста, Шамира и Адлемана (Rivest, Shamir и Adleman). Отношения между числом и его простыми множителями формируют типы вычислительных задач, идеально подходящие для асимметричного шифрования: в одном направлении они выполняются относительно легко, а в противоположном оказываются непосильными даже для компьютера.
Простое направление состоит в умножении. Умножить два любых простых числа способен не только компьютер, но и вы сами, если не зевали на уроках математики. Проверьте, если хотите: попробуйте по порядку умножить следующие простые числа, желательно в уме (используйте ручку и бумагу только в случае необходимости!): 3 × 11,5 × 13, 7 × 23, 11 × 31, 23 × 23, 31 × 41.
Как вам такое упражнение? С каждой парой чисел вам, вероятно, требовалось все больше времени, но вряд ли хоть раз вы провозились дольше, чем наливали бы чашку чая.
Позволь вы себе ручку и бумагу, вам, несомненно, удалось бы перемножить более впечатляющие простые числа. Ну-ка, сколько будет 23 189 на 50 021 (не ленитесь, ответ вам понадобится чуть ниже). Используя навыки, мало чем отличающиеся от тех, которые вы усвоили в школе (если вам не удалось справиться с последним упражнением, вы просто подзабыли изученное), компьютеры могут перемножать по-настоящему огромные целые числа. В этом смысле умножение является простой вычислительной задачей. Время вычисления растет по мере роста чисел, но получить результат по-прежнему несложно.
Обратная операция заключается в вычислении простых множителей заданного значения. Мы можем даже знать, что оно состоит из двух простых чисел, умноженных друг на друга. Вопрос в том, что это за числа. Эта задача не выглядит слишком устрашающей и непосильной, однако на компьютере она очень скоро выходит из-под контроля. Числа становятся все больше и больше, и в какой-то момент (неожиданно быстро) даже самые мощные суперкомпьютеры в мире, такие как китайский Sunway TaihuLight с почти 100 петафлопсами вычислительной мощности, начинают растерянно мигать курсорами.
Чтобы получить представление о том, почему вычисление множителей так быстро усложняется, найти два простых множителя для каждого из следующих чисел: 21, 35, 51, 91, 187, 247, 361, 391. Обратите внимание на то, что по мере продвижения вам нужно все больше и больше времени (а ваша голова болит все сильнее).
Сдались, так и не дойдя до конца? А ведь это совсем маленькие числа в глобальных масштабах. Как насчет 83 803? Или, еще лучше, 1 159 936 969? Если у вас уцелел тот листок бумаги, на котором вы демонстрировали свои навыки умножения, вы можете обнаружить, что 1 159 936 969 = 23 189 × 50 021. Но смогли бы вы получить этот результат в уме? Сомнительно, если учесть, что самая очевидная тактика разложения числа на множители заключается в том, чтобы поделить его сначала на наименьшее простое число (2), затем на следующее (3), затем на 5 и т. д. Вам пришлось бы перебрать 2586 простых чисел, пока вы добрались бы до нужного!
Тем не менее в криптографических масштабах 23 189 и 50 021 – это очень мелкие простые числа. В настоящее время в RSA рекомендуется использовать как минимум 450-значные простые множители. Несмотря на такую огромную длину, вы легко перемножите их на своем ноутбуке. Но если поручить суперкомпьютеру Sunway TaihuLight найти эти два простые множителя, в ответ он только замигает…
Безопасность алгоритма асимметричного шифрования RSA опирается на сложность вычисления простых множителей. Если не вдаваться в подробности, основная идея выглядит так.
Когда вам нужно создать цифровой навесной замок, вы сначала генерируете два огромных простых числа, порядка 450 цифр каждое. Эти числа нужно хранить в тайне, так как они, в сущности, составляют ваш секретный ключ (на самом деле ваш ключ – это не просто их сочетание, а то, что из них можно получить, но это уже детали), их должны знать только вы.
Теперь эти два простые числа нужно перемножить. Примерно 900-значный результат этой операции в сочетании с другим значением будет вашим открытым ключом. Вы можете разослать его всем друзьям, опубликовать на своем сайте, да хоть напечатать на визитке. Ваш открытый ключ может увидеть кто угодно. Сложность разложения числа на простые множители гарантирует, что ни у кого нет достаточно мощного компьютера, способного их определить, хотя оба они закодированы в открытом ключе.
Детальное понимание работы шифрования RSA требует знания некоторых аспектов математики университетского уровня, но мы можем это пропустить. Важно то, что любой, кто хочет послать вам зашифрованное сообщение, должен сначала получить ваш открытый ключ (это делается легко, ведь его никто не прячет). Исходный текст преобразуется в число (для этого предусмотрены стандартные методы), а сам же процесс шифрования состоит из последовательных операций умножения с участием исходного текста и вашего открытого ключа.
Шифрование возможно благодаря тому, что умножать числа компьютеры умеют не хуже, чем складывать. Получив зашифрованный текст, вы можете применить к нему операцию расшифровки. Она, конечно, тоже выполнима, так как состоит из последовательности умножений, но на этот раз с участием зашифрованного текста и вашего закрытого ключа. Любому, кто перехватит зашифрованный текст и захочет его прочитать, придется каким-то образом обернуть процесс шифрования вспять, не владея закрытым ключом. Однако для RSA сейчас известен только один способ это сделать: найти два простых множителя, составляющих открытый ключ. Поскольку ни один компьютер не в состоянии проделать это в адекватные сроки, RSA считается надежным механизмом обеспечения конфиденциальности.
Некоторые обороты речи, которые я использовал, заслуживают дополнительного объяснения. Для начала я сказал, что ни один компьютер не в состоянии определить простые множители в адекватные сроки. Заметьте, я не стал утверждать, что это невозможно в принципе: это возможно. Как уже сказано, если пробовать в качестве делителя каждое простое число по очереди, начиная с 2, в конце концов, два простых множителя будут найдены. Но, учитывая реалии современных компьютерных технологий, человечество успеет вымереть или, по крайней мере, эволюционировать в новый вид, прежде чем подберет все возможные простые множители 900-значного числа. Заметьте, что этот аргумент основан на компьютерах, которые мы используем сегодня; чтобы точнее оценить степень безопасности этого алгоритма, необходимо принять во внимание то, какие вычислительные возможности мы ожидаем получить в будущем.
Наверное, еще сильнее тревожит то, что неспособность компьютеров эффективно находить простые множители – не более чем предположение. Утверждать, что простые множители сложно вычислить, можно только на основании того, что нам известно; мы не можем учесть неизвестные нам факторы. Более точное утверждение звучало бы так: даже с использованием самых продвинутых современных методик вычисление простых множителей выглядит сложной задачей. Это не означает, что в будущем какой-то гениальный ребенок или, скажем, искусственный интеллект не разработает новый метод определения простых множителей. Это имело бы катастрофические последствия для любых технологий, в которых используется RSA. Учитывая, сколько всего в киберпространстве защищено этим алгоритмом, такая возможность представляется немыслимой. Но в конце данной книги я все равно попробую поделиться своими мыслями на эту тему.
Исходный код нового алгоритма симметричного шифрования, написанный на обратной стороне конверта, вряд ли удовлетворит строгим требованиям безопасности, которые предъявляются к финалисту конкурса AES. И все же он может оказаться не таким уж небезопасным. В связи с этим было предложено множество симметричных и частично блочных шифров. И хотя большинство из них оставляли желать лучшего, существенная часть списка не обнаружила серьезных недостатков, и они доступны для использования, по крайней мере, теоретически.
Для сравнения, серьезных алгоритмов асимметричного шифрования до сих пор предложено лишь несколько. Цифровой навесной замок должен иметь свойства, которые могут показаться немного нелогичными. Необходимо разработать вычислительную задачу, которую легко выполнить, но сложно обратить вспять, но при этом она должна быть легко обратимой для того, у кого есть специальный фрагмент информации. Подобных задач известно не так уж много.
Впервые концепция асимметричного шифрования возникла в 1970-х годах в двух не связанных между собой организациях: Центре правительственной связи Великобритании (Government Communications Headquarters или GCHQ) и Стэнфордском университете, США. Сначала это открытие, которое в 1990-х могло бы привести к революции в сфере вычислений, произошло в мире спецслужб, но в чисто британском стиле его тихо отложили в сторону.
Интересно, что в обоих случаях изначально появилась лишь идея асимметричного шифрования, без примеров алгоритма, и уже позже другие исследователи подхватили эту идею и описали, как ее можно было бы реализовать на практике. Но самое невероятное – то, что и у правительственных исследователей, и у сотрудников университета в результате работы над практическим примером алгоритма асимметричного шифрования получилась фактически одна и та же концепция RSA.
Это говорит о двух вещах. Во-первых, найти пример алгоритма асимметричного шифрования действительно непросто. Во-вторых, RSA можно в каком-то смысле назвать «естественным» решением. Процесс поиска простых множителей числа активно изучался математиками на протяжении всей истории, поэтому неудивительно, что именно эта вычислительная задача легла в основу попыток разработать алгоритм асимметричного шифрования. Важную роль сыграло и то, что в этом процессе легко разобраться – это само по себе укрепляет доверие к RSA. По сумме всех факторов RSA, вне всяких сомнений, стал важнейшим алгоритмом асимметричного шифрования на грани двадцатого и двадцать первого веков практически во всех сферах, где нужен этот вид криптографии.
Тем не менее RSA – не единственный алгоритм асимметричного шифрования, с которым вы можете столкнуться. Существует по меньшей мере еще одна распространенная альтернатива, основанная на математической концепции под названием эллиптические кривые. Если безопасность RSA опирается на сложность вычисления простых множителей, то в основе эллиптического шифрования лежит сложность операции, известной как дискретное логарифмирование.
Эта прямая связь с конкретной вычислительной задачей является одновременно и сильной стороной асимметричного шифрования, и источником его слабости. Безопасность блочного шифра можно в какой-то мере сравнить с сооружением замысловатой системы баррикад: для доступа к исходному тексту злоумышленнику нужно вырыть тоннель под стеной, разрезать колючую проволоку, угадать, какой из секретных путей ведет к следующей баррикаде, взобраться на скользкий холм, переплыть ров и пробраться через поле кукурузы в человеческий рост. Чтобы блочный шифр стал еще безопаснее, можно нагородить еще несколько линий баррикад, пока не появится уверенность в том, что злоумышленник не пройдет.
В то же время безопасность асимметричного шифрования опирается на вычислительную задачу, вокруг которой построен алгоритм. Если эта задача хорошо исследована и, по всеобщему убеждению, действительно сложна (как в случае с поиском простых множителей), соответствующий алгоритм асимметричного шифрования можно уверенно считать безопасным. Но если вдруг вычислительная задача по какой-то причине окажется не настолько сложной, как полагалось, алгоритм обречен. Что-то вроде защитного костюма из материала, который считается пуленепробиваемым. Если он действительно так прочен, вы в порядке. Если нет… что ж, остерегайтесь громких хлопков.
Эта неопределенность в какой-то мере объясняет скептицизм по отношению к новым алгоритмам асимметричного шифрования: они основаны на вычислительных задачах, исследованных не так глубоко и тщательно, как разложение на множители и дискретное логарифмирование. В конце книги я попробую заглянуть в будущее и объясню, почему этот скептицизм нам нужно преодолеть поскорее.
Как вы уже видели, цифровой навесной замок возможен. Асимметричное шифрование позволяет нам обеспечить конфиденциальность соединения между нашим компьютером и сайтом, который мы никогда раньше не посещали. Мы получаем от сайта открытый ключ, который может, к примеру, быть опубликован на его основной странице, и с помощью этого открытого ключа отправляем веб-сайту зашифрованные данные. Блестящее и элегантное решение!
Но не все так гладко. К сожалению, у концепции цифровых навесных замков есть два недостатка, один серьезнее другого. Они, конечно, не делают всю идею бесполезной, но ложку дегтя все-таки добавляют. Подходы, используемые для их компенсации, диктуют способы применения асимметричного шифрования в реальных современных системах.
Первая проблема присуща даже примеру из материального мира, на котором я показал необходимость асимметричного шифрования. Помните юриста и сверхактивного курьера? Я утверждал, что для эффективной передачи юристу бумажного письма сам юрист должен сначала послать вам навесной замок. Здесь есть подвох, о котором я не упомянул. Курьер подъезжает к вашему дому, звонит в дверь и передает вам пакет с навесным замком – все хорошо, но что если курьер окажется мошенником и подменит навесной замок юриста своим собственным? Вы закрываете чемодан с письмом на замок, будучи уверены, что откроет его только юрист. Но, увы, на самом деле ключ к замку есть только у курьера. Проблема в том, что вы не можете быть уверены в подлинности навесного замка, который вам вручают.
Этот сценарий аналогичен получению открытого ключа от сайта. Откуда мы знаем, что это подлинный ключ, предназначенный для взаимодействия с компанией, которая, как вы считаете, владеет этим веб-сайтом? Что, если сайт был взломан? Действительно ли вы ввели правильный адрес, и на самом ли деле он принадлежит компании, с которой, как вам кажется, вы совершаете транзакцию? История киберпреступлений полна примеров того, как невинные пользователи не сумели отличить поддельные веб-сайты от настоящих. Асимметричное шифрование основано на предположении о том, что, прежде чем что-то шифровать, вы получили правильный открытый ключ. Если в этом есть сомнения, идея теряет всякий смысл.
Чтобы решить проблему с определением подлинности открытых ключей, нам нужно выработать процедуру, которая позволила бы надежно привязывать их к людям и организациям. Это на удивление сложная задача. Как и многие другие технологии, криптография работает блестяще, пока ею не начинают пользоваться живые люди. Мы можем быть как умными, находчивыми, творческими и готовыми принять новые идеи, так и ленивыми, эгоистичными, манипулятивными и наивными. Создание безопасного навесного замка – это одно, а поиск надежной и честной курьерской службы – совершенно другое. Я вернусь к этому острому вопросу позже, когда речь пойдет о том, как можно нарушить работу криптографии.
Но даже если предположить, что нам удалось с какой-то долей уверенности убедиться в подлинности открытого ключа, остается еще одна проблема, на этот раз техническая. Все алгоритмы асимметричного шифрования, известные на сегодня, работают медленно. По крайней мере, медленнее симметричного шифрования. При шифровании данных с помощью AES задержек почти не возникает, но шифрование с использованием RSA требует определенного времени, хотя вы, скорее всего, даже не заметите разницы. Например, на ноутбуке выполнение алгоритма RSA может занять несколько тысячных долей секунды. Кого это заботит, верно? Но для веб-сайта, заваленного миллионами запросов на установление безопасных соединений, задержка уже может оказаться заметной даже человеку.
Давным-давно никто не обращал внимания на секундные задержки. В Англии 1920-х годов, как описывал ее Лори Ли в своей книге Сидр с Рози, героиня с радостью бы запустила шифрование RSA (если бы оно в те времена существовало, и если бы у нее было какое-то устройство, на котором его можно использовать) и пошла бы подоить корову или взбить немного масла, чтобы через час или два получить свой зашифрованный текст.
В современном мире секунды имеют значение. Цены на акции поднимаются и падают в мгновение ока. Покупатели бросают виртуальные корзины покупок, если веб-сайт не успевает вовремя ответить. У пассажиров есть лишь несколько мгновений, чтобы пройти через турникет, прежде чем стоящие за ними люди начнут скандалить. Все должно происходить мгновенно. Эта жажда скорости особенно относится к таким вещам как шифрование, которое никто на самом деле не хочет делать, но которое при этом необходимо. Это означает, что шифрование должно быть очень, очень быстрым.
Симметричное шифрование работает быстро, но у него есть почти нерешаемая проблема с распространением ключей. Асимметричное шифрование медленное, но позволяет загружать ключи прямо с сайтов. У каждого из двух подходов есть положительные стороны, которые удачно дополняют друг друга. Реально ли воспользоваться преимуществами обоих типов шифрования, не пострадав при этом от их недостатков?
Вернемся к нашему любимому примеру и рассмотрим окончательное решение. Курьер доставляет вам навесной замок от юриста. Вы сначала берете обычный ключ (который используется как для закрытия, так и для открытия замка) и закрываете ящик с письмом. Затем вы кладете этот ключ в ящик поменьше и закрываете его на замок, полученный от юриста. Оба ящика курьер передает юристу, который сначала откроет меньший из них, возьмет находящийся в нем ключ и затем откроет большой. Чем сильнее мы усложняем эту аналогию, тем нелепей она становится, поэтому давайте сосредоточимся на веб-сайтах, где это решение выглядит намного логичней.
Эту идею часто называют гибридным шифрованием. Допустим, вам нужно установить безопасное конфиденциальное соединение с веб-сайтом. Сначала вы получаете от сайта открытый ключ. Вы бы рады воспользоваться им для шифрования своих данных, но, к сожалению, асимметричное шифрование работает медленно. Поэтому вы генерируете симметричный ключ и быстро шифруете свои данные с его помощью в формате AES. Затем вы шифруете свой симметричный ключ, используя RSA и открытый ключ, полученный от веб-сайта. Эта процедура быстрее не стала, но симметричный ключ размером 128 бит – это очень небольшой фрагмент данных, намного меньше, чем вся та информация, которую вы хотите передать по защищенному каналу. В итоге вы отправляете два зашифрованных элемента. Веб-сайт сначала (медленно) расшифровывает симметричный ключ, а затем использует его, чтобы (быстро) расшифровать данные, зашифрованные с помощью AES. В этой схеме применяются сильные стороны обоих подходов.
В технологиях повседневного применения асимметричное шифрование почти всегда реализовано в виде гибридного процесса. Как уже говорилось, гибридное шифрование, как правило, предназначено для защиты соединений между двумя компьютерами, как в случае с веб-браузером, который подключается к сайту. Не менее активно оно применяется и для защиты электронных писем: симметричный ключ асимметрично шифруется с помощью открытого ключа, принадлежащего адресату, после чего тело письма шифруется с применением симметричного ключа.
Асимметричное шифрование кажется чудесным; сложно найти для него более подходящий эпитет. На протяжении столетий криптографам приходилось бороться с проблемой распространения симметричных ключей. Они и представить не могли, что у этой проблемы будет криптографическое решение. Идея цифрового навесного замка действительно совершила революцию, сделав возможным безопасное взаимодействие между незнакомцами. В конце 1990-х асимметричное шифрование позволило обеспечить конфиденциальность для растущего взрывообразно круга неопытных пользователей Всемирной паутины. Можно сказать, что успех Интернета, по крайней мере отчасти, стал возможным благодаря чудесам асимметричного шифрования.
Однако не следует недооценивать две уже названные проблемы, присущие использованию асимметричного шифрования. Надежное привязывание пользователей к их открытым ключам – это действительно сложный процесс. И асимметричное шифрование действительно медленное. Где-то в 2000 году началось его стремительное падение на знаменитом графике «цикла хайпа» – от «пика чрезмерных ожиданий» к «избавлению от иллюзий». Примерно тогда компании, испытывающие спад после бурного роста доткомов, начали понимать, что асимметричное шифрование – это чудодейственный эликсир с ложкой дегтя. Чего они не понимали, так это того, что асимметричное шифрование даже в гибридном виде имеет смысл использовать только тогда, когда это действительно необходимо.
Основная проблема заключается в следующем: цифровой навесной замок становится действительно необходим только при работе в относительно открытом окружении, в котором вы не можете контролировать систему в целом (включая пользователей и сеть, лежащую в основе взаимодействия). Именно это происходит, когда вы просматриваете веб-страницы или отправляете электронные письма в разные уголки планеты. Если же вы работаете в закрытом окружении, в котором система находится под вашим контролем, асимметричное шифрование попросту не требуется.
Возьмите любого потребителя технологий шифрования на свой выбор: банки, сотовые операторы, автопроизводители, применяющие электронные ключи, изготовители смарт-карт для проезда в общественном транспорте, создатели контроллеров для беспроводных сетей. Во всех этих примерах кто-то контролирует пользователей системы, используемую сеть, и что важнее всего – процесс распространения симметричных ключей. Если у вас есть возможность контролировать пользователей и спокойно передавать ключи, в асимметричном шифровании нет необходимости. Если вы можете достаточно успешно шифровать данные с помощью одних лишь быстрых симметричных алгоритмов, именно это и следует делать.
Асимметричное шифрование – это инструмент для решения очень специфической задачи: как поделиться секретной информацией с незнакомцем. Решения этой на первый взгляд нерешаемой задачи могут иметь свои недостатки, но важно то, что они находятся в рамках возможного, и их можно использовать, когда (и только!) возникает такая необходимость.