Криптография предоставляет механизмы, необходимые для безопасной работы в киберпространстве. Прежде чем исследовать их возможности, нужно разобраться в том, как они устроены. Весь фундамент, на который опирается криптография, состоит из двух главных компонентов: ключей и алгоритмов.
Давайте еще раз проанализируем ваш типичный день в материальном мире и подумаем о назначении некоторых механизмов безопасности, которые в нем фигурируют.
Конверт нужен для того, чтобы только энергетической компании были известны подробности отправленного вам счета. Замок на двери нужен, чтобы только вы могли войти в свой дом. Поведение человека за прилавком аптеки характерно только для настоящего фармацевта. Детали приглушенного разговора с фармацевтом были слышны только вам двоим. Физические свойства денег имеют только настоящие купюры и монеты.
Только, только… суть любого механизма безопасности в том, чтобы те или иные вещи могли происходить только в определенных обстоятельствах. Механизм безопасности можно использовать, чтобы отмежевать себя от других или выделить один из множества элементов. Он дает нам особую возможность. Ключ и замок дают возможность открыть дверь и войти в свой дом. Разговор шепотом дает возможность исключить из него тех, кто находится за пределами слышимости. Защитные элементы купюры позволяют использовать ее в качестве законного платежного средства.
В материальном мире возможности безопасности обеспечиваются разными средствами. Самое очевидное – что-то, чем вы располагаете: ключ, бейдж, билет, рекомендательное письмо. Или то, где вы находитесь – достаточно близко, чтобы расслышать личный разговор, или внутри концертного зала, где проходит мероприятие, на которое вы купили билет. Или что-то, что вам известно – голос друга или то, что для входа в пещеру с сокровищами нужно произнести: «Сим-сим, откройся». Или даже то, кем вы являетесь, как в случае со сканированием отпечатков пальцев или радужки глаза. И, конечно же, особая возможность может обеспечиваться сочетанием подходов. У вашего фармацевта могло быть что-то особенное (бейдж), он мог стоять в особенном месте (за прилавком аптеки), быть кем-то особенным (тем, кого вы раньше видели) или знать что-то особенное (фармакология и порядок назначения лекарств).
Этот последний способ предоставления особых защитных возможностей – что-то, что вам известно – легче всего адаптировать к киберпространству. В криптографии эта особая информация зовется ключом. Термин выбран не случайно: криптографический ключ играет примерно ту же роль, что и дверной. Только тот, кто его знает, может выполнить определенное действие – по аналогии с тем, как открыть дверь в конкретном доме может только обладатель подходящего ключа. В большинстве случаев ключ представляет собой секретный фрагмент информации, знание которого используется в киберпространстве для отличения одного человека от другого. Заметьте, я применил выражение «в большинстве случаев». Пока что предположим, что ключи являются секретной информацией, хотя это не всегда так.
Должен признаться, что выше я выразился не совсем точно. В большинстве случаев взаимодействуют в киберпространстве компьютеры, а не люди; больше того, иногда люди вовсе не принимают активного участия в работе этих компьютеров. Ранее я говорил, что «знание» ключа позволяет отличить одного «человека» от другого; но было бы правильней сказать, что только сущность (человек или компьютер) с доступом к ключу может выполнять определенные действия в киберпространстве.
Самое важное свойство ключа, которое необходимо понимать, состоит в том, что особая возможность входить в дом принадлежит не лично вам, а любому, у кого есть дубликат ключа от вашей двери. То же самое относится и к криптографии. Доступа к подходящему криптографическому ключу достаточно для того, чтобы платить за сотовую связь со счета, делать покупки с помощью банковской карты, загружать фильмы, открывать двери автомобиля и т. д.
Мы пользуемся криптографией ежедневно и в большинстве случаев с применением ключей. Зачастую это происходит неосознанно, но давайте все же поговорим о том, как выглядят криптографические ключи.
Для начала вспомним, как компьютеры представляют информацию. Когда компьютер получает данные, он переводит их в числа, точно так же, как наш мозг превращает увиденное или услышанное в символы языка. Вся компьютерная информация, которую мы храним, передаем и обрабатываем, таким образом, является числовой. Когда мы набираем текст на клавиатуре, компьютер переводит его в цифровые коды и только потом делает с ним то, на что ему дана команда. Когда мы хотим получить информацию назад, компьютер преобразует эти числа в понятный нам текст. Аналогичный процесс происходит, когда мы загружаем на сервер изображения: они состоят из крошечных пикселей, каждый из которых компьютер превращает в число, обозначающее конкретный цвет.
Дальше – сложнее. Компьютер работает не в привычной нам десятичной системе счисления, а в двоичной, состоящей только из нолей и единиц. Звучит страшнее, чем на самом деле: это всего лишь еще один способ записи чисел, у каждого десятичного числа есть двоичное представление и наоборот. Например, десятичное число 17 записывается как 10001 («один ноль ноль ноль один», а не «десять тысяч один») в двоичной системе, а двоичное число 1101 – как 13 в десятичной. Каждую цифру двоичного кода называют битом, и эти биты формируют неделимые единицы числовой информации. Четыре бита составляют ниббл (от англ. nibble – покусывать), а два ниббла – байт (от англ. byte – кусать; и не говорите больше, что у компьютерщиков нет чувства юмора!).
Как правило, информация, которую мы хотим обработать на компьютере, состоит не только из чисел. Допустим, вы набрали на клавиатуре символы «K9!». Прежде чем сделать что-то с этими данными, компьютер должен представить их в двоичном виде. Клавиатурные символы преобразуются в биты по системе, известной как ASCII (American Standard Code for Information Interchange), которая описывает правила сопоставления кнопок клавиатуры и битов. В нашем примере символу «K» по ASCII соответствует байт 01001011, символу «9» – 00111001, а для «!» это будет 00100001. Таким образом компьютер, получивший код ASCII 01001011 00111001 00100001, знает, что для представления пользователю его следует перевести обратно в строку «K9!».
Полезно вспомнить и о размере данных. Поскольку они состоят из двоичных чисел, измерять их проще всего в количестве бит или байтах. Например, число 1011001100001111 имеет длину 16 бит или 2 байта. Для больших данных используются более грандиозные термины, такие как килобайты (1000 байт), мегабайты (1000 килобайт), гигабайты (1000 мегабайт) и терабайты (1000 гигабайт).
Криптографические ключи – это лишь особые элементы данных, поэтому компьютер их тоже должен представлять в виде двоичных чисел. А поскольку размер ключа – одна из важных мер безопасности, упоминания о длине ключей в криптографических алгоритмах нередки. В современной криптографии ключ, как правило, имеет длину 128 бит.
Если постоянно пользоваться криптографическими ключами, возникает вопрос: где они находятся?
Рассмотрим конкретный пример. Каждый раз, когда вы звоните кому-то по сотовому телефону, вы используете криптографию. Безопасность этого процесса опирается на способность сотового оператора отличить вас от остальных 5 миллиардов абонентов на планете. Для этого оператор выдает вам секретный криптографический ключ – число, «известное» только ему и вам, при помощи которого вы сообщаете оператору о попытке сделать звонок. А теперь я объясню, почему это почти соответствует действительности.
Что это за особое секретное число, которое используется для звонка? Это явно не ваш телефонный номер – он не секретный. Криптографический ключ мобильного телефона вам наверняка неизвестен. И тому есть две веские причины, ни одна из которых не сводится к тому, что вам этот ключ знать нельзя.
Первая и, наверное, главная причина в том, что криптографические ключи представляют собой большие числа. Если вас попросят запомнить число от 0 до 10, вы легко с этим справитесь. Скорее всего, вы способны запомнить числа до 10 000 или даже до миллиона, так как числа такой длины часто используют в качестве PIN-кодов (хотя об этом чуть позже). Но в криптографических масштабах 1 миллион – это не большое число. Ключи не просто очень большие, их размер едва ли не за гранью нашего понимания.
В порядке упражнения попытайтесь представить себе количество звезд во вселенной, умноженное на 40 000. Даже если вам удастся это вообразить, вы все равно будете оперировать значениями не того масштаба. Ключи примерно такого размера когда-то действительно использовались, но их давно уже не признают достаточно безопасными в большинстве современных сфер применения криптографии. Теперь мы пользуемся ключами в триллион раз большими. Если у вас от таких чисел начала кружиться голова, то вы уловили суть. Обычный человек не в состоянии запомнить современный криптографический ключ.
Сотового оператора не интересует, кто говорит по телефону и даже с какого аппарата прошел звонок. Оператора заботит, куда послать счет за услуги. Это вторая причина, почему вам неизвестен ключ, который используется в вашем сотовом. Таким образом, оператору нужен какой-то уникальный аспект вашей мобильной учетной записи, которым может быть невообразимо большое число. Именно его вы и получаете при регистрации номера. Это очень маленькая пластиковая карта с крошечным встроенным микрочипом, так называемым модулем идентификации абонента (англ. subscriber identity module – SIM), которая вставляется в ваш телефон. Основное назначение SIM-карты состоит в хранении криптографического ключа. Этот ключ позволяет отличить вашу учетную запись от любой другой на планете, поэтому, если вы одолжите кому-то свой телефон или вставите свою SIM-карту в другое устройство, счет придет именно вам.
Итак, криптографические ключи в большинстве своем являются огромными числами, пользуются которыми непосредственно компьютеры, а не люди. Поэтому большинство ключей находится либо на самих компьютерах, либо на устройствах, которые к ним подключаются. Например, ключи для защиты банковских транзакций хранятся на чипе, встроенном в вашу платежную карту. Ключи к вашей сети Wi-Fi – в вашем маршрутизаторе. Ключи для защиты данных, которыми вы обмениваетесь с интернет-магазином, зашиты в программный код вашего браузера. Криптографический ключ, позволяющий вашей машине открывать дверной замок, когда вы к ней приближаетесь, находятся в брелоке (и пусть вас не вводят в заблуждение слова о так называемой технологии входа «без ключа»: на самом деле ключ здесь двойной, одна его часть физическая, а другая криптографическая). Вы не знаете, какое число представляет любой из этих ключей, но у вас есть доступ к местам, где они хранятся.
Итак, криптографические ключи – это секретная информация, знание которой можно использовать для идентификации той или иной сущности в киберпространстве. Но что насчет таких секретных данных, как пароли и PIN-коды? Можно ли их считать криптографическими ключами?
Не совсем, хотя иногда они таковыми оказываются. В каком-то смысле. Запутались? Неудивительно, различие между этими понятиями и правда тонкое.
Криптографические ключи действительно чем-то похожи на пароли и PIN-коды, но знак равенства между ними поставить нельзя. Пароли и PIN-коды, несомненно, являются секретными данными, необходимыми для обеспечения безопасности в киберпространстве. Но считать ли их криптографическими ключами, зависит от способа применения.
Пароли и PIN-коды в основном применяются для идентификации. Например, когда вы входите в систему, компьютер запрашивает пароль и проверяет его корректность. Если проверка прошла успешно, компьютер выводит на экран приветствие. С точки зрения криптографии в этом нет ничего особенного, так как в основе этого процесса нет шифрования: вы всего лишь предоставляете пароль, чтобы компьютер мог его проверить.
Именно в этом и состоит ключевая проблема входа в систему. Пароль – это секретные данные, которые вам полагается оберегать, но, входя в систему, вы их «выдаете». В каком-то смысле вы теряете контроль, поскольку вам приходится доверять устройству, которому вы передаете их, а заодно всем сетям и устройствам, которым эти данные переправляются далее. Вы вынуждены верить, что все они не допустят никаких злоупотреблений.
Ввод пароля в домашний компьютер вряд ли покажется вам чем-то безрассудным, и вы, конечно же, правы. Но иногда мы взаимодействуем с удаленными компьютерами, например когда вводим пароль для доступа к каким-то ресурсам на веб-странице. В этом случае пароль передается незащищенным по компьютерным сетям, прежде чем дойдет до сервера, на котором физически находится сайт (некоторые хорошо спроектированные веб-сайты используют для защиты паролей криптографию, но не все). Любой, у кого есть доступ к промежуточной сети, сможет прочитать ваш пароль и позже использовать его, чтобы выдать себя за вас. Точно так же, снимая деньги в банкомате, мы «выдаем» свой PIN-код, и важные секретные данные передаются другому устройству.
Криптографические ключи ни в коем случае нельзя так раскрывать. Их используют для демонстрации того, что они вам известны, но сами ключи при этом не раскрываются. Таким образом ключ остается секретным на протяжении всего процесса – как до, так и после использования. Этот уровень секретности имеет куда более строгие требования по сравнению с теми, которые мы предъявляем к паролям и PIN-кодам.
Но иногда криптографические ключи напрямую связывают с паролями: для простоты использования. Как вы помните, они представляют собой огромные числа, запомнить которые нереально. В связи с этим они обычно хранятся на устройствах. Но это не всегда представляется возможным.
Допустим, вы решили скрыть содержимое отдельного конфиденциального файла на своем компьютере с помощью криптографии. Предположим, вы нечасто этим занимаетесь, поэтому в вашей системе не включено автоматическое шифрование файлов (между прочим, вы можете его включить). Таким образом вам придется создать ключ специально для этого случая, который придется как-то запомнить на будущее.
Один из методов запоминания огромных криптографических ключей состоит в том, чтобы вычислять их из паролей. Иными словами, вначале мы выбираем пароль, который компьютер преобразует в число (для этого существуют стандартные процедуры). Дальше это число претерпевает развертывание в намного большее значение (это тоже делается по стандартным алгоритмам), которое можно будет использовать в качестве криптографического ключа. Каждый раз, когда нам нужен этот ключ, мы можем просто вспомнить пароль и вычислить его заново. Сам пароль при этом является не ключом, а его отправной точкой, начальным значением (англ. seed – семя), из которого этот ключ «вырастает».
Пароли и PIN-коды – секретная информация, которую можно запомнить. Это их определяющее свойство, которое в равной мере можно считать важнейшим преимуществом и фундаментальным недостатком. Многие люди выбирают в качестве паролей обычные слова. Двадцать томов Оксфордского словаря английского языка содержат примерно 300 000 слов. В качестве секретных данных пароли и PIN-коды обладают относительно невысоким уровнем защиты, поскольку количество возможных вариантов не слишком-то велико. Это ограничение подчеркивает одно из отличий между «простыми» секретными данными, такими как пароли и PIN-коды, и криптографическими ключами: если вы способны запомнить фрагмент информации, он недостаточно велик для того, чтобы быть хорошим криптографическим ключом.
Криптографические ключи – это секретные данные, которые никогда не «выдаются», а только «используются». Как же это происходит?
Вернемся к механизмам безопасности материального мира. Здесь напрашивается аналогия с дверным замком, в которой фигурирует физический ключ. Предположим, что у вас на двери установлен традиционный замок без какой-либо электронной магии (если у вас цифровой замок, вы практически наверняка открываете свою дверь с помощью криптографии). Чтобы открыть дверь, ключ недостаточно показать. Вы должны вставить его в замочную скважину, повернуть и, если все прошло удачно, войти. Что именно при этом происходит, зависит от типа вашего замка.
Замочный механизм – штука очень точная, но почти невидимая. Например, когда вы поворачиваете ключ по часовой стрелке, он в определенном порядке нажимает внутри замка несколько цилиндров, которые вращают рычаг и, если все правильно настроено, открывают затвор, который физически запирает дверь. Здесь важен тот факт, что в цепочке событий участвует ключ. Если ключ подходит, замок открывается. Если же вставить неправильный ключ, он не сможет открыть затвор, и дверь останется запертой.
Самого наличия физического ключа недостаточно. Ключ должен быть интегрирован в процесс, который в конечном счете приводит к открытию замка. Этот процесс состоит из последовательности отдельных, но точных действий, которые в совокупности отпирают затвор. Выполнено должно быть каждое из этих действий, иначе войти не удастся. Если вставить ключ в замок не до конца, или повернуть его не в том направлении, или если хотя бы один из металлических цилиндров внутри замка не нажат, процесс не увенчается удачей. Больше того, эти действия должны быть выполнены в правильном порядке. Цилиндры не откроют затвор, если ключ не был повернут, а повернуть его можно только после того, как он вставлен в замок.
Обратите внимание: ключ от двери и процесс открытия играют отдельные роли в защите вашего дома. Процесс открытия во многом стандартизован, все замки одной модели открываются одинаково. А вот дверной ключ уникален, у всех замков одной модели должны быть разные ключи.
Поскольку криптографические ключи – это числа, любой процесс, в котором они используются, неизбежно состоит из последовательности математических операций, таких как сложение, умножение, перемешивание или перестановка. Такой вычислительный процесс я далее называю алгоритмом. В сущности, это просто рецепт, содержащий набор действий-ингредиентов и порядок их выполнения. Сделай то, сделай это, затем то, затем это и т. д. и т. п. Число, которое мы получаем в результате, называется выводом алгоритма.
Получение корректного вывода зависит от успешного выполнения каждого шага алгоритма в предусмотренном порядке.
Чтобы приготовить ужин по рецепту, вам понадобятся все ингредиенты. Алгоритм работает похожим образом: вы не получите вывод, пока не подадите что-то на вход. Конкретный ввод алгоритма зависит от того, для каких задач этот алгоритм был создан. У большинства криптографических алгоритмов ввод состоит из данных, которые нужно защитить, и криптографического ключа.
Основная идея заключается в том, что криптографический алгоритм создается общим для всех пользователей системы (например, он может быть реализован на каждом мобильном телефоне, подключенном к сети), но каждый пользователь обладает уникальным ключом. Мы вводим данные и свой ключ в криптографический алгоритм, который затем вычисляет на их основе вывод (и любые изменения данных или ключа приведут к получению другого вывода). Этот вывод представляет собой значение, которое необязательно скрывать (например, его можно передавать по беспроводной сети в ходе телефонного звонка). Он свидетельствует о том, что тот, кто его вычислил, сумел ввести в алгоритм ключ пользователя. При этом сам ключ не раскрывается. Это краткое описание того, как обычно работает шифрование. В следующих главах я покажу, как с помощью этого процесса можно обеспечивать целый спектр разных аспектов безопасности.
Алгоритмы – это рецепты, а ключи – особые и чаще всего секретные ингредиенты. Поскольку вывод криптографического алгоритма путешествует по киберпространству без какой-либо защиты, мы должны позаботиться о том, чтобы тот, кто его прочитает, не смог получить из него ключ. Иными словами, мы с радостью дадим отведать результаты нашей готовки, но не хотим, чтобы кто-нибудь смог определить ингредиенты.
Если просто высыпать все на сковороду и обжарить, возникнет проблема: ингредиенты, несмотря на перемешивание, почти не изменяются. Нам нужно, чтобы криптографический алгоритм уничтожил все признаки исходного ввода. Возможно, более подходящей аналогией будет фруктовый коктейль, ингредиенты которого измельчаются настолько сильно, что от их первоначального вида почти ничего не остается (хотя иногда подсказкой может служить цвет коктейля). Мы хотим перемешать входные значения настолько эффективно, чтобы вывод не содержал никаких признаков того, какими они были. Хороший криптографический алгоритм должен выдавать однородный и бесцветный коктейль.
Цифровым эквивалентом «однородности и бесцветности» является случайность. Этому понятию на удивление сложно дать формальное определение, поэтому я не стану вникать в подробности. Тем не менее ваше интуитивное понимание случайности наверняка в целом верно. Суть случайности в непредсказуемости. У случайно сгенерированных чисел нет очевидных закономерностей. Что важно, связь между случайностью и непредсказуемостью чисел должна сохраняться на протяжении большого количества повторений. Например, если вы подбросите монету пять раз и во всех случаях выпадет орел, результат не покажется вам случайным. Вы можете даже подумать, что монета нарочно разбалансирована. Но, если выпадет орел, решка, орел, орел, решка, в случайности результата не будет сомнений.
На самом же деле эти два исхода одинаково вероятны (если предположить, что монета сбалансирована); шансы на получение каждого из них составляют один к тридцати двум. Настоящей странностью было бы получать пять орлов (или те же орел, решку, орел, орел, решку) при каждых пяти подбрасываниях. На самом деле, если вы будете подбрасывать монету достаточно долго, и на протяжении эксперимента любая последовательность орел-решка будет выпадать заметно чаще, чем один раз из тридцати двух, это означает, что процесс не случайный. Если монета сбалансирована, то для каждой новой серии из пяти подбрасываний ни один исход не окажется вероятнее другого.
Понятие случайности тесно связано с криптографией в двух важных аспектах. Во-первых, секретные криптографические ключи должны генерироваться случайно. В противном случае некоторые из них будут генерироваться с большей вероятностью, чем другие, что поможет тем, кто пытается их подобрать. Именно случайность в сочетании с большой длиной настолько затрудняет угадывание и запоминание криптографических ключей. С другой стороны, пароли редко бывают случайными, поскольку они составлены из запоминающихся слов (например, BatMan1988 или даже B@tM@n1988) намного чаще, чем из бессмысленных сочетаний символов вроде 8zuHmcA4&$. Из-за краткости и недостатка случайности пароли намного уступают криптографическим ключам в плане обеспечения безопасности.
Второй, не менее важный аспект состоит в том, что хороший криптографический алгоритм должен вести себя, словно генератор случайных чисел. Если вы шифруете какие-то данные, результат должен выглядеть «бессмысленным» и не включать значимых закономерностей. Эту случайную, на первый взгляд, информацию можно послать через Интернет, и любой посторонний наблюдатель увидит лишь облако нолей и единиц.
Процесс смешивания, необходимый для защиты нашей деятельности в киберпространстве, еще более требователен. Представьте, что у шеф-повара есть рецепт бесцветного и однородного фруктового коктейля (это лишь аналогия, не судите строго). Он неплох на вкус и перемешан настолько хорошо, что от каждого отдельного ингредиента не осталось и следа. Теперь представьте, что шеф-повар перечисляет вам ингредиенты и тайно готовит новый коктейль, самую малость изменив рецепт (например, чуть больше моркови и меньше яблок). Вы снова пробуете. Тоже неплохо; в общем-то вкус почти такой же, как у предыдущего. А теперь шеф-повар предлагает вам назвать ингредиенты во втором коктейле.
Разумно предположить, что рецепты почти не различаются. Вы можете немного ошибаться, но такой ответ будет близок к истине. Знание состава первого коктейля действительно поможет при вычислении ингредиентов второго. Однако в криптографии такого рода связь очень нежелательна, и аналогия теряет свою наглядность.
Представьте, к примеру, что криптографический алгоритм используется для шифрования похожих балансов на двух банковских счетах. Мы не хотим, чтобы владелец одного счета смог догадаться о балансе другого по их внешнему сходству. Таким образом хороший криптографический алгоритм будет эквивалентом рецепта, настолько чувствительного к ингредиентам, что даже малейшее изменение (один кусочек моркови вместо одного кусочка яблока) приведет к радикальному изменению вкуса коктейля. Иными словами, небольшое изменение ввода криптографического алгоритма должно вызывать непредсказуемые изменения в его выводе. Следовательно, если одному и тому же криптографическому алгоритму подать на вход два почти одинаковых ключа или банковских баланса, должны получиться два никак не связанных между собой вывода. Тот, кто на них посмотрит, не получит ни малейшего представления о том, что два исходных ключа или баланса почти одинаковы.
На этом мы пока что завершим тему перемешивания. Сейчас вам достаточно понимать, что хорошие криптографические алгоритмы не позволяют установить связь между вводом и выводом без знания ключа.
Получить сносный ужин, поджарив накрошенные продукты на сковороде, довольно легко. Но составить рецепт, который удивит кулинарных критиков – совсем другое дело. В высокой кулинарии созданием рецептов занимаются лучшие повара.
В криптографии все обстоит похожим образом. Алгоритм, который, на первый взгляд, работает хорошо, но на самом деле небезопасен, создать легко, тогда как разработка хороших криптографических алгоритмов, которые выдерживают проверку временем, чрезвычайно сложна. К сожалению, некоторые создатели новых технологий предпочитают собирать криптографические алгоритмы на коленке. Уязвимости таких самоделок обычно обнаруживаются уже в первые месяцы после развертывания и порой оборачиваются катастрофой для разработок, которые их используют. Создание криптографических алгоритмов, пригодных для широкого применения в современных условиях, требует изрядного опыта и умений.
Но допустим, вы уже тщательно спроектировали хороший криптографический алгоритм. Какую информацию о нем стоит раскрывать? В конце концов, выдающийся шеф-повар вполне может хранить свои лучшие рецепты в тайне.
В пользу секретности криптографических алгоритмов можно привести как минимум один довод. Представьте, что хакер взломал компьютерную систему и обнаружил базу данных, содержимое которой зашифровано. Ему нужно подобрать секретный ключ. Если в системе использовался хороший криптографический алгоритм, получить ключ из одной только базы данных невозможно. Но знание алгоритма уже может послужить отправной точкой для попытки угадать ключ и расшифровать БД. Шанс на то, что ему повезет, невелик, но он существует. В то же время хакер, у которого нет информации об алгоритме, не будет даже знать, с чего начать расшифровку. Таким образом секретные алгоритмы дают некоторое преимущество по сравнению с теми, о которых известны подробности.
Несмотря на этот довод, большинство криптографических технологий, которые используются для защиты повседневной цифровой деятельности, опираются на общеизвестные алгоритмы. Вся информация о принципах их работы доступна в книгах и на веб-сайтах. Открыто публикуемым алгоритмам отдают предпочтение перед хранимыми в тайне, и тому есть две причины.
Первая состоит в том внимании, которое общеизвестные алгоритмы приковывают к себе. Чем больше людей обращаются к ним, тем крепче уверенность общества в их надежности. Представьте, что вы хотите купить очень безопасный замок для сарая, который возвели в своем саду для хранения золотых слитков (мечтать не вредно). Вы обращаетесь за советом к самому известному мастеру в своем городе. Он показывает вам линейку стандартных устройств – вариаций от традиционных, качественных замков, которые он продает всю свою жизнь. У него есть стенд с разрезанными моделями, чтобы подробно объяснить, как в этих замках работает каждый затвор и стержень. Но самым дорогим экземпляром в его магазине оказывается блестящий WunderLock, только-только появившийся в ассортименте. Вы спрашиваете, как он работает, и мастер признается, что он не имеет ни малейшего понятия, поскольку внутреннее устройство механизма WunderLock засекречено. Производитель его заверил, что замок надежный и стоит своей высокой цены, но сам мастер не ручается за его качество. Покупать или нет?
Предложение может показаться заманчивым. Если это и вправду отличный замок, он обеспечит вам дополнительную безопасность. Любой грабитель будет сбит с толку загадочным сверкающим предметом на двери сарая и, если повезет, любые попытки увести ваше золото закончатся неудачей. Таким образом покупка дорогого замка может окупиться, но в то же время вы рискуете. Вы вынуждены довериться производителю и его заявлениям о том, что замок действительно очень безопасный. У вас нет возможности опереться на опыт вашего местного (или, если уж на то пошло, любого другого) мастера. Большинство специалистов, которые всю жизнь исследуют устройство и безопасность замков, не смогут вам ничего подсказать о том, насколько в действительности хороша модель WunderLock.
Необходимо понимать, что эта проблема касается не только рекомендаций перед покупкой. Ваш новенький WunderLock может отлично служить год или два, пока однажды вы не обнаружите пустой сарай. Позже в новостях вы прочитаете, как находчивые воришки обнаружили, что настойчивое постукивание по WunderLock слесарным молотком отпирает его затвор. Об этом слабом месте стало бы известно раньше, если бы все слесари знали о внутреннем устройстве этого замка. Кто-то где-то как-то заметил бы этот дефект.
Не так давно (примерно полвека назад) криптографических алгоритмов было всего несколько, и в основном их использовали для военных задач и разведки. Мало кто в целом мире имел хоть какое-то представление об их устройстве и принципах работы. Алгоритмы разрабатывались под грифом строжайшей секретности, и, скорее всего, каждый специалист в этой области так или иначе имел отношение к разработке. Более того, эти специалисты пользовались полным доверием очень узкого круга избранных людей, прямо зависящих от этих алгоритмов.
И все это имело очень опосредованное отношение к криптографии в ее нынешнем виде. Можно выделить два важных отличия. Во-первых, в наши дни существует активное глобальное сообщество исследователей и разработчиков с опытом создания криптографических алгоритмов. Все они попросту не могут быть вовлечены в разработку секретного алгоритма. Любой алгоритм, внутреннее устройство которого засекречено, немедленно привлекает к себе повышенный интерес этого сообщества и может вызвать подозрения. Если его не решились выставить на всеобщее обозрение и позволить желающим его проанализировать, может быть, с ним что-то не так? Во-вторых, мы все используем устойчивые криптографические алгоритмы, и потому нам необходимо им доверять. Криптографический эквивалент WunderLock в основе системы безопасности здорово повышает градус риска. Зачем, если нам доступны проверенные алгоритмы, пользующиеся всеобщим уважением?
Вторая причина, конечно, более основательна. В наши дни держать алгоритмы в тайне почти невозможно. Пятьдесят лет назад криптографические алгоритмы поставлялись в больших металлических ящиках с жестким ограничением доступа. Сегодня же криптография применяется в потребительских технологиях, и алгоритмы, реализованные в программном обеспечении, почти невозможно скрыть. Даже если они созданы чисто аппаратными, держать в тайне принципы их работы очень сложно, учитывая, сколько людей имеет доступ к начиненным ими устройствам. Специалисты могут проанализировать технологию и ее поведение, чтобы разобраться в работе алгоритма – этот процесс называется обратным проектированием (англ. reverse engineering).
Любой, кто занимается внедрением секретных криптографических алгоритмов, должен исходить из того, что однажды (возможно, раньше, чем хотелось бы) они станут публичными. Об этом говорит не только свежий опыт. В конце девятнадцатого века, задолго до применения криптографии для компьютерных сетей, уважаемый датский криптограф Огюст Керкгоффс сформулировал шесть принципов проектирования криптографических алгоритмов. В те времена алгоритмы (или системы, как называл их Керкгоффс) применяли вручную к письменным текстам. Керкгоффс был мудрым человеком. Вот один из этих принципов: система не должна требовать секретности, и ее попадание в руки врага не должно вызывать проблем.
Я убежден, что в сфере криптографии хранение рецептов в тайне не только вряд ли полезно, но и далеко не всегда возможно. В первую очередь это касается популярных рецептов, рассчитанных на широкое использование.
Давайте обсудим.
Рассмотрим два совершенно разных, но одинаково популярных во всем мире секретных рецепта. Производители Coca-Cola утверждают, что рецепт их напитка является одной из самых надежно охраняемых тайн в мире, и для его защиты предусмотрена тщательно продуманная процедура. Наличие секретной формулы для Coca-Cola чем-то похоже на попытку защитить мобильный телефон за счет использования секретного криптографического алгоритма. Сложно найти человека, который бы ни разу не пробовал Coca-Cola и не пользовался сотовой связью. Хранение в тайне алгоритмов, на которых основано то и другое, – крайне непростая задача.
Когда-то мобильные телефоны и правда были защищены секретными алгоритмами: архитекторы первых сотовых сетей считали, что это предоставляло дополнительную безопасность. Однако со временем эти алгоритмы были воссозданы и оказались не настолько безопасными, как было принято считать. Сегодня сотовые операторы согласны с тем, что преимущества глобальной известности их криптографических алгоритмов существенно перевешивают любую сомнительную пользу от их засекречивания. В сфере мобильной связи секретные рецепты вышли из моды.
Так как же компании Coca-Cola удается успешно хранить свой рецепт в тайне? Дело в том, что этот рецепт, строго говоря, не совсем секретный. Процесс (алгоритм) создания газированных напитков широко известен, равно как большинство ингредиентов Coca-Cola специалисты уже опознали или угадали. И в самом деле, несколько компаний сейчас производят напитки, настолько похожие по вкусу на Coca-Cola, что большинство людей не может их отличить. Тайной окутано только происхождение одного из ингредиентов в этой формуле, известного как Merchandise 7X. В этом отношении секретность 7X подобна секретности криптографического ключа. Алгоритм общеизвестен, но, заменяя 7X другими ароматизаторами, можно изобрести целый спектр газированных напитков. Как и в случае с мобильными телефонами, рецепт Coca-Cola уже никто не скрывает, а уникальность напитка зависит от сохранности ключевого ингредиента.
Понимание того, что алгоритмам и ключам в криптографии отводятся разные роли – одна из действительно важных вещей.
Алгоритмы – это машинное отделение криптографии, которое определяет и проводит необходимые вычисления. С точки зрения пользователя, они работают в фоне, и на них можно не обращать внимания. Даже опытные специалисты по кибербезопасности редко работают с алгоритмами напрямую; им обычно достаточно знать, каким алгоритмом защищена система, за которую они отвечают.
Ключи – это секретные данные, на которые опираются механизмы безопасности, предоставляемые криптографией. В этом смысле они входят в состав интерфейса между технологиями и пользователями. В отличие от алгоритмов, общих для всех и вся, ключи уникальны и принадлежат отдельным пользователям или устройствам, а значит, требуют особого внимания. Криптографические алгоритмы, которые мы используем, известны всем. Но если кто-то завладеет нашими личными криптографическими ключами, все наши защитные меры в киберпространстве обнулятся.
Если говорить об использовании криптографии для обеспечения безопасности в киберпространстве, алгоритмы важны, но ключевую роль играют ключи.