Книга: Криптография. Как защитить свои данные в цифровом пространстве
Назад: 6. Кто там?
Дальше: 8. Дилемма криптографии

7. Взлом криптосистем

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

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

Фундамента недостаточно

Криптография работает. По крайней мере в теории. Тем не менее мы постоянно слышим о том, что ее кто-то «взломал». Письма Марии Стюарт и Наполеона в конце концов были раскрыты, несмотря на использование криптографии. Союзникам удалось расшифровать большую часть переговоров, защищенных с помощью немецких машин Энигма, что дало им огромное преимущество к концу Второй мировой войны. Криптография, применяемая в новых технологиях, часто обнаруживает слабые места. А экспертам-криминалистам иногда удается обходить средства шифрования на изъятых мобильных телефонах. Почему же криптография продолжает подводить?

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

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

Чего же оно не делает?

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

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

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

Использование передовых технологий

Цезарь, судя по всему, был заядлым любителем криптографии. Принято считать, что он применял ее в любых ситуациях, когда его заботила конфиденциальность написанного. Алгоритм, который он применял, вошел в историю как шифр Цезаря и заключался в сдвиге букв алфавита. Величина сдвига была ключом, и, как утверждают, Цезарь обычно сдвигал буквы на три позиции (превращая A в D, B в E, и т. д.).

Шифр Цезаря – это, как правило, первый алгоритм шифрования, с которым знакомятся студенты, изучающие криптографию. Он используется в качестве наглядного примера, а затем студенты узнают, насколько он слабый. Шифр Цезаря слишком прост, он выдает информацию об исходном тексте, у него всего двадцать шесть возможных ключей, а сам ключ раскрывается, как только становится известным хотя бы один фрагмент исходных данных, которые соответствуют зашифрованным. Банковские счета так не шифруют.

Насколько же наивен был Цезарь?

Юлия Цезаря можно называть как угодно, только не наивным. Хитрый политик, дерзкий военачальник и в конечном счете авторитарный глава Римской республики – этому человеку было что скрывать. Любое применение криптографии в те далекие времена можно назвать лишь провидческим. Сам этот факт говорил о том, что человек знает цену информации и умеет ее защищать. Не забывайте, что по крайней мере часть врагов Цезаря была неграмотна. А те немногие, кто умел читать, вряд ли слыхали о криптографии. Перехватив текст, закодированный шифром Цезаря, они бы были одурачены. Юлий Цезарь понимал, что он делает. Его простенький шифр был передовым методом шифрования, и он почти наверняка справлялся со своей задачей. Аве Цезарь!

В конце шестнадцатого века Мария Стюарт вместе со своими пособниками по заговору Бабингтона составила собственные алгоритмы шифрования, чтобы сохранить переговоры в тайне (тому, кто планировал свергнуть Елизавету I, конфиденциальность была жизненно необходима). Но ни она, ни ее соратники не были знакомы с передовыми веяниями в области криптографии, и это их погубило. Если бы она как следует изучила научный труд La cifra del Sig. Giovan Battista Belaso, который Джован Баттиста Белласо опубликовал в 1553 году, наш мир, наверное, выглядел бы совсем иначе. Но вместо этого Мария положилась на ряд алгоритмов, которые были разработаны специально для нее и недалеко ушли от шифра Цезаря. У нее не было ни единого шанса против могущественной секретной службы, находившейся в распоряжении Елизаветы. Королева наняла Томаса Фелиппеса, в своем шестнадцатом веке – фактически криптографа, и, что примечательно, Артура Грегори – специалиста по незаметному распечатыванию писем. Мораль этой истории в том, что для защиты информации зачастую требуется как конфиденциальность, так и целостность данных.

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

Было бы логично надеяться на то, что технологии, которые мы ежедневно используем в киберпространстве, применяют эти чудесные передовые криптографические алгоритмы, не так ли? Ну, в большинстве случаев это действительно так, но не во всех. Существует ряд грустных примеров, когда в новые технологии внедрялись самодельные алгоритмы. Это делалось по самым разным причинам, часть их даже можно назвать в какой-то мере уважительными, например, некоторые алгоритмы разрабатывались для оптимизации производительности в определенных окружениях. Но зачастую причина была в банальном невежестве. Почти все современные попытки повторить «подвиг» Марии Стюарт закончились плохо, хотя, по правде говоря, никто хотя бы не поплатился головой.

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

Известное и неизвестное

Конечно, когда специалисты рекомендуют передовой криптографический алгоритм, это означает, что они его таковым считают, исходя из своих знаний криптографии. Никакой алгоритм никогда не гарантирует абсолютную безопасность. При размышлениях о чем-то неопределенном будет нелишним свериться с легендарной иерархией познаваемости бывшего министра обороны США Дональда Рамсфельда.

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

