Сетевая безопасность в Windows 2000 за 15 минут в неделю:
 

Основы криптографии

Кори Хайнс (Corey Hynes)

 

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

Эта статья рассматривает современные способы шифрования и то, как они применяются в компьютерных технологиях сегодня.

Основы

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

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

Шключ{данные} = Рключ{данные},

где Ш – процесс шифрования (с помощью ключа), Р – процесс расшифровки (с помощью ключа).

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

Алгоритм шифрования

Алгоритм шифрования является математической функцией f(), принимающей значение x и возвращающей результат y. Современные функции шифрования являются очень сложными и в течение нескольких лет пребывают в процессе разработки, тестирования и анализа. Некоторые из алгоритмов являются общедоступными, в то время как другие – очень конфиденциальны. Примерами наиболее часто используемых публичных алгоритмов являются RC4 и различные варианты DES (DES, 3DES, DESx). Эти алгоритмы претерпели огромное количество проверок и анализа. IDEA является примером продуманного конфиденциального алгоритма. IDEA разрабатывался правительством США и детали его реализации никогда не станут достоянием гласности. Для того чтобы алгоритм шифрования стал обоснованно строгим, он должен демонстрировать одну важнейшую характеристику. Он не должен допускать определения скрываемых данных без знания ключа и он не должен допускать вычисления ключа на основе зашифрованных данных.

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

Симметричный ключ шифрования

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

Симметричный алгоритм существует в двух основных форматах – потока (stream) и блока (block). Потоковое шифрование не шифрует данные напрямую при помощи ключа. Напротив, оно использует ключ, как основу для генерирования ключевого потока (keystream). Генерирование ключевого потока является ресурсоемкой операцией и приводит к существенной загрузке процессора при потоковом шифровании. Для каждого бита незашифрованного текста существует один соответствующий бит в ключевом потоке. Незашифрованный текст шифруется бит за битом с помощью таких операций как XOR (исключающее ИЛИ), вычисление которых не требует особых затрат. RC4 (Rivest cipher 4) является наиболее распространенным протоколом потокового шифрования, поскольку является шифрованием по умолчанию, используемой для технологии, называемой Microsoft Point to Point Encryption (MPPE). MPPE имеет множество применений на платформе Windows. Блочное шифрование с другой стороны напрямую использует ключ для шифрования данных. Незашифрованные данные делятся на блоки, размер которых напрямую связан с размером ключа. Каждый блок затем шифруется с помощью ключа для получения шифрованного текста. DES (Data Encryption Standard), возможно, является наиболее широкоиспользуемым примером блочного шифрования.

Ключи

Стойкость шифрования основана на стойкости ключей, используемых для шифрования данных. Стойкость ключа определяется двумя характеристиками – длиной и непредсказуемостью (случайностью). Чем длиннее и случайнее ключ, тем сложнее его вычислить. Многие пакеты программного обеспечения объявляют, что они поддерживают 40-битные или 128-битные технологии шифрования. Это утверждение соотносится с длиной ключа, используемого в процессах шифрования. Но стойкость ключей шифрования трудно себе представить без понимания того, какая работа требуется для его вычисления. Как мы уже упоминали ранее, шифрование должно обеспечиваться невозможность извлечения данных без знания ключа, а также не должно существовать способов вычисления ключа из зашифрованных данных. Существует два основных способа, с помощью которых взламываются системы шифрования - brute force (грубая сила) и статистический анализ (statistical analysis).

Атаки brute force являются самыми простыми по реализации, но требуют больших затрат времени. Они сводятся к попыткам перебрать все возможные ключи шифрования до тех пор, пока данные не будут расшифрованы. По существу это отгадывание значения ключа шифрования. И хотя это звучит довольно просто, необходимо принимать во внимание следующий фактор: вы должны иметь способ определить, была ли атака успешной или нет? Другими словами, как вы узнаете, что уже смогли расшифровать данные? И второй фактор, который следует принимать во внимание, это размер ключа. 40-битный ключ, например, имеет 240 или 1,099,511,627,776 возможных вариантов. А 128-битный – уже 2128 или 340,282,366,920,938,000,000,000,000,000,000,000,000. Эти огромные цифры делают отгадывание ключа очень дорогостоящим, даже если не принимать во внимание описанную выше проблему определения того, была ли ваша попытка успешной.

