Страница:
К этим числам нужно относиться с некоторым скептицизмом. Я – не ясновидящий и ничего не знаю о будущих достижениях компьютерных технологий. Реальная безопасность зависит от нескольких вещей: насколько ваши данные ценны, как долго их требуется хранить в тайне и т. п. Но это означает, что должны существовать «законсервированные» числа – длины ключей для симметричных алгоритмов и MAC. Хэш-функции должны иметь длину, равную удвоенной длине ключа.
Длина ключа для симметричного алгоритма открытого ключа определяется более сложным образом. Наиболее эффективная атака против RSA, например, состоит в том, чтобы разложить на множители большое число. Наиболее действенная атака против Эль-Гамаля, алгоритма Диффи-Хеллмана, DSA и других систем – вычислить нечто, называемое дискретным логарифмом. (По существу, это – та же проблема.) Алгоритмы эллиптических кривых еще более сложны.
Для алгоритмов с открытым ключом специалисты сейчас рекомендуют 1024-битовые и более ключи. Параноики используют ключи еще длиннее. Системы, для которых не слишком важна долговременная секретность, пользуются 768-битовыми ключами. (Для алгоритмов эллиптических кривых применяют разные длины ключей.)
Трудно оценивать будущие трудности разложения на множители и вычисления дискретных логарифмов, поскольку нет никакого математического доказательства, что эти задачи имеют фиксированную степень сложности. (С другой стороны, мы знаем, насколько трудно перебирать все возможные ключи.) Итак, еще раз: отнеситесь ко всем этим рекомендациям, как к мнению квалифицированных специалистов – и не более того.
Глава 7
Длина ключа для симметричного алгоритма открытого ключа определяется более сложным образом. Наиболее эффективная атака против RSA, например, состоит в том, чтобы разложить на множители большое число. Наиболее действенная атака против Эль-Гамаля, алгоритма Диффи-Хеллмана, DSA и других систем – вычислить нечто, называемое дискретным логарифмом. (По существу, это – та же проблема.) Алгоритмы эллиптических кривых еще более сложны.
Для алгоритмов с открытым ключом специалисты сейчас рекомендуют 1024-битовые и более ключи. Параноики используют ключи еще длиннее. Системы, для которых не слишком важна долговременная секретность, пользуются 768-битовыми ключами. (Для алгоритмов эллиптических кривых применяют разные длины ключей.)
Трудно оценивать будущие трудности разложения на множители и вычисления дискретных логарифмов, поскольку нет никакого математического доказательства, что эти задачи имеют фиксированную степень сложности. (С другой стороны, мы знаем, насколько трудно перебирать все возможные ключи.) Итак, еще раз: отнеситесь ко всем этим рекомендациям, как к мнению квалифицированных специалистов – и не более того.
Глава 7
Криптография в контексте
Если криптография так надежна, то почему же происходят сбои в системах защиты? Почему существуют электронные кражи, мошенничество, нарушения конфиденциальности и все прочие проблемы безопасности, которые обсуждались в предыдущих главах? Почему криптография не соответствует всем без исключения требованиям безопасности? Зачем я докучаю вам такой толстой книгой?
Достаточно неожиданно, но причина этого не в плохом качестве криптографии. (Многое лежит на поверхности, но есть и проблемы, упрятанные гораздо более глубоко.) Ответ нужно искать в различии между теорией и практикой.
Криптография – это раздел математики. Математика – теоретическая наука; она логична. Хорошая математика исходит из правильной предпосылки, следует единственным путем – доказательство за доказательством – через неизведанные земли и заканчивается неопровержимым выводом. По природе своей она хорошо выглядит на бумаге.
Корни проблем безопасности следует искать в физическом мире. Материальный мир во многом нелогичен. Он неупорядочен. В нем не существует единственного пути. В нем есть теории и выводы, но для того чтобы согласиться с выводами, вам необходимо принять предпосылки, модели и взаимосвязи между теориями и реальным миром. А это непросто. Люди не играют по правилам. Они делают то, чего от них не ожидают; они не укладываются в жесткие рамки. То же самое касается технических средств: время от времени все начинает плохо работать, а то и вовсе ломается. Это же можно сказать о программном обеспечении. Оно должно быть логичным и упорядоченным, как-никак это – просто комбинация нулей и единиц, но иногда оно настолько сложно, что становится больше похожим на организм, а не на творение математики. Неважно, насколько хороша криптографическая теория: когда она используется в системе, она сталкивается с практикой.
Я часто говорю о программах, что они – лишь дань моде. Когда реклама утверждает, что используется RSA, тройной DES или любой другой модный алгоритм криптографии, это равносильно заявлению о том, что дом полностью безопасен только потому, что у него надежный дверной замок. Этого недостаточно.
Внутри замка на входной двери вашего дома есть множество штырьков. Для каждого из них существуют различные возможные положения. Когда кто-то вставляет ключ в замочную скважину, все штырьки перемещаются в определенные позиции. Если положение, в которое ключ ставит штырьки, как раз то, которое необходимо, чтобы замок открылся, то он открывается. Если нет – не открывается.
У замков, наиболее часто используемых в жилых домах, пять штырьков, каждый из которых может располагаться в одном из десяти различных положений. Это означает, что существует 100 000 возможных ключей. Взломщик с огромной связкой ключей может перебрать все ключи один за другим и в конце концов попасть внутрь. Ему лучше набраться терпения, поскольку если даже он тратит на один ключ 5 секунд, ему потребуется примерно 69 часов, чтобы найти подходящий ключ (и это без перерывов на сон, еду и душ).
Однажды в вашу дверь звонит торговый агент и предлагает вам купить новый замок. У его замка семь штырьков по двенадцать положений у каждого. Агент скажет, что взломщику придется три года непрерывно перебирать ключи, прежде чем он сможет открыть дверь. Почувствуете ли вы себя в большей безопасности с таким замком?
Наверное, нет. Все равно ни один взломщик не стал бы стоять перед вашей дверью 69 часов. Он, скорее всего, откроет замок отмычкой, просверлит его, вышибет дверь, разобьет окно или просто спрячется в кустах до тех пор, пока вы не отправитесь на прогулку. Замок с большим количеством штырьков и положений не обеспечит вашему дому большую безопасность, поскольку атака, которая таким образом затрудняется – перебором еще большего количества ключей – не та атака, о которой стоит задумываться особо. До тех пор пока количества штырьков достаточно, чтобы сделать недопустимой такую атаку, вам не следует о ней беспокоиться.
То же самое справедливо для криптографических ключей. Если они достаточно длинные, то лобовые атаки просто лежат за пределами человеческих возможностей. Но здесь следует позаботиться о двух вещах. Во-первых, о качестве алгоритма шифрования, а во-вторых, о качестве ключа. Какой ключ является «достаточно длинным», зависит от обеих этих вещей.
Но в первую очередь нужно разъяснить понятие энтропии.
Энтропия – мера беспорядка или, более конкретно в контексте криптографии мера неопределенности. Чем больше неопределенность, тем больше энтропия. Например, случайно выбранный человек из обычной популяции является или мужчиной, или женщиной, в этом случае переменная «пол» составляет один бит энтропии. Если случайный человек сообщает, кто из четырех «Битлз» ему больше нравится, и все варианты равновероятны, этому соответствуют два бита энтропии. Пол члена женской олимпийской команды по бегу – это величина, у которой нет энтропии – они все женщины. Энтропия предпочтений одного из «Битлз» на собрании фан-клуба Джона Леннона существенно меньше двух битов, поскольку наиболее вероятно, что выбранный наугад человек предпочитает Джона. Чем больше определенность переменной, тем меньше энтропия.
То же самое верно для криптографических ключей. То, что алгоритм использует 128-битовый ключ, не означает, что у него 128 бит энтропии для ключа. Или точнее, лучший способ сломать данную реализацию 128-битового алгоритма шифрования может состоять не в том, чтобы перебрать все ключи. «128 бит» – это просто мера максимального количества работы, которая потребуется, чтобы восстановить ключ; но про минимум ничего не сказано.
Во-первых, следует позаботиться о происхождении ключа. Все вычисления, касающиеся длины ключа, я производил, предполагая, что каждый ключ имеет при создании максимальную энтропию. Другими словами, я рассчитывал, что все варианты ключа равновероятны, что генератор случайных чисел, создавший ключ, работает идеально. Это допущение не совсем верно.
Многие ключи создаются на основе паролей и ключевых фраз. Система, принимающая пароль из 10 ASCII-символов, предоставляет для него 80 бит, но ее энтропия будет значительно меньше 80 бит. Некоторые символы ASCII никогда не появляются, а пароли, которые представляют собой реальные слова (или что-то похожее на слова), гораздо вероятнее, чем произвольные строки символов. Я видел оценки энтропии для английского языка, меньшие 1,3 бит на символ; у пароля энтропия меньше, чем 4 бит на символ. Это значит, что пароль из 8 символов будет приблизительно соответствовать 32-битовому ключу, а если вы захотите 128-битовый ключ, вам нужен пароль из 98 символов (на базе английского алфавита).
Видите ли, разумный взломщик не будет перебирать все возможные пароли по порядку. Он сначала испробует наиболее вероятные, а затем проверит остальные – в порядке убывания вероятности. Он проверит тривиальные пароли (типа «пароль» или «1234»), после этого – весь английский словарь, а затем различные заглавные буквы, цифры и т. п. Это называют словарной атакой. Программа для взлома пароля, реализующая такую атаку, называется L0phtcrack; на 400-мегагерцовом Quad Pentium II она может протестировать зашифрованный пароль по 8-мегабайтовому словарю распространенных паролей за считанные секунды.
Вот почему смешно, когда компании вроде Microsoft рекламируют 128-битовое шифрование, а затем берут за основу ключа пароль. (Это в высшей степени характерно для всей системы безопасности Windows NT[22].) Используемые алгоритмы могут допускать 128-битовый ключ, но энтропия пароля гораздо меньше. Фактически, качество криптографии и длина ключа не важны; причиной выхода системы из строя послужит слабый пароль. (Очевидное решение – не допустить, чтобы люди перебирали множество паролей, – не срабатывает. Я подробнее остановлюсь на этой проблеме в главе 9.)
Это очень важно. Я знаю сложные системы, секретный ключ которых защищен паролем. В основе безопасности практически любого зашифрованного продукта на жестком диске компьютера лежит ключ, запоминаемый пользователем. Почти вся система безопасности Windows NT приходит в негодность из-за того, что она построена на основе пароля, запоминаемого пользователем. Даже система PGP (Pretty Good Privacy) распадется, если пользователь выберет плохой пароль.
Не важно, какие алгоритмы и насколько длинные ключи используются; секреты, которые хранятся в памяти пользователя, беззащитны сами по себе.
Ключ, сгенерированный случайным образом, намного лучше, но проблемы остаются. Генератор случайных чисел должен создавать ключи с максимальной энтропией. Недостатки генератора случайных чисел – те же, что привели к сбоям системы шифрования в Netscape Navigator 1.1. Хотя генератор случайных чисел применяли для создания 128-битовых ключей, максимальная энтропия достигала примерно 20 бит. То есть алгоритм был не лучше, чем если бы использовался 20-битовый ключ[23].
Второй предмет заботы – это качество алгоритма шифрования. Все предыдущие расчеты предполагали, что алгоритм получал ключи при помощи вычислений и использовал их совершенным образом. Если в алгоритме есть слабые места, доступные для атаки, это существенно снижает энтропию ключей. Например, алгоритм А5/1, используемый европейской сетью сотовых телефонов GSM, имеет 64-битовый ключ, но может быть взломан за время, требующееся для взлома 30-битового ключа при помощи атаки «в лоб». Это значит, что хотя у алгоритма имеется ключ с 64-битовой энтропией, он задействует для ключа только 30 бит энтропии. Вы можете с тем же успехом использовать хороший алгоритм с 30-битовым ключом.
По этой причине проходит довольно много времени, прежде чем шифровальщики начинают доверять новому алгоритму. Когда кто-то предлагает новый алгоритм, у него есть определенная длина ключа. Но обеспечивает ли алгоритм реально ту энтропию, которая заявлена? Может потребоваться несколько лет анализа, прежде чем мы поверим, что он это делает. И даже тогда мы можем легко ошибиться: возможно, кто-то придумает новые математические подходы, которые понизят энтропию алгоритма и сломают его. Поэтому рекламу программ, в которых обещаются тысячебитовые ключи, трудно воспринимать серьезно – ее создатели не имеют понятия, как работают ключи и энтропия.
Похожая проблема существует и для физических ключей и замков. Принято думать, что слесарь возит в своем грузовике огромное кольцо с ключами от машин. Может потребоваться 10 000 ключей, чтобы открыть все замки, но в реальности несколько дюжин ключей откроют любой из них. Иногда слесарю достаточно просто взять другой ключ, отличающийся от предыдущего на 1-2 «бита», – отметим, что это комбинация анализа и лобовой атаки – и этого уже достаточно. Да, процесс долгий, но совсем не такой, как проверка всех 10 000 возможных ключей (старые замки – четырехштырьковые). Действительная надежность дверного замка существенно отличается от теоретической.
То же самое с комбинациями замков. Вы можете перебрать все возможные комбинации – и существуют машины для взлома сейфов, которые так и делают, – или поступить хитрее. Современные машины для взлома сейфов применяют микрофон, чтобы слушать звук, производимый дисками, когда их поворачивают, и они могут открыть сейф намного быстрее, чем старые, действующие «в лоб».
Сказанное здесь заставляет очень внимательно подходить к выбору алгоритма. Мы еще обсудим это более детально в конце этой главы.
Вспомним понятие расстояния уникальности. Оно возрастает при увеличении длины ключа. Когда длина ключа приближается к длине сообщения, расстояние уникальности стремится к бесконечности. Это означает, что невозможно восстановить открытый текст, и это доказывает безопасность одноразового кодирования.
Но, с другой стороны, это практически бесполезно. Поскольку ключ должен при этом быть такой же длины, как и сообщение, то проблема не решена. Единственный здравый подход к шифрованию должен предполагать, что очень длинная секретная информация – сообщение – превращается с его помощью в очень короткую секретную информацию – ключ. При помощи одноразового кодирования вы нисколько не сокращаете секретную информацию. Так же сложно доставить шифр получателю, как и доставить само сообщение. Современная криптография зашифровывает большие объекты, например цифровые фильмы, соединения через Интернет или телефонные разговоры, и такое шифрование практически невозможно осуществить, работая с одноразовым кодированием.
Одноразовое кодирование практически использовалось в особых случаях. Русские шпионы применяли для общения алгоритм одноразового кодирования, используя карандаш и бумагу. Агентство национальной безопасности (NSA) раскрыло эту систему, поскольку русские использовали ее повторно. Горячая линия телетайпа между Вашингтоном и Москвой была зашифрована именно таким образом.
Если утверждают, что некая программа использует этот алгоритм, то здесь почти наверняка обман. А если и нет, то программа наверняка непригодна для использования или небезопасна.
Например, предположим, что Алиса хочет сохранить в тайне некоторые файлы данных. Вот протокол, который это делает. Алиса выбирает пароль или даже лучше – ключевую фразу. Криптографические программы хэшируют этот пароль, чтобы получить секретный ключ, а затем, применяя симметричный алгоритм, зашифровывают файл данных. В результате получится файл, доступ к которому есть только у Алисы или у того, кто знает пароль.
Хотите создать безопасный телефон? Используйте криптографию с открытым ключом, чтобы сформировать сеансовый ключ, а затем при помощи этого ключа и симметричной криптографии зашифруйте переговоры. Хэш-функция обеспечивает дополнительную безопасность против атак, проводимых человеком. (Подробнее об этом позже.) Чтобы засекретить сообщение электронной почты, воспользуйтесь криптографией с открытым ключом для соблюдения секретности и схемой цифровой подписи для аутентификации. Электронная торговля? Обычно для нее не требуется ничего, кроме цифровых подписей и, иногда, шифрования для секретности. Секретный контрольный журнал? Возьмите хэш-функции, шифрование, может быть, MAC и перемешайте.
То, что мы сейчас делаем, и есть создание протоколов. Протокол – это не сложнее, чем танец. Это последовательность заданных шагов, которую выполняют два (или больше) партнера и которая предназначена для решения поставленной задачи. Представьте себе протокол, которым пользуются продавец и покупатель при покупке мандаринов. Вот необходимые шаги:
1. Покупатель спрашивает у продавца мандарины.
2. Продавец дает ему мандарины.
3. Покупатель платит продавцу.
4. Продавец возвращает ему сдачу.
Все, о ком идет речь в протоколе, должны знать шаги. Например, покупатель знает, что он должен заплатить за мандарины. Все шаги должны быть однозначны: ни продавец, ни покупатель не могут достичь шага, на котором они не знают, что делать. Кроме того, протокол должен обязательно завершаться – в нем не должно быть бесконечных циклов.
Шаг 2 не будет работать как надо, если продавец не поймет семантическое содержание шага 1. Продавец не выполнит шаг 4, если на шаге 3 не признает деньги настоящими. Попробуйте купить мандарины в США на польские злотые и посмотрите, как вам это удастся.
Нас особо волнуют протоколы безопасности. Кроме всех перечисленных выше требований мы хотим, чтобы покупатель и продавец не имели возможности обманывать (что бы ни означало «обманывать» в нашем контексте). Мы не хотим, чтобы продавец мог заглянуть в бумажник покупателя на шаге 3. Мы не хотим, чтобы продавец не отдал покупателю сдачу на шаге 4. Мы не хотим, чтобы покупатель застрелил продавца на шаге 3 и ушел с украденными мандаринами. Такие способы обмана распространены и в материальном мире, а анонимность киберпространства только увеличивает опасность.
Даже в физическом мире были разработаны более сложные протоколы, чтобы снизить опасность всякого рода жульничества. Вот как в общих чертах выглядит протокол продажи автомобиля.
1. Алиса передает Бобу ключи и документы.
2. Боб дает Алисе чек на сумму покупки.
3. Алиса кладет деньги в банк.
Здесь Боб запросто может сжульничать. Он может дать Алисе фальшивый чек. Она не будет знать, что чек фальшивый, и не узнает, пока ей не скажут об этом в банке. К тому времени Боб с ее машиной будет уже далеко.
Когда я продавал машину несколько лет назад, во избежание такой атаки придерживался несколько модифицированного протокола.
1. Боб выписывает чек и идет с ним в банк.
2. Когда на счет Боба поступит достаточно денег, чтобы покрыть чек, банк «заверяет» чек и возвращает его Бобу.
3. Алиса передает Бобу ключи и документы о праве собственности.
4. Боб дает Алисе заверенный чек на сумму покупки.
5. Алиса кладет деньги в банк.
Что при этом происходит? Банк в такой коммерческой сделке выступает доверенной третьей стороной. Алиса полагается на то, что банк выплатит по заверенному им чеку полную сумму. Боб верит, что банк сохранит деньги на счете, а не вложит их в рискованные предприятия в странах третьего мира. Алиса и Боб могут осуществить свою сделку, даже если они не доверяют друг другу, – поскольку они оба доверяют банку.
Такая система работает не потому, что банк – солидное учреждение, за которым стоит много, включая хорошую рекламную кампанию, а потому, что банк не заинтересован в выгоде кого-либо одного – Алисы или Боба – и имеет надежную репутацию. Банк будет придерживаться протокола заверения чека, что бы ни произошло. Если на счету Боба достаточно денег, банк выдаст чек. Если Алиса представит чек к оплате, банк его оплатит. Если бы банк все же скрылся с деньгами, не многое бы от него осталось. (В этом и есть сущность репутации.)
Данный протокол защищает Алису, но не Боба от покупки фальшивых документов или краденой машины. Для этого нам нужен другой протокол.
1. Алиса передает ключи и документы о праве собственности юристу.
2. Боб отдает юристу чек.
3. Юрист проверяет чек в банке.
4. По прошествии оговоренного временного промежутка, который отводится на то, чтобы проверить чек и зарегистрировать машину, юрист отдает Бобу документы. Если клиринг чека не удается осуществить в течение оговоренного времени, юрист возвращает документы Алисе. Если Боб не может получить новые документы на машину (поскольку Алиса дала ему недействительные документы), Боб предоставляет юристу соответствующие доказательства и получает назад свои деньги.
Как и в предыдущем протоколе, здесь привлекается третья доверенная сторона. В данном случае это юрист. Алиса не доверяет Бобу, Боб не доверяет Алисе, но оба они верят, что юрист на последнем шаге поведет себя беспристрастно. Юрист совершенно не заинтересован в чьей-либо выгоде – ему все равно, отдаст он документы Бобу или Алисе. Он задержит деньги на депоненте и будет действовать в соответствии с соглашением между Бобом и Алисой.
Другие протоколы могут быть более простыми и не требовать столь сложного обмена. Например, протокол, в соответствии с которым банк в состоянии удостовериться, что чек подписан Алисой.
1. Алиса подписывает чек.
2. Банк сравнивает подпись на чеке с подписью на папке Алисы.
3. Если они совпадают, банк дает Алисе деньги. Если не совпадают – не дает.
Теоретически, такой протокол обеспечивает защиту от того, что Боб обманным путем получит деньги Алисы, но, конечно, в реальности все сложнее. Боб может уметь подделывать подписи. Банк может давать рискованные займы Парагваю и разориться. Алиса может вытащить пистолет. Существуют, вероятно, тысячи способов нарушить этот протокол, но с разумными допущениями он работает.
Протоколы цифрового мира во многом похожи на предыдущие примеры. Цифровые протоколы при помощи криптографии делают то же самое: сохраняют секреты, проводят аутентификацию, охраняют справедливость, обеспечивают аудит и т. п.
В Интернете используется множество протоколов безопасности; я расскажу о них в следующем разделе. У других цифровых сетей есть свои протоколы безопасности. Индустрия сотовых телефонов применяет целый ряд протоколов – как для секретности, так и для предотвращения мошенничества (с переменным успехом). У компьютерных приставок к телевизору также есть протоколы безопасности. И у смарт-карт тоже.
Достаточно неожиданно, но причина этого не в плохом качестве криптографии. (Многое лежит на поверхности, но есть и проблемы, упрятанные гораздо более глубоко.) Ответ нужно искать в различии между теорией и практикой.
Криптография – это раздел математики. Математика – теоретическая наука; она логична. Хорошая математика исходит из правильной предпосылки, следует единственным путем – доказательство за доказательством – через неизведанные земли и заканчивается неопровержимым выводом. По природе своей она хорошо выглядит на бумаге.
Корни проблем безопасности следует искать в физическом мире. Материальный мир во многом нелогичен. Он неупорядочен. В нем не существует единственного пути. В нем есть теории и выводы, но для того чтобы согласиться с выводами, вам необходимо принять предпосылки, модели и взаимосвязи между теориями и реальным миром. А это непросто. Люди не играют по правилам. Они делают то, чего от них не ожидают; они не укладываются в жесткие рамки. То же самое касается технических средств: время от времени все начинает плохо работать, а то и вовсе ломается. Это же можно сказать о программном обеспечении. Оно должно быть логичным и упорядоченным, как-никак это – просто комбинация нулей и единиц, но иногда оно настолько сложно, что становится больше похожим на организм, а не на творение математики. Неважно, насколько хороша криптографическая теория: когда она используется в системе, она сталкивается с практикой.
Я часто говорю о программах, что они – лишь дань моде. Когда реклама утверждает, что используется RSA, тройной DES или любой другой модный алгоритм криптографии, это равносильно заявлению о том, что дом полностью безопасен только потому, что у него надежный дверной замок. Этого недостаточно.
Длина ключа и безопасность
Несмотря на то что я сказал в предыдущей главе, длина ключа почти ничего не определяет в безопасности.Внутри замка на входной двери вашего дома есть множество штырьков. Для каждого из них существуют различные возможные положения. Когда кто-то вставляет ключ в замочную скважину, все штырьки перемещаются в определенные позиции. Если положение, в которое ключ ставит штырьки, как раз то, которое необходимо, чтобы замок открылся, то он открывается. Если нет – не открывается.
У замков, наиболее часто используемых в жилых домах, пять штырьков, каждый из которых может располагаться в одном из десяти различных положений. Это означает, что существует 100 000 возможных ключей. Взломщик с огромной связкой ключей может перебрать все ключи один за другим и в конце концов попасть внутрь. Ему лучше набраться терпения, поскольку если даже он тратит на один ключ 5 секунд, ему потребуется примерно 69 часов, чтобы найти подходящий ключ (и это без перерывов на сон, еду и душ).
Однажды в вашу дверь звонит торговый агент и предлагает вам купить новый замок. У его замка семь штырьков по двенадцать положений у каждого. Агент скажет, что взломщику придется три года непрерывно перебирать ключи, прежде чем он сможет открыть дверь. Почувствуете ли вы себя в большей безопасности с таким замком?
Наверное, нет. Все равно ни один взломщик не стал бы стоять перед вашей дверью 69 часов. Он, скорее всего, откроет замок отмычкой, просверлит его, вышибет дверь, разобьет окно или просто спрячется в кустах до тех пор, пока вы не отправитесь на прогулку. Замок с большим количеством штырьков и положений не обеспечит вашему дому большую безопасность, поскольку атака, которая таким образом затрудняется – перебором еще большего количества ключей – не та атака, о которой стоит задумываться особо. До тех пор пока количества штырьков достаточно, чтобы сделать недопустимой такую атаку, вам не следует о ней беспокоиться.
То же самое справедливо для криптографических ключей. Если они достаточно длинные, то лобовые атаки просто лежат за пределами человеческих возможностей. Но здесь следует позаботиться о двух вещах. Во-первых, о качестве алгоритма шифрования, а во-вторых, о качестве ключа. Какой ключ является «достаточно длинным», зависит от обеих этих вещей.
Но в первую очередь нужно разъяснить понятие энтропии.
Энтропия – мера беспорядка или, более конкретно в контексте криптографии мера неопределенности. Чем больше неопределенность, тем больше энтропия. Например, случайно выбранный человек из обычной популяции является или мужчиной, или женщиной, в этом случае переменная «пол» составляет один бит энтропии. Если случайный человек сообщает, кто из четырех «Битлз» ему больше нравится, и все варианты равновероятны, этому соответствуют два бита энтропии. Пол члена женской олимпийской команды по бегу – это величина, у которой нет энтропии – они все женщины. Энтропия предпочтений одного из «Битлз» на собрании фан-клуба Джона Леннона существенно меньше двух битов, поскольку наиболее вероятно, что выбранный наугад человек предпочитает Джона. Чем больше определенность переменной, тем меньше энтропия.
То же самое верно для криптографических ключей. То, что алгоритм использует 128-битовый ключ, не означает, что у него 128 бит энтропии для ключа. Или точнее, лучший способ сломать данную реализацию 128-битового алгоритма шифрования может состоять не в том, чтобы перебрать все ключи. «128 бит» – это просто мера максимального количества работы, которая потребуется, чтобы восстановить ключ; но про минимум ничего не сказано.
Во-первых, следует позаботиться о происхождении ключа. Все вычисления, касающиеся длины ключа, я производил, предполагая, что каждый ключ имеет при создании максимальную энтропию. Другими словами, я рассчитывал, что все варианты ключа равновероятны, что генератор случайных чисел, создавший ключ, работает идеально. Это допущение не совсем верно.
Многие ключи создаются на основе паролей и ключевых фраз. Система, принимающая пароль из 10 ASCII-символов, предоставляет для него 80 бит, но ее энтропия будет значительно меньше 80 бит. Некоторые символы ASCII никогда не появляются, а пароли, которые представляют собой реальные слова (или что-то похожее на слова), гораздо вероятнее, чем произвольные строки символов. Я видел оценки энтропии для английского языка, меньшие 1,3 бит на символ; у пароля энтропия меньше, чем 4 бит на символ. Это значит, что пароль из 8 символов будет приблизительно соответствовать 32-битовому ключу, а если вы захотите 128-битовый ключ, вам нужен пароль из 98 символов (на базе английского алфавита).
Видите ли, разумный взломщик не будет перебирать все возможные пароли по порядку. Он сначала испробует наиболее вероятные, а затем проверит остальные – в порядке убывания вероятности. Он проверит тривиальные пароли (типа «пароль» или «1234»), после этого – весь английский словарь, а затем различные заглавные буквы, цифры и т. п. Это называют словарной атакой. Программа для взлома пароля, реализующая такую атаку, называется L0phtcrack; на 400-мегагерцовом Quad Pentium II она может протестировать зашифрованный пароль по 8-мегабайтовому словарю распространенных паролей за считанные секунды.
Вот почему смешно, когда компании вроде Microsoft рекламируют 128-битовое шифрование, а затем берут за основу ключа пароль. (Это в высшей степени характерно для всей системы безопасности Windows NT[22].) Используемые алгоритмы могут допускать 128-битовый ключ, но энтропия пароля гораздо меньше. Фактически, качество криптографии и длина ключа не важны; причиной выхода системы из строя послужит слабый пароль. (Очевидное решение – не допустить, чтобы люди перебирали множество паролей, – не срабатывает. Я подробнее остановлюсь на этой проблеме в главе 9.)
Это очень важно. Я знаю сложные системы, секретный ключ которых защищен паролем. В основе безопасности практически любого зашифрованного продукта на жестком диске компьютера лежит ключ, запоминаемый пользователем. Почти вся система безопасности Windows NT приходит в негодность из-за того, что она построена на основе пароля, запоминаемого пользователем. Даже система PGP (Pretty Good Privacy) распадется, если пользователь выберет плохой пароль.
Не важно, какие алгоритмы и насколько длинные ключи используются; секреты, которые хранятся в памяти пользователя, беззащитны сами по себе.
Ключ, сгенерированный случайным образом, намного лучше, но проблемы остаются. Генератор случайных чисел должен создавать ключи с максимальной энтропией. Недостатки генератора случайных чисел – те же, что привели к сбоям системы шифрования в Netscape Navigator 1.1. Хотя генератор случайных чисел применяли для создания 128-битовых ключей, максимальная энтропия достигала примерно 20 бит. То есть алгоритм был не лучше, чем если бы использовался 20-битовый ключ[23].
Второй предмет заботы – это качество алгоритма шифрования. Все предыдущие расчеты предполагали, что алгоритм получал ключи при помощи вычислений и использовал их совершенным образом. Если в алгоритме есть слабые места, доступные для атаки, это существенно снижает энтропию ключей. Например, алгоритм А5/1, используемый европейской сетью сотовых телефонов GSM, имеет 64-битовый ключ, но может быть взломан за время, требующееся для взлома 30-битового ключа при помощи атаки «в лоб». Это значит, что хотя у алгоритма имеется ключ с 64-битовой энтропией, он задействует для ключа только 30 бит энтропии. Вы можете с тем же успехом использовать хороший алгоритм с 30-битовым ключом.
По этой причине проходит довольно много времени, прежде чем шифровальщики начинают доверять новому алгоритму. Когда кто-то предлагает новый алгоритм, у него есть определенная длина ключа. Но обеспечивает ли алгоритм реально ту энтропию, которая заявлена? Может потребоваться несколько лет анализа, прежде чем мы поверим, что он это делает. И даже тогда мы можем легко ошибиться: возможно, кто-то придумает новые математические подходы, которые понизят энтропию алгоритма и сломают его. Поэтому рекламу программ, в которых обещаются тысячебитовые ключи, трудно воспринимать серьезно – ее создатели не имеют понятия, как работают ключи и энтропия.
Похожая проблема существует и для физических ключей и замков. Принято думать, что слесарь возит в своем грузовике огромное кольцо с ключами от машин. Может потребоваться 10 000 ключей, чтобы открыть все замки, но в реальности несколько дюжин ключей откроют любой из них. Иногда слесарю достаточно просто взять другой ключ, отличающийся от предыдущего на 1-2 «бита», – отметим, что это комбинация анализа и лобовой атаки – и этого уже достаточно. Да, процесс долгий, но совсем не такой, как проверка всех 10 000 возможных ключей (старые замки – четырехштырьковые). Действительная надежность дверного замка существенно отличается от теоретической.
То же самое с комбинациями замков. Вы можете перебрать все возможные комбинации – и существуют машины для взлома сейфов, которые так и делают, – или поступить хитрее. Современные машины для взлома сейфов применяют микрофон, чтобы слушать звук, производимый дисками, когда их поворачивают, и они могут открыть сейф намного быстрее, чем старые, действующие «в лоб».
Сказанное здесь заставляет очень внимательно подходить к выбору алгоритма. Мы еще обсудим это более детально в конце этой главы.
Одноразовое кодирование
Кодирование одноразового использования – это самый простой из всех алгоритмов, его изобрели незадолго до XX века. Основная идея его состоит в том, что у вас есть набор символов ключа. Вы прибавляете один символ ключа к каждому символу открытого текста и никогда не повторяете символы ключа. (Это «одноразовая» часть.) Например, вы прибавляете В (2) к С (3), чтобы получить Е (5), или Т (20) к L (12), чтобы получить F (6). ((20 + 12) mod 26 = 6.) Такая система подходит для любого алфавита, в том числе и бинарного. И это единственный имеющийся у нас алгоритм, безопасность которого может быть доказана[24].Вспомним понятие расстояния уникальности. Оно возрастает при увеличении длины ключа. Когда длина ключа приближается к длине сообщения, расстояние уникальности стремится к бесконечности. Это означает, что невозможно восстановить открытый текст, и это доказывает безопасность одноразового кодирования.
Но, с другой стороны, это практически бесполезно. Поскольку ключ должен при этом быть такой же длины, как и сообщение, то проблема не решена. Единственный здравый подход к шифрованию должен предполагать, что очень длинная секретная информация – сообщение – превращается с его помощью в очень короткую секретную информацию – ключ. При помощи одноразового кодирования вы нисколько не сокращаете секретную информацию. Так же сложно доставить шифр получателю, как и доставить само сообщение. Современная криптография зашифровывает большие объекты, например цифровые фильмы, соединения через Интернет или телефонные разговоры, и такое шифрование практически невозможно осуществить, работая с одноразовым кодированием.
Одноразовое кодирование практически использовалось в особых случаях. Русские шпионы применяли для общения алгоритм одноразового кодирования, используя карандаш и бумагу. Агентство национальной безопасности (NSA) раскрыло эту систему, поскольку русские использовали ее повторно. Горячая линия телетайпа между Вашингтоном и Москвой была зашифрована именно таким образом.
Если утверждают, что некая программа использует этот алгоритм, то здесь почти наверняка обман. А если и нет, то программа наверняка непригодна для использования или небезопасна.
Протоколы
Шесть инструментов, о которых я говорил в предыдущей главе, – симметричное шифрование, коды аутентификации сообщений, шифрование с открытым ключом, односторонние хэш-функции, схемы цифровых подписей и генераторы случайных чисел – составляют набор инструментов шифровальщика. С его помощью мы выстраиваем криптографические решения реальных задач: «Как мне послать секретное письмо по электронной почте? Как можно предотвратить мошенничества с телефонными звонками? Как мне обеспечить безопасность системы голосования через Интернет?» Эти задачи безопасности мы решаем, компонуя простейшие элементы в так называемые протоколы. Приходится использовать и другие второстепенные элементы, но, по существу, шесть перечисленных выше элементов составляют ядро любого криптографического протокола.Например, предположим, что Алиса хочет сохранить в тайне некоторые файлы данных. Вот протокол, который это делает. Алиса выбирает пароль или даже лучше – ключевую фразу. Криптографические программы хэшируют этот пароль, чтобы получить секретный ключ, а затем, применяя симметричный алгоритм, зашифровывают файл данных. В результате получится файл, доступ к которому есть только у Алисы или у того, кто знает пароль.
Хотите создать безопасный телефон? Используйте криптографию с открытым ключом, чтобы сформировать сеансовый ключ, а затем при помощи этого ключа и симметричной криптографии зашифруйте переговоры. Хэш-функция обеспечивает дополнительную безопасность против атак, проводимых человеком. (Подробнее об этом позже.) Чтобы засекретить сообщение электронной почты, воспользуйтесь криптографией с открытым ключом для соблюдения секретности и схемой цифровой подписи для аутентификации. Электронная торговля? Обычно для нее не требуется ничего, кроме цифровых подписей и, иногда, шифрования для секретности. Секретный контрольный журнал? Возьмите хэш-функции, шифрование, может быть, MAC и перемешайте.
То, что мы сейчас делаем, и есть создание протоколов. Протокол – это не сложнее, чем танец. Это последовательность заданных шагов, которую выполняют два (или больше) партнера и которая предназначена для решения поставленной задачи. Представьте себе протокол, которым пользуются продавец и покупатель при покупке мандаринов. Вот необходимые шаги:
1. Покупатель спрашивает у продавца мандарины.
2. Продавец дает ему мандарины.
3. Покупатель платит продавцу.
4. Продавец возвращает ему сдачу.
Все, о ком идет речь в протоколе, должны знать шаги. Например, покупатель знает, что он должен заплатить за мандарины. Все шаги должны быть однозначны: ни продавец, ни покупатель не могут достичь шага, на котором они не знают, что делать. Кроме того, протокол должен обязательно завершаться – в нем не должно быть бесконечных циклов.
Шаг 2 не будет работать как надо, если продавец не поймет семантическое содержание шага 1. Продавец не выполнит шаг 4, если на шаге 3 не признает деньги настоящими. Попробуйте купить мандарины в США на польские злотые и посмотрите, как вам это удастся.
Нас особо волнуют протоколы безопасности. Кроме всех перечисленных выше требований мы хотим, чтобы покупатель и продавец не имели возможности обманывать (что бы ни означало «обманывать» в нашем контексте). Мы не хотим, чтобы продавец мог заглянуть в бумажник покупателя на шаге 3. Мы не хотим, чтобы продавец не отдал покупателю сдачу на шаге 4. Мы не хотим, чтобы покупатель застрелил продавца на шаге 3 и ушел с украденными мандаринами. Такие способы обмана распространены и в материальном мире, а анонимность киберпространства только увеличивает опасность.
Даже в физическом мире были разработаны более сложные протоколы, чтобы снизить опасность всякого рода жульничества. Вот как в общих чертах выглядит протокол продажи автомобиля.
1. Алиса передает Бобу ключи и документы.
2. Боб дает Алисе чек на сумму покупки.
3. Алиса кладет деньги в банк.
Здесь Боб запросто может сжульничать. Он может дать Алисе фальшивый чек. Она не будет знать, что чек фальшивый, и не узнает, пока ей не скажут об этом в банке. К тому времени Боб с ее машиной будет уже далеко.
Когда я продавал машину несколько лет назад, во избежание такой атаки придерживался несколько модифицированного протокола.
1. Боб выписывает чек и идет с ним в банк.
2. Когда на счет Боба поступит достаточно денег, чтобы покрыть чек, банк «заверяет» чек и возвращает его Бобу.
3. Алиса передает Бобу ключи и документы о праве собственности.
4. Боб дает Алисе заверенный чек на сумму покупки.
5. Алиса кладет деньги в банк.
Что при этом происходит? Банк в такой коммерческой сделке выступает доверенной третьей стороной. Алиса полагается на то, что банк выплатит по заверенному им чеку полную сумму. Боб верит, что банк сохранит деньги на счете, а не вложит их в рискованные предприятия в странах третьего мира. Алиса и Боб могут осуществить свою сделку, даже если они не доверяют друг другу, – поскольку они оба доверяют банку.
Такая система работает не потому, что банк – солидное учреждение, за которым стоит много, включая хорошую рекламную кампанию, а потому, что банк не заинтересован в выгоде кого-либо одного – Алисы или Боба – и имеет надежную репутацию. Банк будет придерживаться протокола заверения чека, что бы ни произошло. Если на счету Боба достаточно денег, банк выдаст чек. Если Алиса представит чек к оплате, банк его оплатит. Если бы банк все же скрылся с деньгами, не многое бы от него осталось. (В этом и есть сущность репутации.)
Данный протокол защищает Алису, но не Боба от покупки фальшивых документов или краденой машины. Для этого нам нужен другой протокол.
1. Алиса передает ключи и документы о праве собственности юристу.
2. Боб отдает юристу чек.
3. Юрист проверяет чек в банке.
4. По прошествии оговоренного временного промежутка, который отводится на то, чтобы проверить чек и зарегистрировать машину, юрист отдает Бобу документы. Если клиринг чека не удается осуществить в течение оговоренного времени, юрист возвращает документы Алисе. Если Боб не может получить новые документы на машину (поскольку Алиса дала ему недействительные документы), Боб предоставляет юристу соответствующие доказательства и получает назад свои деньги.
Как и в предыдущем протоколе, здесь привлекается третья доверенная сторона. В данном случае это юрист. Алиса не доверяет Бобу, Боб не доверяет Алисе, но оба они верят, что юрист на последнем шаге поведет себя беспристрастно. Юрист совершенно не заинтересован в чьей-либо выгоде – ему все равно, отдаст он документы Бобу или Алисе. Он задержит деньги на депоненте и будет действовать в соответствии с соглашением между Бобом и Алисой.
Другие протоколы могут быть более простыми и не требовать столь сложного обмена. Например, протокол, в соответствии с которым банк в состоянии удостовериться, что чек подписан Алисой.
1. Алиса подписывает чек.
2. Банк сравнивает подпись на чеке с подписью на папке Алисы.
3. Если они совпадают, банк дает Алисе деньги. Если не совпадают – не дает.
Теоретически, такой протокол обеспечивает защиту от того, что Боб обманным путем получит деньги Алисы, но, конечно, в реальности все сложнее. Боб может уметь подделывать подписи. Банк может давать рискованные займы Парагваю и разориться. Алиса может вытащить пистолет. Существуют, вероятно, тысячи способов нарушить этот протокол, но с разумными допущениями он работает.
Протоколы цифрового мира во многом похожи на предыдущие примеры. Цифровые протоколы при помощи криптографии делают то же самое: сохраняют секреты, проводят аутентификацию, охраняют справедливость, обеспечивают аудит и т. п.
В Интернете используется множество протоколов безопасности; я расскажу о них в следующем разделе. У других цифровых сетей есть свои протоколы безопасности. Индустрия сотовых телефонов применяет целый ряд протоколов – как для секретности, так и для предотвращения мошенничества (с переменным успехом). У компьютерных приставок к телевизору также есть протоколы безопасности. И у смарт-карт тоже.