Частотный анализ – это лишь один из многих способов атаки, большинство из которых намного сложнее, и разработчики современных криптографических алгоритмов должны о них знать. В эпоху Марии Стюарт изобретение частотного анализа привело к переходу на более сложные алгоритмы шифрования, такие как шифр Виженера в исполнении Джованни Баттисты Белласо, в котором одна и та же исходная буква в разных местах исходного текста шифровалась по-разному.

В случае Марии Стюарт частотный анализ принадлежал к категории неизвестного, которая, наверное, не слишком интересовала Рамсфельда с его привилегированным доступом к самой могущественной разведывательной службе в мире. Это было неизвестное известное – то, о чем она не знала, но могла (и, возможно, должна была) знать. Начиная с середины 1970-х, когда криптография начала использоваться широкой общественностью, угрозы неизвестного известного еще не встречались. До этого криптография применялась в основном правительственными и военными организациями, и уже поэтому была окутана тайной.

Когда в конце 1970-х был впервые опубликован алгоритм DES, никто не сомневался, что разведывательные службы знали о криптографии куда больше, чем все остальные. Из-за этой эксклюзивности возникали опасения (вероятно, даже беспочвенные) о том, что алгоритм DES подвержен атакам, о которых могли догадываться только спецслужбы. Оказалось, что подобного рода неизвестные известные действительно существовали, но, похоже, использовались для усиления шифрования, а не для его ослабления. К моменту появления альтернативного алгоритма, AES (который мы обсуждали в главе 3), отставание публичных знаний о криптографии от секретных заметно сократилось.

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

Рамсфельд признал существование известного неизвестного – информации о производстве оружия в Ираке, которой, как он знал, не было у разведки США. Несколько известных неизвестных нависают темными тучами и над криптографией.

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

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

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

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

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

Как спасти мир?

Давайте поговорим о практическом применении криптографии, как это часто показывают по телевизору (например, в фильмах о Джеймсе Бонде).

Два агента спецслужб едут в машине, маневрируя по оживленным городским улицам наперегонки со временем. Водитель паникует и срочно связывается со штабом. Пассажир, занудный на вид компьютерщик, только что вставил в свой ноутбук недавно похищенную флешку. «Что на ней?» – спрашивает водитель. «Она зашифрована», – отвечает компьютерщик. «Можешь взломать код?» – спрашивает водитель. Компьютерщик начинает барабанить по клавиатуре, наблюдая за загадочными символами, пляшущими по экрану, прикусывает губу и медленно выдыхает. «Мне еще никогда не встречался такой способ шифрования; он невероятно сложен. Тот, кто это написал, знал, что делает». – «Но ты можешь его обойти?» – рычит в ответ водитель, пока таймер на экране неумолимо приближается к нулю. Компьютерщик, скривившись, снова начинает стучать пальцами по клавиатуре. Камера фокусируется на ноутбуке, по экрану которого стремительным потоком двигаются неразборчивые данные. Водитель проскакивает на красный свет, обгоняет автобус и едва уходит от лобового столкновения с мотоциклом. Компьютерщик все отстукивает по клавишам, бормоча что-то себе под нос, глаза как блюдца, все лицо выражает увлеченность буйством зашифрованного текста на экране. Водитель решает срезать и внезапно поворачивает направо, обнаруживая, что путь заблокирован мусоровозом. Раздается свист тормозов, водитель вздыхает в отчаянии. Таймер отсчитывает последние секунды. Компьютерщик, задыхаясь, произносит: «Получилось!» И мир опять спасен.

Либо компьютерщик обладал знаниями о неизвестном неизвестном, либо (выражаясь максимально лаконично) это все бред.

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

Ответ может быть только один. Компьютерщик каким-то чудом умудрился перепробовать все мыслимые алгоритмы и подобрать все возможные ключи к каждому из них. Все мыслимые алгоритмы? Сколько всего их существует? На этом даже не стоит заострять внимание: их число так велико, что эту возможность можно уверенно отмести.

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

Давайте исправим этот эпизод нашего шпионского фильма. «Она зашифрована», – отвечает компьютерщик. «Можешь взломать код?» – спрашивает водитель. Компьютерщик начинает барабанить по клавиатуре, наблюдая за загадочными символами, пляшущими по экрану, прикусывает губу и медленно выдыхает. «Похоже, они использовали чрезвычайно сильное шифрование. AES, наверное. Тот, кто его написал, знал, что делает». – «Но ты можешь его обойти?» Тик-так, тик-так, тик-так… Машина со свистом останавливается, водитель вздыхает в отчаянии. Таймер отсчитывает последние секунды. Компьютерщик, задыхаясь, произносит: «Получилось!»

Как бы не так.

Длина ключа имеет значение

Можно не сомневаться, что Юлий Цезарь об этом знал. Участники заговора Бабингтона тоже, по всей видимости, это понимали. Даже вы, скорее всего, в этом уверены, если дочитали досюда. Удивительно, но некоторые разработчики новых средств безопасности недооценивают этот факт. А сценаристы шпионских триллеров и вовсе предпочитают его игнорировать.