Атаки типа статистический анализ использую другой подход. Эти атаки используют недостатки в реализации и использовании ключей. Эти недостатки могут быть связаны с генерацией, хранением или передачей ключей. Несколько лет назад реализация протокола Secure Sockets Layer (SSL) через Netscape navigator была взломана после того, как было выявлено, что ключ шифрования являлся производной от показаний внутренних часов компьютера. Хакеры оказались в состоянии определить, что достаточно генерировать только 220 значений ключа вместо 240. Другая форма статистического анализа заключается в поиске закономерностей в зашифрованных данных. Если этот документ был зашифрован, тогда решение кроется в сравнении шифрованного текста с известной алфавитной статистикой. Например, хорошо известно, что наиболее часто используемой буквой является буква “e” (в английском алфавите, - прим перев.). Пытаясь сопоставить наиболее часто встречаемые символы, появляющиеся в шифрованном тексте, с наиболее часто встречаемыми буквами алфавита, злоумышленник формирует основу для атаки типа статистический анализ.

Если опираться только на эти факты, то можно сделать вывод, что статистический анализ более прост в реализации, чем атака типа brute force. В основном это правильно, однако существует несколько технических приемов, используемых для снижения эффекта от атак типа статистический анализ. Две из этих техник использование чисел инициализации (seeding) и добавление привязок (salting) наиболее часто применяются.

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

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

Когда расшифровка уже выполнена, в любом случае, для завершения процесса потребуется логическое решение. Важно заметить, что расшифровка никогда не может провалиться, поскольку функция f(x) = y выполняется математически. Успех расшифровки основан на значении y, являющемся результатом выполнения некоторой функция f(x). Чтобы проиллюстрировать сказанное, рассмотрим пример. Злоумышленник предпринимает попытку расшифровки телефонного номера. Как злоумышленник может знать, что его попытка расшифровки телефонного номера была успешной? Существует несколько простых тестов, которые можно выполнить. Прежде всего, если значение y не похоже на телефонный номер, то оно не проходит символьную проверку (наличие недопустимых символов и букв в номере и т.д.), что означает, что расшифровка провалилась и мы можем переходить к следующему ключу. В заключение, после того, как вы попробуете все возможные ключи, у вас, возможно, окажется список наборов символов, выглядящих как телефонные номера, но, до тех пор, пока вы, позвонив, не проверите каждый из них, вы не узнаете, который их них правильный. Криптоаналитические системы часто используют очень сложные системы логического сравнения закономерностей, пытаясь определить, когда расшифровка является успешной, используя представления о том, как должен выглядеть незашифрованный текст. Если предпринимается попытка расшифровать данные HTTPS, то мы знаем, что незашифрованный текст должен выглядеть как обычный HTTP, поэтому все, что не походит на HTTP, может быть отброшено. Как видите, без некоторых специальных знаний о том, что же мы ищем, расшифровка данных представляется очень сложной задачей.

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

Для того чтобы знать перспективы «взлома» шифрованных данных, мы можем посмотреть на результаты исследования, предпринятого компанией RSA Security в конце 90-х годов. Его детали могут быть найдены на сайте www.rsa.com/rsalabs. Объединив между собой десятки тысяч компьютеров по всему миру в 1998 году, специалисты компании оказались способны расшифровать сообщение, использующее протокол шифрования 40-битный DES, за 39 дней.

Управление ключами – Ахиллесова пята

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

Для того чтобы генерирование ключей считалось безопасным, оно должно демонстрировать следующие две характеристики. Прежде всего, пространство возможных значений ключей должно быть равно всему пространству ключей (keyspace). Это условие не было обеспечено в системе генерирования ключей SSL в Netscape navigator, что привело к ее взлому. Второе условие – ключ должен быть полностью случаен. Генератор случайных чисел никогда не должен производить одинаковые числа, даже при полностью одинаковых условиях.

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

Обмен ключами, возможно, наиболее важная функция управления ключами. Обмен ключами является сложной темой и выходит за рамки обсуждения проблем шифрования. Следите за следующими статьями этой серии для получения дополнительной информации. Принципы, обсуждаемые в этой статье, главным образом применимы к типу шифрования, известному как симметричное шифрование. Шифрование с симметричным ключом отвечают большинству из выполняемых операций шифрования, поскольку является не только эффективным, но и безопасным. Оно, правда, содержит один значимый недостаток – обе взаимодействующие стороны должны использовать один и тот же ключ и должны этим ключом обмениваться. Этот обмен ключами часто осуществляется либо с помощью асимметричного шифрования, либо шифрования с открытым ключом (public key). Или, в некоторых случаях, используется такой протокол обмена ключами как Diffie-Helman, применяемый в большинстве реализаций IPSec.

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

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

Защита целостности данных

Данные сохраняют свою ценность до тех пор, пока они правильны. Состояние данных, при котором сохраняется их правильность, называется целостностью данных (data integrity). Целостность данных имеет несколько значений, но, в основном, может быть сведена к следующим трем пунктам:

  • Только авторизованные пользователи имеют возможность выполнять санкционированные изменения данных;
  • Неправомочные пользователи не имеют возможность выполнять несанкционированные изменения данных;
  • Данные являются внутренне и внешне согласованными.

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

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

