Текст книги "Секреты и ложь. Безопасность данных в цифровом мире"
Автор книги: Брюс Шнайер
Жанры:
Интернет
,сообщить о нарушении
Текущая страница: 9 (всего у книги 34 страниц)
Детали этого процесса содержат в себе целую кучу хитростей. Например, я не рассказал, как Боб создал открытый и закрытый ключи и как он сделал свой личный ключ секретным. (Он не может его помнить – ведь ключ состоит из более чем тысячи случайных цифр.) И я пропущу здесь рассказ о невероятно сложной задаче – как Алиса узнает, что она получила именно ключ Боба, а не какой-то старый, или неправильный, или ключ какого-либо злоумышленника. Мы вернемся к этому позднее.
А сейчас я хочу обратить ваше внимание на то, что никто не применяет шифрование с открытым ключом для кодирования сообщений. Все операционные системы используют гибридные технологии, в которых задействованы оба типа криптографии. Причина интереса к этому подходу в его эффективности. На самом деле, когда Алиса хочет послать сообщение Бобу, она зашифровывает сообщение при помощи симметричного алгоритма, используя произвольный ключ, который создает «из воздуха» (так называемый сеансовый ключ). Она зашифровывает этот произвольный ключ при помощи открытого ключа Боба, а затем отправляет вместе зашифрованный ключ и зашифрованное сообщение для Боба. Когда Боб их получает, он производит обратную операцию. При помощи личного ключа он расшифровывает произвольный симметричный ключ, а затем использует его для расшифровки сообщения.
Это может показаться сверхъестественным, но все совершенно нормально. Повторюсь, никто не использует криптографию с открытым ключом непосредственно для шифрования сообщений. Все применяют гибридные технологии. Так устроены все программы, обеспечивающие безопасность электронной почты, – PGP, РЕМ, S/MIME и любые другие. Так обеспечивается защита сообщений Веб, TCP/IP, телефонной связи и всего остального.
Схемы цифровой подписи
Шифрование с открытым ключом – вещь довольно удивительная, но цифровые подписи (сигнатуры) – еще более интересный и важный инструмент. Цифровые подписи обеспечивают тот же уровень аутентификации сообщений, что и MAC. А в современном бизнесе аутентификация намного важнее секретности,
Как и шифрование с открытым ключом, цифровые подписи используют пару ключей: открытый и закрытый. Вы также не можете установить по одному ключу другой. Но в этом случае ключи меняются местами.
У Алисы есть открытый текст сообщения. Применяя свой закрытый ключ, она сообщение зашифровывает. Поскольку это ее личный ключ, то только им можно зашифровать сообщение абсолютно тем же способом. Таким образом, зашифрованное сообщение становится Алисиной подписью на сообщении. Открытый ключ Алисы общедоступен. Кто угодно способен достать этот ключ и расшифровать сообщение, удостоверившись таким образом, что его подписала (то есть зашифровала) Алиса. Подпись является функцией сообщения, поэтому она уникальна для сообщений: злостный фальсификатор не может снять подпись Алисы с одного документа и поместить ее на другой. Подпись – это функция личного ключа Алисы, то есть она уникальна для нее.
Конечно, реальные системы более сложны. Так же как Алиса не зашифровывает сами сообщения при помощи алгоритмов шифрования с открытым ключом (она зашифровывает только ключ сообщения), она и не подписывает непосредственно сообщение. Вместо этого она вычисляет одностороннюю хэш-функцию сообщения и затем ее подписывает. Опять же, подписывание хэш-значения на несколько порядков быстрее, и надо иметь в виду, что существует математическая проблема защиты при подписывании сообщений напрямую.
Таким образом, большинство алгоритмов цифровых подписей на самом деле не зашифровывают подписанные сообщения. Идея та же, но математическое исполнение отличается. Для того чтобы создать подпись, Алиса производит некоторые вычисления исходя из сообщения и своего личного ключа. Эта подпись прикрепляется к сообщению. Боб проделывает другие вычисления, основываясь на сообщении, подписи и открытом ключе Алисы, чтобы проверить подпись. Ева, которая не знает личного ключа Алисы, может проверить подпись, но не может подделать сообщение или полноценную подпись.
В настоящее время применяются несколько алгоритмов цифровой подписи. Наиболее популярен RSA. Алгоритм цифровой подписи американского правительства (Digital Signature Algorithm, DSA), который применяют в стандарте цифровой подписи (Digital Signature Standard, DSS), также используется часто. Вы можете иногда встретить алгоритм Эль-Гамаль. А еще существуют алгоритмы подписей, в основе которых лежит криптография эллиптических кривых; они похожи на все прочие, но в некоторых ситуациях работают эффективнее.
Хотя алгоритмы цифровой подписи с открытым ключом похожи на MAC, они лучше в одном важном нюансе. Используя MAC, Алиса и Боб применяют совместный секретный ключ для аутентификации сообщений. Если Алиса получит сообщение и проверит его, она будет знать, что сообщение пришло от Боба.
Но она не сможет доказать это правосудию. В чем можно его убедить – это в том, что письмо пришло или от Боба, или от Алисы: как-никак оба они знали ключ MAC. При помощи MAC можно убедить получателя, что письмо поступило от отправителя, но MAC нельзя использовать для убеждения третьей стороны. Цифровые подписи позволяют уверить третью сторону, решающую проблему отказа от подписи: Алиса не может отправить Бобу письмо, а позднее утверждать, что никогда его не посылала.
К несчастью, действительность такова, что все, что касается подписей, является черным или белым, как это предполагает математика. Законы о цифровых подписях существуют в законодательстве многих стран, но меня беспокоит, что они не жизнеспособны. Цифровые подписи не являются аналогом автографа (собственноручной подписи). Я расскажу об этом подробнее в главе 15.
Генераторы случайных чисел
Случайные числа – это простой элемент криптографии, о котором меньше всего говорят, но он важен не менее, чем остальные. Почти всем системам компьютерной безопасности, в которых применяется криптография, необходимы случайные числа – для ключей, уникальных чисел в протоколах и т. п. – и безопасность таких систем часто зависит от произвольности ее случайных чисел. Если генератор случайных чисел ненадежен, вся система выходит из строя.
В зависимости от того, с кем вы разговариваете, генерация случайных чисел выглядит или тривиальной, или невозможной. Теоретически это невозможно. Джон фон Нейман, отец вычислительной техники, сказал: «Любой, кто считает, что существуют арифметические методы получения случайных цифр, безусловно, грешит». Он имел в виду, что невозможно получить что-то случайное в полном смысле слова на выходе такого детерминированного зверя, как компьютер. Это правда, но, к счастью, кое-что сделать мы можем. От генератора случайных чисел нам необходимо не то, чтобы числа были действительно случайными, а чтобы их невозможно было предсказать и воспроизвести. Если у нас будут выполнены эти два условия, мы сможем достичь безопасности.
С другой стороны, если мы нарушаем эти два условия, безопасности нет. В 1994 году в казино Монреаля установили компьютерный генератор случайных чисел для лотерей. Один наблюдательный игрок, проводивший в казино очень много времени, заметил, что выигрышные номера были каждый день одни и те же. Он успешно сорвал три Джек-Пота подряд и получил 600 000 долларов. (Как следует позаламывав руки, поскрежетав зубами и расследовав все, казино заплатило выигрыш.)
Существует несколько обширных классов генераторов случайных чисел. В основе некоторых из них лежат физические процессы, которые можно считать довольно случайными. Агентство национальной безопасности любит использовать в своей аппаратуре для создания случайных чисел электрические шумы диодов. Другие возможности – счетчик Гейгера или приемники радиопомех. Одна система в Интернете использует цифровой фотоаппарат, направленный на несколько стробоскопов. В других системах применяется турбулентность воздуха в дисководах или момент поступления сетевых пакетов.
Некоторые генераторы случайных чисел отслеживают случайные движения пользователя. Программа может попросить пользователя набрать на клавиатуре большую строку произвольных символов; она может задействовать последовательность символов или даже время между нажатиями клавиш для создания случайных чисел. Другая программа запросто способна потребовать у пользователя туда-сюда подвигать мышью или похрюкать в микрофон.
Некоторые генераторы случайных чисел применяют эту введенную информацию без изменений. В других она служит затравкой (начальным числом) для математических генераторов случайных чисел. Этот прием работает лучше, если системе требуется случайных чисел больше, чем их обеспечивает ввод информации.
Какого бы происхождения ни была случайность, генератор создаст ряд случайных битов. Затем их можно использовать как криптографические ключи и для всего остального, что нужно системе.
Длина ключей
Один из простейших критериев сравнения криптографических алгоритмов – длина ключа. Пресса любит обращать на нее внимание, поскольку ее легко считать и сравнивать. Как и в большинстве случаев, когда речь идет о безопасности, реальность более сложна. Короткий ключ плох, но длинный ключ не будет хорошим автоматически. Почему это так, я расскажу в следующей главе, а сейчас лучше разъяснить понятие длины ключа и его важность.
Начнем с самого начала. Криптографический ключ – это секретное число, которое делает криптографический алгоритм уникальным для тех, кто совместно пользуется этим ключом. Если Алиса и Боб договорились об общем ключе, то при помощи алгоритма они могут тайно пообщаться. Если Ева-перехватчица не знает ключа, ей придется исследовать и ломать алгоритм.
Одна очевидная вещь, которую можно сделать, – это перепробовать все возможные ключи. Это так называемая атака «в лоб», или лобовая атака. Если длина ключа n битов, то существует 2^n всевозможных комбинаций ключей. При длине ключа в 40 бит, придется перебрать около триллиона вариантов ключей. Такая задача покажется ужасно скучной для Евы, но компьютеры неутомимы. Они лучше всех решают ужасно скучные задачи. В среднем компьютеру пришлось бы испробовать половину ключей, прежде чем он найдет правильный, то есть компьютер, который мог бы проверять миллиард ключей в секунду, потратил бы на поиски правильного 40-битового ключа примерно 18 минут. В 1998 году Electronic Frontier Foundation создала машину, которая могла атакой «в лоб» ломать DES-алгоритм. Эта машина, названная DES Deep Crack, проверяла 90 миллиардов ключей в секунду; она могла найти 56-битовый ключ DES в среднем за 4,5 дня. В 1999 году распределенный интернет-проект подбора ключей для взлома DES, distributed net (включающий в себя Deep Crack), был способен проверить 250 миллиардов ключей в секунду.
Все схемы таких взломов «в лоб» линейны: вдвое большее количество ключей потребует вдвое больше компьютерного времени. Но сложность такого взлома зависит от длины ключей экспоненциально: добавим один бит к длине ключа, и взлом «в лоб» станет в два раза сложнее. Добавим два бита – в четыре раза. Десять битов – в тысячу раз сложнее.
Сила атак «в лоб» в том, что они работают против любого алгоритма. Поскольку эта атака не касается внутренней математики алгоритма, ей все равно, что же там внутри. Одни алгоритмы могут быть быстрее других, и поэтому атака «в лоб» проходит быстрее, но длина ключа легко это перевешивает. Достаточно просто сравнить длины ключей различных алгоритмов, чтобы выяснить, какие из них более уязвимы для лобовой атаки.
В 1996 году группа шифровальщиков (включающая и меня) исследовала различные технологии, которые можно использовать для создания дешифрующих машин, действующих по принципу лобовой атаки, и пришла к выводу, что 90-битовый ключ сможет обеспечивать безопасность до 2016 года. Ключ Triple-DES состоит из 112 бит, а наиболее современные алгоритмы имеют по меньшей мере 128-битовые ключи. (Улучшенный стандарт шифрования (AES) правительства США поддерживает длины ключей 128,192 и 256 бит.) Даже машине, работающей в миллиард раз быстрее Deep Crack, потребовался бы миллион лет, чтобы перебрать 2^112 ключей и восстановить открытый текст; еще более, чем в тысячу раз, возрастает время при переходе к 128-битовому ключу. Он будет обеспечивать безопасность в течение тысячелетия.
К этим числам нужно относиться с некоторым скептицизмом. Я – не ясновидящий и ничего не знаю о будущих достижениях компьютерных технологий. Реальная безопасность зависит от нескольких вещей: насколько ваши данные ценны, как долго их требуется хранить в тайне и т. п. Но это означает, что должны существовать «законсервированные» числа – длины ключей для симметричных алгоритмов и MAC. Хэш-функции должны иметь длину, равную удвоенной длине ключа.
Длина ключа для симметричного алгоритма открытого ключа определяется более сложным образом. Наиболее эффективная атака против 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]22
Когда-то под шифрованием в MS Word 6.0 всего-навсего понимался запрет на открытие файла в самом текстовом процессоре. Текст оставался доступен для прочтения в чем угодно. В приложениях Office 95 для определения пароля нужно было знать 16 байт из файла Word или Excel. Перебор 24 вариантов давал пароль. В версии Office 97 уже требовался полный перебор (кроме Access, где шифровались не данные, а пароль. Всего-навсего с помощью «исключающего или». Парольная защита Word и Excel и ныне настолько слаба, что вскрытие документов программой-взломщиком компании AccessData по-прежнему занимает доли секунды, хотя ее автор, Эрик Томсон, вставил для замедления работы в код пустые циклы, чтобы создать впечатление сложности задачи. – Примеч. ред.
[Закрыть].) Используемые алгоритмы могут допускать 128-битовый ключ, но энтропия пароля гораздо меньше. Фактически, качество криптографии и длина ключа не важны; причиной выхода системы из строя послужит слабый пароль. (Очевидное решение – не допустить, чтобы люди перебирали множество паролей, – не срабатывает. Я подробнее остановлюсь на этой проблеме в главе 9.)
Это очень важно. Я знаю сложные системы, секретный ключ которых защищен паролем. В основе безопасности практически любого зашифрованного продукта на жестком диске компьютера лежит ключ, запоминаемый пользователем. Почти вся система безопасности Windows NT приходит в негодность из-за того, что она построена на основе пароля, запоминаемого пользователем. Даже система PGP (Pretty Good Privacy) распадется, если пользователь выберет плохой пароль.
Не важно, какие алгоритмы и насколько длинные ключи используются; секреты, которые хранятся в памяти пользователя, беззащитны сами по себе.
Ключ, сгенерированный случайным образом, намного лучше, но проблемы остаются. Генератор случайных чисел должен создавать ключи с максимальной энтропией. Недостатки генератора случайных чисел – те же, что привели к сбоям системы шифрования в Netscape Navigator 1.1. Хотя генератор случайных чисел применяли для создания 128-битовых ключей, максимальная энтропия достигала примерно 20 бит. То есть алгоритм был не лучше, чем если бы использовался 20-битовый ключ[23]23
Инициализация генератора случайных чисел была основана на значении текущего времени в микросекундах и идентификаторах процесса. Исследователи Голдберг и Вагнер выяснили, что для 128-битового ключа это равнозначно 47-битовой энтропии. Используя сетевые домены, они получали вероятные значения инициализации, после чего находили 40-битовый ключ за 1 минуту, перебирая микросекунды. – Примеч. ред.
[Закрыть].
Второй предмет заботы – это качество алгоритма шифрования. Все предыдущие расчеты предполагали, что алгоритм получал ключи при помощи вычислений и использовал их совершенным образом. Если в алгоритме есть слабые места, доступные для атаки, это существенно снижает энтропию ключей. Например, алгоритм А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]24
Так называемый шифр Гронсфельда (взятый в основу одноразового кодирования) и его вариации суть модификации шифра Юлия Цезаря (где «длина ключа» была равна одному символу). Был популярен в конце XIX – начале XX века: в основу романа Жюля Верна «Жангада» была положена расшифровка именно этого шифра. Абсолютная стойкость шифра в предположении равенства длины сообщения и ключа была доказана Клодом Шенноном. – Примеч. ред.
[Закрыть].
Вспомним понятие расстояния уникальности. Оно возрастает при увеличении длины ключа. Когда длина ключа приближается к длине сообщения, расстояние уникальности стремится к бесконечности. Это означает, что невозможно восстановить открытый текст, и это доказывает безопасность одноразового кодирования.
Но, с другой стороны, это практически бесполезно. Поскольку ключ должен при этом быть такой же длины, как и сообщение, то проблема не решена. Единственный здравый подход к шифрованию должен предполагать, что очень длинная секретная информация – сообщение – превращается с его помощью в очень короткую секретную информацию – ключ. При помощи одноразового кодирования вы нисколько не сокращаете секретную информацию. Так же сложно доставить шифр получателю, как и доставить само сообщение. Современная криптография зашифровывает большие объекты, например цифровые фильмы, соединения через Интернет или телефонные разговоры, и такое шифрование практически невозможно осуществить, работая с одноразовым кодированием.
Одноразовое кодирование практически использовалось в особых случаях. Русские шпионы применяли для общения алгоритм одноразового кодирования, используя карандаш и бумагу. Агентство национальной безопасности (NSA) раскрыло эту систему, поскольку русские использовали ее повторно. Горячая линия телетайпа между Вашингтоном и Москвой была зашифрована именно таким образом.
Если утверждают, что некая программа использует этот алгоритм, то здесь почти наверняка обман. А если и нет, то программа наверняка непригодна для использования или небезопасна.
Протоколы
Шесть инструментов, о которых я говорил в предыдущей главе, – симметричное шифрование, коды аутентификации сообщений, шифрование с открытым ключом, односторонние хэш-функции, схемы цифровых подписей и генераторы случайных чисел – составляют набор инструментов шифровальщика. С его помощью мы выстраиваем криптографические решения реальных задач: «Как мне послать секретное письмо по электронной почте? Как можно предотвратить мошенничества с телефонными звонками? Как мне обеспечить безопасность системы голосования через Интернет?» Эти задачи безопасности мы решаем, компонуя простейшие элементы в так называемые протоколы. Приходится использовать и другие второстепенные элементы, но, по существу, шесть перечисленных выше элементов составляют ядро любого криптографического протокола.
Например, предположим, что Алиса хочет сохранить в тайне некоторые файлы данных. Вот протокол, который это делает. Алиса выбирает пароль или даже лучше – ключевую фразу. Криптографические программы хэшируют этот пароль, чтобы получить секретный ключ, а затем, применяя симметричный алгоритм, зашифровывают файл данных. В результате получится файл, доступ к которому есть только у Алисы или у того, кто знает пароль.
Хотите создать безопасный телефон? Используйте криптографию с открытым ключом, чтобы сформировать сеансовый ключ, а затем при помощи этого ключа и симметричной криптографии зашифруйте переговоры. Хэш-функция обеспечивает дополнительную безопасность против атак, проводимых человеком. (Подробнее об этом позже.) Чтобы засекретить сообщение электронной почты, воспользуйтесь криптографией с открытым ключом для соблюдения секретности и схемой цифровой подписи для аутентификации. Электронная торговля? Обычно для нее не требуется ничего, кроме цифровых подписей и, иногда, шифрования для секретности. Секретный контрольный журнал? Возьмите хэш-функции, шифрование, может быть, MAC и перемешайте.
То, что мы сейчас делаем, и есть создание протоколов. Протокол – это не сложнее, чем танец. Это последовательность заданных шагов, которую выполняют два (или больше) партнера и которая предназначена для решения поставленной задачи. Представьте себе протокол, которым пользуются продавец и покупатель при покупке мандаринов. Вот необходимые шаги:
1. Покупатель спрашивает у продавца мандарины.
2. Продавец дает ему мандарины.
3. Покупатель платит продавцу.
4. Продавец возвращает ему сдачу.
Все, о ком идет речь в протоколе, должны знать шаги. Например, покупатель знает, что он должен заплатить за мандарины. Все шаги должны быть однозначны: ни продавец, ни покупатель не могут достичь шага, на котором они не знают, что делать. Кроме того, протокол должен обязательно завершаться – в нем не должно быть бесконечных циклов.
Шаг 2 не будет работать как надо, если продавец не поймет семантическое содержание шага 1. Продавец не выполнит шаг 4, если на шаге 3 не признает деньги настоящими. Попробуйте купить мандарины в США на польские злотые и посмотрите, как вам это удастся.