Длина ключа имеет значение. Иными словами, количество возможных ключей довольно заметно влияет на безопасность криптографического алгоритма. Ключей много не бывает, а вот мало – запросто.

Двадцати шести, к примеру, недостаточно! Цезарю их, может, и хватало, но для защиты звонков по мобильному телефону нужно что-то получше. Мария Стюарт со своей расширенной версией шифра простой замены находилась в гораздо лучшей позиции с точки зрения длины ключа. У ее алгоритмов было намного больше ключей, чем у вышеупомянутого шифра (хотя у него с этим тоже не было проблем). Длина ключа, который использовала Мария Стюарт, была почти приемлемой по нынешним меркам. Поэтому напрашивается очевидный вывод: длина ключа важна, но это не единственный важный фактор. Достаточный «запас» возможных ключей не гарантирует, что ваша голова останется на плечах.

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

Вернемся к переработанной версии нашего вымышленного фильма и рассмотрим возможность полного перебора ключей в контексте симметричного шифрования. У компьютерщика есть какие-то зашифрованные данные, и он хочет получить из них исходный текст. Он знает (или делает обоснованное предположение) о том, что в качестве алгоритма шифрования использовался AES. Но неизвестен ключ. При отсутствии любой другой информации ему остается только перебрать все возможные ключи один за другим. Предположить ключ, расшифровать, повторить. Снова, и снова, и снова. Если предположить, что исходный текст не был случайным, определить, корректен ли ключ, должно быть довольно просто – экран с непонятным шифром превратится в карту и план предстоящей террористической атаки. Но можно ли найти подходящий ключ вовремя?

Я буду откровенен. Если бы ключ к данным, зашифрованным с помощью AES, был найден простым перебором за несколько минут, компьютерщик был бы невероятным счастливчиком. Сколько на самом деле займет поиск подходящего ключа? В большинстве случаев необязательно пробовать все варианты (это было бы невезением сравнимых масштабов). В среднем при простом переборе ключ находится на полпути. Если бы речь шла о шифре Цезаря, компьютерщик мог бы с легкостью перебрать все 26 возможных ключей, но правильный вариант, скорее всего, нашелся бы где-то на тринадцатой попытке. Он мог бы даже сделать это вручную, но его ноутбук справился бы с этой задачей мгновенно. А что насчет настоящего алгоритма шифрования?

Для чистоты эксперимента заменим ноутбук компьютерщика суперкомпьютером (что в реальности сделать невозможно) мощностью 100 петафлопс (100 000 000 000 000 000 операций в секунду). AES имеет (сколько бы вы думали?) как минимум миллиард миллиардов миллиардов миллиардов (340 ундециллионов для тех, кто любит большие числа) ключей. Примерные расчеты показывают, что полный перебор AES на этом суперкомпьютере занял бы в среднем 50 миллионов миллиардов лет. Это, к сожалению, не поместится в рамки обычной телепрограммы. Если будущее мира зависит от успешного полного перебора AES, мы обречены.

Длина ключа обычно измеряется в количестве бит. Самый короткий ключ AES, на котором были основаны приведенные выше расчеты, занимает 128 бит.

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

Первый аспект заключается в чувствительности длины ключа. В DES ключи имеют размер 56 бит, в два с лишним раза меньше, чем в AES. Но это не означает, что у AES в два раза больше ключей, чем у DES. Увеличение симметричного ключа на один бит удваивает количество возможных ключей, и таким образом ключей у AES в 5 секстиллионов (5000 миллиардов миллиардов) раз больше, чем у DES! Только представьте себе на секунду.

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

Двумя десятилетиями позже ключ DES был найден менее чем за полгода совместными усилиями компьютеров со всего мира, подключенных к тогда еще молодому Интернету. Такое достижение было бы немыслимым в конце 1970-х. На протяжении двух десятилетий DES оставался передовым алгоритмом шифрования, а вычисление его ключей считалось неосуществимым. Но со временем технологии становятся лучше. Рождение AES стало реакцией на осознание того, что длина ключа в алгоритме DES – его слабое место. Современные суперкомпьютеры, которым нужно 50 миллионов миллиардов лет для поиска ключа AES, способны подобрать ключ DES за время, которого не хватит даже сварить яйцо вкрутую.

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

Важно не то, что вы делаете, а то, как вы это делаете

Наполеон Бонапарт на своем горьком опыте узнал, почему так важно использовать качественную криптографию. В 1811 году он заказал разработку передового алгоритма шифрования, известного как Le Grande Chiffre de Paris (великий парижский шифр). Он должен был быть устойчивым к частотному анализу. Используя такие методики, как замену одних и тех же исходных букв множеством разных символов, маскируя часто встречающиеся сочетания букв, этот слегка неуклюжий, но эффективный алгоритм имел шансы взять верх над специалистами-криптографами британской армии и ее союзников.