Односторонняя хэш-функция концептуально похожа на функцию четности (parity). Вычисление осуществляется над данными перед тем, как они передаются или сохраняются. Результаты вычисления сохраняются вместе с данными. Перед повторным использованием данных, вычисление осуществляется еще раз и новые результаты сравниваются с сохраненными. Если результаты совпадают, значит данные не изменились и, следовательно, целостность данных была сохранена. Алгоритмы хэширования похожи на алгоритмы шифрования, но между ними также существует четкое различие. В то время как секретный ключ используется для того, чтобы сделать результат алгоритма шифрования непредсказуемым, алгоритм хэширования должен быть на 100% предсказуемым. Если он не будет предсказуемым, то его нельзя будет воспроизвести и, следовательно, результат окажется непроверяемым. Алгоритм хэширования работает, принимая значение документа в качестве входного параметра. Затем алгоритм сортирует документ множество раз, перемещая данные из документа при каждой итерации. Результатом является строка фиксированной длины, полученная из этого документа. Хэш-алгоритмы очень чувствительны к изменениям и поэтому изменение даже одного бита в исходном документе приведет к изменению 50% битов в хэше. Кроме того, невозможно извлечь сам документ из хэша. Это происходит потому, что хэш является неполным документом, поскольку в нем отсутствуют кусочки данных.

Двумя наиболее часто используемыми алгоритмами хэширования являются MD5 (Message Digest 5), придуманный компанией RSA Security и SHA-1 (Secure Hash Algorithm-1), придуманный Агентством Национальной Безопасности (NSA). MD5 производит 128-битный хэш из любого потока данных, в то время как SHA-1 производит 160-битный хэш. Чем длиннее хэш, тем большую безопасность он обеспечивает и поэтому SHA-1 - чаще используемый алгоритм.

Процесс хэширования может быть представлен в следующем виде:

Хэш{Данные} = y

Затем данные передаются в виде Данные+y.

Когда данные получены, значение y извлекается и целостность определяется следующим образом:

Если Хэш{Полученные Данные} = y, тогда данные верны

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

Шифрование с открытым ключом (public key)

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

Шифрование с асимметричным ключом основано на следующих четырех правилах:

  1. Каждый участник имеет закрытый ключ, хранимый независимо от других.
  2. Каждый участник имеет открытый ключ, являющийся общим.
  3. Закрытый ключ и открытый ключ связаны математически.
  4. Невозможно определить один ключ, зная другой.

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

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

Правила шифрования с использованием открытого ключа следующие:

Шоткр.кл.{данные} = Рзакр.кл.{данные}

И

Шзакр.кл.{данные} = Роткр.кл.{данные}

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

Обеспечение подлинности с помощью закрытого ключа

Алиса хочет послать сообщение Бобу. У Алисы есть закрытый ключ и открытый ключ. Алиса может послать сообщение Бобу и доказать свою подлинность следующим образом:

Шзакр.кл.(Алиса){Сообщение}

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

Pоткр.кл.(Алиса){Сообщение}

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

Обеспечения конфиденциальности сообщения с помощью открытого ключа

Одной из проблем в приведенном выше примере является то, что сообщение Алисы может быть прочитано каждым. Здесь нет никакого упоминания о конфиденциальности. Секретность может быть достигнута с помощью того же метода, но примененного в обратном порядке. Для того чтобы послать сообщение, которое мог бы прочесть только Боб, Алиса может выполнить следующую операцию:

Шоткр.кл.(Боб){Сообщение}

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

Рзакр.кл.(Боб){Сообщение}

Боб теперь в состоянии прочесть это сообщение.

Стойкость симметричного шифрования основывается на полном размере пространства ключей и секретности ключей. Как известно, стойкость асимметричного шифрования гораздо ниже. Фактически, зная открытый ключ, процедурно очень просто вычислить закрытый ключ. Стойкость этого вида шифрования заключается в том, что хотя эта процедура очень проста, для ее выполнения требуются огромнейшие затраты вычислительной мощности. Давайте возьмем математическую функцию квадратный корень. Процесс возведения числа в квадрат (умножение его на себя) и извлечения квадратного корня (определение того, какое число при умножении на себя дает этот результат) являются прямо связанными друг с другом и принципиально противоположными. Очень просто вычислить, что 232 = 529, но очень трудно определить, что квадратный корень из 529 = 23. Подобные проблемы относятся и к операции разложения на множители. Когда два простых числа перемножаются и дают некий результат, то мы говорим, что эти простые числа являются множителями этого результата. Определение множителей, дающих заданный результат, простая, но требующая затрат времени задача. Если результат и множители достаточно большие (сотни знаков), тогда для вычисления множителей требуется время (даже с учетом закона Мура (Moore)), измеряемое десятками дней. Стойкость шифрования с асимметричным ключом заключается в том, что его взлом чрезвычайно долгая процедура, что делает вычисление закрытого ключа по данному открытому ключу статистически невозможным.

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

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