Le Grande Chiffre был взломан в течение года. Через двенадцать месяцев войска Наполеона неохотно покинули Пиренейский полуостров после поражения в войне, во время которой все их зашифрованные сообщения тайно читали британцы. Еще через два года Наполеона отправили «в отпуск» на остров Святой Елены. Он так никогда и не понял, что использование хорошего криптографического алгоритма не гарантирует безопасность. Не менее важно то, как вы его используете.

Армия Наполеона применяла сильное шифрование, но делала это небрежно. Самой большой ошибкой было то, что военные регулярно шифровали свои послания не целиком. Обмениваясь такой смесью обычного и шифрованного текста, французы сделали британской разведке подарок. Имея на руках фрагменты исходного текста, британские аналитики могли сделать обоснованное предположение о том, каким должен быть остальной текст, и сопоставить свои догадки с ранее перехваченными переговорами. Для нахождения полного ключа Le Grande Chiffre понадобилось не так уж много времени.

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

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

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

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

Соблюдение протокола

Криптографические механизмы редко применяются по отдельности. Мы, как правило, следуем какому-то криптографическому протоколу, включающему разные механизмы, каждый из которых обеспечивает определенные аспекты безопасности. Например, при установлении безопасного соединения с помощью протокола TLS ваш браузер использует один механизм для проведения аутентификации сервера, другой – для конфиденциального обмена данными, и еще третий – для проверки происхождения данных (иногда последние два объединены в один). Протокол TLS дает четкие инструкции о том, что, когда и в каком порядке должно произойти. Если хотя бы один этап протокола терпит неудачу, весь процесс должен быть прерван. Например, если сервер не аутентифицирован, протокол TLS должен завершить работу, не установив безопасное соединение.

У Марии Стюарт были катастрофические проблемы с протоколом, поскольку все ее механизмы безопасности были скомпрометированы. Она полагалась на алгоритм шифрования, который мог взломать Томас Филиппес. Сургучные печати когда-то использовались для защиты целостности самого зашифрованного текста. Если бы этот механизм работал, Филиппес мог бы по-прежнему справиться с шифрованием, но для этого ему пришлось бы сломать печать, что послужило бы предупреждением для Марии. Однако Артур Грегори умел незаметно снимать сургучные печати, поэтому механизм обеспечения целостности данных тоже не сработал. Но расшифровка текста была еще не самой страшной угрозой. Знания о системе, которыми обладал Филиппес, были настолько полными, что он мог подделать сообщение и выдать его за подлинное.

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

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

Наверное, главная проблема заключается в том, что разработка хорошего криптографического протокола – задача крайне сложная. Это частично объясняется тем, что взаимодействие различных компонентов может иметь непредвиденные последствия. В качестве примера плохо спроектированного протокола можно привести WEP (Wired Equivalent Privacy), который когда-то использовался для защиты сетей Wi-Fi. Он был основан на потоковом шифре под названием RC4, который, пожалуй, в момент создания WEP был достаточно устойчивым, но…

Архитектура протокола WEP полна недостатков, и одним из самых серьезных можно назвать постоянное изменение ключа шифрования, с помощью которого обеспечивалась конфиденциальность передаваемых сообщений. В замене ключей как таковой нет ничего плохого, но методика, применяемая в WEP, была далека от оптимальной. В итоге злоумышленник, который достаточно долго наблюдал за общением по беспроводному каналу, защищенному с помощью WEP, мог определить главный ключ, который использовался для защиты сети, и в конечном счете расшифровать весь передаваемый трафик. Этот изъян протокола WEP был замечен не сразу, но оказался фатальным. В современных сетях Wi-Fi для защиты информации, которая по ним проходит, применяются протоколы, продуманные более тщательно (если вы используете беспроводное сетевое оборудование, вам лучше проверить, какой протокол в нем выбран, просто чтобы подстраховаться).

Преодоление разрыва

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

Первая проблема – разрыв между проектом и его реализацией. В 1997 году специалист по безопасности Брюс Шнайер поделился своими наблюдениями касательно реализации криптографии, которые остаются актуальными по сей день:



Между математическим алгоритмом и его конкретной реализацией в аппаратном или программном обеспечении существуют огромные различия. Архитектуры криптографических систем хрупки. Логическая защищенность протокола еще не означает, что он останется безопасным, когда инженер начнет описывать структуру сообщений и передавать биты туда-сюда. «Почти» в этом случае недостаточно; эти системы должны быть реализованы идеально, в точном соответствии с проектом, иначе они не справятся со своими задачами.



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

С тех пор мы узнали много нового о том, как создавать безопасные реализации. Мы лучше понимаем, как писать безопасное программное обеспечение и как лучше защитить систему за счет внедрения безопасных аппаратных компонентов. С другой стороны, криптография применяется для все более широкого круга продуктов, и далеко не все разработчики хорошо разбираются в методах безопасной реализации или готовы их использовать. Из-за ограниченного бюджета и сжатых сроков криптография некоторых продуктов имеет заметные изъяны. Как заметил в 2018 году специалист по безопасности Томас Даллиен, «безопасность улучшается, но масштабы небезопасных вычислений растут еще быстрее».

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

Беда пришла, откуда не ждали

В декабре 1995 года я, тогда еще неопытный исследователь-криптограф, сидел в душном офисе Аделаидского университета, читая публикации в sci.crypt – одной из ранних новостных интернет-групп, посвященной всему, что связано с криптографией. В то время каждый отдельный человек все еще мог быть осведомлен обо всех направлениях, в которых проводились криптографические исследования. Работая в государственном секторе, вы даже могли быть знакомы с большинством криптографов.

Статья, привлекшая мое внимание, принадлежала Полу Кохеру (независимому консультанту в сфере безопасности) и называлась «Временной криптоанализ RSA, DH, DSS». Кохер утверждал, что ему удалось взломать RSA и другие алгоритмы с открытым ключом. RSA взломан? Да он спятил! Я продолжил читать:



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



Сомнений не было: Кохер сошел с ума.

Пол Кохер этой статьей объявил о существовании неизвестного неизвестного. Он не взломал алгоритм RSA, который и сейчас остается не менее безопасным, чем в 1995 году, если сделать поправку на увеличение длины ключа в связи с ростом вычислительной мощности. Он утверждал, что реализации RSA, которые ранее считались безопасными, таковыми не являлись. Проблема была не в небрежных ошибках, которые привели к созданию уязвимых реализаций. Кохер поведал о совершенно новом способе атаки на реализации криптографических алгоритмов, явившемся откуда не ждали. И это действительно навсегда изменило практическое применение криптографии.

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

Именно это и сделал Кохер: он заставил устройство произвести вычисления по алгоритму RSA и затем подробно проанализировал то, как это было сделано. В частности, он тщательно измерил разницу во времени выполнения определенных операций, пока устройство пыталось расшифровать разные данные, зашифрованные с помощью RSA. Ловко подобрав шифротекст, который нужно проанализировать, и операции, которые нужно измерить, Кохер в итоге сумел определить закрытый ключ, с помощью которого проводились операции по расшифровке. Потрясающе!

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

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

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

Как (на самом деле) спасти мир

Дубль два.

Два агента спецслужб едут в машине, маневрируя по оживленным городским улицам наперегонки со временем. Водитель паникует и срочно связывается со штабом. Пассажир, занудный на вид компьютерщик, только что вставил в свой ноутбук недавно похищенную флешку. «Что на ней?» – спрашивает водитель. «Она зашифрована», – отвечает компьютерщик. «Можешь взломать код?» – спрашивает водитель. Компьютерщик начинает барабанить по клавиатуре, наблюдая за загадочными символами, пляшущими по экрану, прикусывает губу и медленно выдыхает. «Похоже, они используют шифрование AES». – «Но ты можешь его обойти?» – рычит в ответ водитель, пока таймер на экране неумолимо приближается к нулю. «Готово», – спокойно заявляет компьютерщик. «Они использовали стандартный ключ. Вот идиоты», – добавляет он. «Эй, так нечестно!» – сетует водитель. «Мы еще даже не доехали до той крутой сцены с мусоровозом!»



Дубль три.

…«Что на ней?», – спрашивает водитель. «Она зашифрована», – отвечает компьютерщик. «Можешь взломать код?» – спрашивает водитель. Компьютерщик начинает барабанить по клавиатуре, наблюдая за загадочными символами, пляшущими по экрану, прикусывает губу и медленно выдыхает. «Они используют шифрование AES». – «Но ты можешь его обойти?» – рычит в ответ водитель, пока таймер на экране неумолимо приближается к нулю. Компьютерщик, скривившись, снова начинает стучать пальцами по клавиатуре. Тик-так, тик-так, тик-так… Водитель решает срезать и внезапно поворачивает направо, обнаруживая, что путь заблокирован мусоровозом. Раздается свист тормозов, водитель вздыхает в отчаянии. Таймер отсчитывает последние секунды. Компьютерщик, задыхаясь, произносит: «Получилось!». Водитель облегченно улыбается. «Дружище, ты гений!» – восклицает он. «Вовсе нет, – парирует компьютерщик. – Они добавили в компьютерную программу незащищенный ключ. Я лишь подсмотрел».



Дубль четыре.