Складываем все вместе

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

Технология

Главное применение

Главные преимущества

Главные недостатки

Симметричное шифрование

Групповое шифрование больших объемов данных

Скорость и безопасность

Обмен ключами

Асимметричное (открытый ключ) шифрование

Аутентификация сторон

Безопасность – отсутствие обмена ключами

Очень медленное, большие накладные расходы

Хэширование

Целостность данных

Стабильная технология, высокая степень безопасности

Хэш может стать предметом подмены, что делает его применение бесполезным

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

Алиса надеется послать конфиденциальное сообщение Бобу таким образом, чтобы только он мог получить его. Боб хочет удостовериться, что это сообщение пришло именно от Алисы и что оно не было подделано в ходе пересылки. Практически, эта процедура с использованием протокола шифрования S/MIME будет выглядеть так:

  1. Алиса создает сообщение С.
  2. Алиса использует открытый ключ Боба для шифрования сообщения Шоткр.кл.(Боб){С} в виде шС.
  3. Алиса создает хэш Х сообщения шС, выполнив Х{шС}
  4. Алиса использует свой закрытый ключ для шифрования этого хэша Шзакр.кл.(Алиса){Х} в виде шХ.
  5. Алиса компонует полное сообщение в виде шС:шХ. И пересылает эту структуру Бобу.
  6. Боб разделяет шС и шХ.
  7. Боб создает повторный хэш сообщения шС. Боб получает подтверждение, что это сообщение пришло от Алисы И что оно не было изменено в ходе передачи, расшифровывая полученный хэш и сравнивая его с новым хэшем: Роткр.кл.(Алиса){Х} = Х{шС}.
  8. Боб использует свой закрытый ключ для расшифровки тела сообщения: Рзакр.кл.(Боб){шС} = С.
  9. Боб читает сообщение.

На шаге 7 и 8 Боб выполняет три фундаментальные операции, гарантирующие подлинность. Повторное генерирование хэша с последующим сравнением его с расшифрованной версией присоединенного к сообщению хэша (шХ) обеспечивает две функции. Если документ был подменен ИЛИ сообщение пришло не от Алисы, то эта операция провалится. Единственная информация, которая окажется доступной Бобу в этом случае, это то, что его новая версия хэша не совпадает с тем, что был присоединен к документу. К этому может привести одно из приведенных ниже возможных условий.

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

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

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

Протокол SSL (Security Sockets Layer)

Разработанный компанией Netscape в середине 90-х протокол SSL, стал, де-факто, стандартом безопасной передачи в Интернете. SSL использует комбинацию симметричного и асимметричного шифрования для обеспечения сквозной безопасности. Этот процесс выглядит так.

  1. Клиент инициирует SSL-сеанс, используя URL и префикс HTTPS://.
  2. HTTP-сервер отвечает на запрос посылкой клиенту своего открытого ключа, хранимого в цифровом сертификате.
  3. Клиент удостоверяется в подлинности сертификата и затем генерирует ключ (секретный) сеанса.
  4. Клиент шифрует секретный ключ, используя открытый ключ сервера и посылает его серверу, присоединяя к сообщению хэш.
  5. Шифрованное сообщение и хэш получаются и обрабатываются HTTP-сервером. Сервер использует хэш, чтобы убедиться, что сообщение не было изменено и свой закрытый ключ для расшифровки ключа сеанса.
  6. Сервер посылает клиенту вызов, зашифрованный с использованием ключа сессии.
  7. Клиент использует ключ сессии для расшифровки вызова и того, был ли успешным запрос данных.

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

Шифрование с помощью эллиптической кривой (Elliptic Curve Cryptography)

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

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

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

И в заключении….

Следующая статья этой серии, посвященной вопросам безопасности, будет рассказывать о протоколе Kerberos. Kerberos является краеугольным камнем системы аутентификации в Windows 2000 и Windows Server 2003. Мы рассмотрим механизм и реализацию протокола Kerberos.

Кори Хайнс в настоящее время является преподавателем и консультантом ассоциации Genesis-ii. Он работал в данном качестве для правительства и частных компаний в течение 8 лет и обладает множеством сетрификационных статусов, включая такие, как Microsoft Certified System Engineer + Internet (MCSE+I), Microsoft Certified Database Administrator (MCDBA), Microsoft Certified Solution Developer (MCSD), Novell Master CNE, Certified Information Systems Security Professional (CISSP), Security Certified Network Professional (SCNP) and Linux+.