…«Что на ней?» – спрашивает водитель. «Она зашифрована», – отвечает компьютерщик. «Можешь взломать код?» – спрашивает водитель. Компьютерщик начинает барабанить по клавиатуре, наблюдая за загадочными символами, пляшущими по экрану, прикусывает губу и медленно выдыхает. «Они используют шифрование AES». – «Но ты можешь его обойти?» – рычит в ответ водитель, пока таймер на экране неумолимо приближается к нулю. Компьютерщик, скривившись, снова начинает стучать пальцами по клавиатуре. «Похоже, ключ сгенерирован из пароля. Дайте мне минуту». Тик-так, тик-так, тик-так… Водитель решает срезать и внезапно поворачивает направо, обнаруживая, что путь заблокирован мусоровозом. Раздается свист тормозов, водитель вздыхает в отчаянии. Таймер отсчитывает последние секунды. Компьютерщик, задыхаясь, произносит: «Получилось! Эти выскочки всегда используют пароли вроде „Хавьер Бардем“».

Обращайтесь с ключами как следует!

Хороший алгоритм – есть. Надежный протокол – есть. Тщательная реализация – есть. Защита от атак по сторонним каналам – есть. Ничего не забыли?

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

К ключам можно относиться как к живым существам. Они рождаются, проживают свой срок и затем умирают. На протяжении жизненного цикла ключа его следует взращивать. Этот цикл состоит из ряда важных стадий. Сначала ключи генерируются (создаются). Затем они распространяются между теми членами криптографической системы, которым они нужны. Дальше они обычно хранятся в ожидании момента, когда ими воспользуются. В некоторых системах ключи должны регулярно сменяться. В конечном счете необходимость в них пропадает, и их нужно уничтожить.

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

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

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

Представьте, что вы находитесь в бегах и встречаете знакомого, который предлагает вам ночлег. Знакомый дает вам свой адрес и ключ от входной двери. Вы находите дом, открываете дверь и вдруг понимаете, что перед вами стойка регистрации местного отделения полиции. Ваш знакомый оказался полицейским под прикрытием! Хм-м… Почему такая ситуация кажется маловероятной?

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

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

Основная задача управления ключами (key management) состоит в том, чтобы хранить секретные ключи действительно в секрете и гарантировать, что мы используем подходящие ключи в правильном контексте. Это, пожалуй, самый сложный аспект практического применения криптографии в реальных системах, так как он выступает связующим звеном между самой криптографической технологией и организациями/людьми, которым нужно ее использовать.

Хорошие и плохие ключи

Наверное, самым тонким этапом управления ключами является их генерация. Поскольку в симметричной и асимметричной криптографии она выполняется немного по-разному, рассмотрим эти случаи отдельно.

Безопасность симметричного криптографического алгоритма основана на предположении о том, что симметричные ключи сгенерированы случайным образом. У этой идеи есть две проблемы.

Первая: генерировать случайные ключи непросто. На самом деле само понятие «настоящей случайности» вызывает бурные споры между философами и физиками, от которых я предпочту держаться подальше, по крайней мере в этой книге. По-настоящему случайные числа (они же недетерминистические случайные числа) обычно берутся из «естественного» физического источника. Один из самых очевидных способов сгенерировать недетерминистическую случайность состоит в подбрасывании монеты. Если предположить, что монета сбалансирована, а подбрасывающий ее человек непредвзят, каждый результат будет независимым физическим событием, и орел будет выпадать с той же вероятностью, что и решка. Это отличный способ сгенерировать случайный ключ: мы можем закодировать орел как 1, а решку как 0, в результате чего получится криптографический ключ, каждый бит которого не зависит от предыдущих и последующих. С другой стороны, этот способ чудовищно непрактичен для большинства криптографических задач. Хотите купить что-нибудь на моем веб-сайте? Будьте так добры, подбросьте сначала монетку 128 раз, чтобы сгенерировать ключ AES.

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

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

Когда дело принимает крутой оборот, что делают крутые? Они, конечно же, жульничают. Как мы уже не раз обсуждали, вывод хорошего криптографического алгоритма должен казаться «случайным», поэтому криптография сама по себе является потенциальным источником «случайных» данных. Во время звонка ваш телефон и сотовый оператор используют определенный криптографический алгоритм, чтобы сгенерировать новый «случайный» симметричный ключ, с помощью которого можно зашифровать ваш разговор. У телефона и оператора уже есть долгосрочный симметричный ключ, хранящийся на вашей SIM-карте (который вполне мог быть сгенерирован недетерминистическим путем). Этот ключ подается на вход криптографическому алгоритму, который затем возвращает новый общий ключ. Телефон и оператор используют одинаковые ввод и детерминистский алгоритм, чтобы сгенерировать один и тот же ключ. Поскольку этот процесс детерминирован и, как следствие, воспроизводим в двух разных местах, результат нельзя считать по-настоящему случайным. Вместо этого мы называем его псевдослучайным.

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

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

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

Асимметричная криптография включает еще более сложный процесс генерации ключей, поскольку асимметричные ключи – это не «просто случайные» числа. В спецификации любого асимметричного алгоритма есть информация о том, как сгенерировать необходимые ключи. Если придерживаться этих инструкций, никаких проблем возникнуть не должно. К сожалению, люди славятся пренебрежительным отношением к инструкциям, особенно если те кажутся сложными. Результаты расследования многих происшествий показывают, что разработчики просто не соблюдали спецификацию и генерировали некачественные ключи. Например, согласно исследованиям, подавляющее большинство открытых ключей RSA в Интернете имеют общие свойства (в частности, в них используются одинаковые простые множители), что делает их небезопасными. Это не совпадение, а явный признак того, что ключи генерировались не по правилам.

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

Нужный ключ в нужное место

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

Если доставить нужные ключи не туда, куда нужно, это явно создаст проблемы, поэтому никакое внимание, уделенное распространению ключей, не будет лишним. Более того, для этого разработано немало разных методик. Как уже говорилось, во многих случаях ключи распространяются прямо в процессе производства, когда их предустанавливают на устройства (такие как мобильные SIM-карты, брелоки автомобильной сигнализации и т. д.). Иногда распространение ключей не вызывает никаких сложностей, поскольку устройства, которым нужны общие ключи, находятся в непосредственной близости друг от друга (например, вы можете прочитать ключ на нижней крышке маршрутизатора и ввести в устройство, которое подключаете к домашней сети Wi-Fi). В системах с централизованным управлением ключи могут безопасно распространяться с помощью пристально контролируемых процессов и средств управления. Банки выработали высокозащищенные процедуры распространения ключей, которые используются в аппаратном обеспечении банкоматов, банковских карт клиентов и т. д.

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

Распространять ключи сложнее, когда стороны взаимодействия находятся в открытой системе, такой как Интернет, физически далеко друг от друга, и до сих пор не вступали ни в какие деловые отношения, в ходе которых могли бы обменяться ключами. Обычно что-то такое происходит, когда вы делаете покупки в интернет-магазине или инициируете общение с новым контактом WhatsApp. Я уже отмечал, что именно такого рода ситуации мотивируют применение асимметричного шифрования. Гибридная криптография предоставляет механизмы распространения симметричных ключей под защитой асимметричного шифрования. Еще одним широко известным подходом к распространению ключей в таких случаях является протокол Диффи – Хеллмана, который позволяет двум сторонам послать друг другу свои открытые ключи, на основе которых затем можно сформировать общий закрытый ключ.

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

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



Настоящий сертификат подтверждает, что Кайла сдала экзамен по игре на гитаре за второй класс с отличием.



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



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



Сертификат открытого ключа фактически говорит следующее: Настоящий сертификат подтверждает, что открытым ключом веб-сайта www.reallycheapwidgets.com является X, где X – это действительный открытый ключ (настолько длинный, что я не стану приводить его здесь целиком).

Сертификаты делают громкие заявления, но все упирается в то, кто на самом деле эти заявления делает. Если вернуться к сертификатам на моей стене, в первом случае это исполнительный директор объединенного совета Королевской школы музыки; во втором – директор начальной школы Катберта Линдисфарнского; в третьем – Сара Хикмотт, бакалавр наук (с отличием), профессиональный тренер из Pet Necessities. Кому принадлежат эти заявления? Важным людям. Людям, которые должны знать, о чем говорят. Каждая из упомянутых сторон имеет определенный авторитет и пользуется уважением в своей сфере.

Точно так же сертификаты открытого ключа должны быть созданы теми, кто может подтвердить связь между открытым ключом и его владельцем и кому мы можем доверять. В киберпространстве эту роль играет центр сертификации; эту роль может играть как официальный орган (скажем, правительство), так и коммерческий поставщик услуг сертификации. Любой, кто полагается на открытый ключ, должен иметь основания доверять центру сертификации. Если вы не верите, что этот центр добросовестно выполняет свои обязанности, вам не стоит доверять информации, указанной в сертификате. Все просто.

Одна из распространенных ошибок состоит в придании сертификату слишком большого значения. Сертификат подтверждает только то, что в нем написано, и ничего больше. Финлэй может быть суперслушателем в школе, но сохраняет ли он ту же концентрацию дома? Рамон прошел курс дрессировки, но научился ли он там чему-то (или только узнал, что ему нравится сыр)? Тот факт, что в момент подписания сертификата открытым ключом веб-сайта www.reallycheapwidgets.com является X, не означает, что этот ключ будет действителен по истечении какого-то срока, что его можно использовать для шифрования финансовых данных или что угодно еще. Чтобы решить некоторые из этих вопросов, сертификаты открытого ключа обычно содержат дополнительную информацию. Но даже самые подробные из них – не более чем набор фактов, касающихся открытого ключа. Они не дают гарантий или ответов на более глубокие вопросы – например, был ли открытый ключ изначально сгенерирован безопасным образом.

Надежность сертификата определяется качеством механизмов обеспечения целостности, которые его защищают. Сертификат Кайлы напечатан на торжественном пергаменте, украшен различными официальными логотипами, на нем даже есть водяной знак (на двух других – цветные изображения сургучных печатей). Сертификат открытого ключа – виртуальный объект, для обеспечения его целостности необходимо криптографическое решение. Вместо печати центр сертификации использует цифровую подпись. Тот, кто полагается на информацию в сертификате открытого ключа, должен ее проверить, чтобы убедиться в подлинности содержимого. Для этого нужен открытый проверочный ключ, созданный центром сертификации. Поскольку мы должны быть уверены в происхождении этого открытого ключа, он должен быть привязан к центру сертификации средствами еще одного сертификата. Но кто его подписывает?

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

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

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

Не криптографией единой

Вспомним, что происходит с данными во время шифрования: данные… данные… <шифрование – бабах!> зашифрованные данные… зашифрованные данные… <расшифровка – бабах!> данные… данные… Иными словами, между первым и вторым бабахом данные защищены шифрованием. Но перед первым и после второго они у всех на виду.

Звучит как нечто очевидное. Когда данные не зашифрованы, они незашифрованы. Вот так открытие! Однако криптографическая защита нередко дает сбой именно потому, что нам не удается определить, когда и где данные находятся в незашифрованном виде.

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

Когда судебные следователи сталкиваются с зашифрованными данными, они не сдаются и не расходятся по домам. Им прекрасно известно, что данные зачастую находятся где-то рядом, иногда в неожиданных местах – как до шифрования, так и после расшифровки. Наивный обыватель, пытающийся спрятать какую-то информацию на своем ноутбуке, может зашифровать файл и удалить оригинал. На первый взгляд, в папке остаются только зашифрованные данные. Однако удаление не означает полное уничтожение; эта операция просто разрывает связь между самим файлом и названием, по которому его идентифицирует система. Обладая достаточной квалификацией, вы можете порыться в ноутбуке и извлечь безымянный «удаленный» файл.

Как уже отмечалось во время третьего дубля сцены, в которой секретный агент наперегонки со временем отчаянно пытается спасти мир, есть еще один фрагмент информации, который может быть небрежно оставлен в конечной точке – криптографический ключ. Конечно, ключи лучше всего хранить на специальных защищенных устройствах. В качестве легковесного примера можно привести смарт-карты вроде тех, что используются банками и сотовыми операторами. Если вам нужно что-то потяжелее, можете воспользоваться аппаратными модулями безопасности (англ. hardware security modules или HSM) – это специальное оборудование для хранения и администрирования ключей. Извлечь ключ из защищенного устройства непросто. Но если вы решите не заморачиваться и прибегнете к намного более дешевому варианту – предпочтете хранить ключи прямо в программном обеспечении, – то с помощью подробного анализа конечной точки их можно будет обнаружить и расшифровать данные.

Специалист по компьютерной безопасности Джин Спаффорд однажды метко подметил: «Использование шифрования в Интернете – это то же самое, что использовать бронированный автомобиль для доставки реквизитов кредитной карты от человека, живущего в картонной коробке, к тому, который ночует на скамейке в парке». Шифрование работает, но большую часть своего времени в киберпространстве вы все равно находитесь в положении бездомного.

Углеродная форма безопасности

Специалисты по кибербезопасности известны своими (наверное, слишком частыми) заявлениями о том, что «самым слабым звеном» в любой системе безопасности, включая криптосистемы, является человек. Это утверждение подразумевает, что большинство происшествий в этой сфере происходит из-за небрежности или глупости людей, пользующихся системой. Вы выбрали лучший алгоритм, идеально его реализовали, обеспечили наивысшие стандарты управления ключами – и все ради чего? Чтобы какой-то дурак записал свой ключ на стикере и приклеил его к монитору?

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

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

От ошибок и некомпетентности никуда не деться. Лучший способ борьбы с этими угрозами – несомненно, полный отказ от взаимодействия с человеком при использовании криптографии. Неплохой пример – защита телефонных звонков. Вы набираете номер, и телефон соединяется. Вы даже не замечаете, что в этом процессе используется криптография. То же самое касается многих других привычных нам технологий, таких как системы обмена сообщениями в Интернете. Криптографические операции выполняются автоматически, без вмешательства человека.

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

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

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

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

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

Криптография должна служить человеку, а не наоборот. В безопасной криптосистеме взаимодействие между криптографическими механизмами и живыми пользователями должно учитываться еще при проектировании; для этого нужно либо минимизировать взаимодействие с человеком, либо доступно объяснить, как и зачем выполнять тот или иной шаг. В действительности же самым слабым звеном в криптосистеме является неспособность учесть то, как с ней будут взаимодействовать пользователи.

Правильное применение криптографии на практике

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

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

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

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

Назад: 6. Кто там?
Дальше: 8. Дилемма криптографии