Перейти к содержанию

18.1 Как работает шифрование (How Encryption Works)

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

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

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

ZABCDEFGHIJKLMNOPQRSTUVWXY
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Примечание

Этот простой метод шифрования называется сдвигом букв (letter shift).

Нижняя строка использовалась для открытого текста, верхняя — для зашифрованного. Например, открытый текст «JAKE LIKES PAM» при кодировании принимал вид «IZJD KHJFR OZL». Со временем учитель разгадал этот шифр. Тогда мы перешли к другому коду — с использованием цифр и букв, как показано ниже:

26 1 2 3 4 5 6 7 8 9 10 11....
A  B C D E F G H I J K  L ....

По этому коду имя моего друга Джейка записывалось как «9 26 10 4». Базовая концепция использования ключей для запутывания и распутывания сообщений применима и для кодирования сетевых коммуникаций. В современном мире, где вопросы безопасности стоят особенно остро, необходимость шифрования содержимого сетевых передач чрезвычайно актуальна. С помощью инструментов мониторинга сети (таких как nmap, рассмотренный в предыдущей главе) злоумышленнику сравнительно легко перехватить сетевые пакеты и прочитать их. Если эти пакеты содержат конфиденциальные данные — имена пользователей, пароли, финансовую информацию, номера кредитных карт или личные сведения, — последствия могут быть весьма серьёзными.

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

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

Рассмотрим сначала симметричное шифрование.

Симметричное шифрование (Symmetric Encryption)

Чтобы моя система шифрования четвёртого класса работала, у всех нас должен был быть абсолютно одинаковый ключ для шифрования и расшифровки сообщений. Использование неправильного ключа на стороне отправителя или получателя давало бы бессмысленный набор символов. Такая система называется симметричным шифрованием (symmetric encryption). При симметричном шифровании ключ, которым зашифровано сообщение, совпадает с ключом для его расшифровки. Это означает, что у отправителя и получателя должен быть один и тот же ключ. Это показано на рис. 18-1.

Примечание

Симметричное шифрование иногда называют шифрованием с секретным ключом (secret key encryption).

Рис. 18-1. Схема симметричного шифрования: сообщение шифруется и дешифруется одним и тем же ключом.

Рис. 18-1. Симметричное шифрование.

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

  • Тройной стандарт шифрования данных (3DES) (Triple Data Encryption Standard, 3DES) — широко применяется многими службами Linux. 3DES шифрует данные в три этапа и использует 112-битный или 168-битный ключ.
  • Усовершенствованный стандарт шифрования (AES) (Advanced Encryption Standard, AES) — улучшенная версия 3DES. Поддерживает ключи длиной 128, 192 и 256 бит.
  • Blowfish — использует ключи переменной длины до 448 бит.

Важный фактор при выборе любой схемы шифрования — количество битов, используемых для кодирования данных. Более старые схемы шифрования использовали всего 40 или 56 бит. В современных вычислительных условиях этого попросту недостаточно. Быстрый персональный компьютер, купленный в ближайшем магазине электроники, за относительно короткое время взломает 40-битное шифрование. При выборе схемы шифрования следует остановиться на той, которая поддерживает минимум 128 бит. Чем длиннее ключ, тем надёжнее защита данных.

Из-за сложностей, связанных с распределением ключей, сегодня широко применяется другой механизм шифрования — асимметричное шифрование (asymmetric encryption). Рассмотрим, как оно работает.

Асимметричное шифрование (Asymmetric Encryption)

В отличие от симметричного, асимметричное шифрование использует два ключа вместо одного: открытый ключ (public key) и закрытый ключ (private key). Данные, зашифрованные открытым ключом, могут быть расшифрованы только закрытым ключом. Данные, зашифрованные закрытым ключом, могут быть расшифрованы только открытым ключом. По этой причине асимметричное шифрование часто называют криптографией с открытым ключом (public key cryptography). Алгоритм Ривеста–Шамира–Адлемана (RSA) (Rivest Shamir Adleman, RSA) и алгоритм цифровой подписи (DSA) (Digital Signature Algorithm, DSA) — примеры криптографических стандартов, использующих асимметричное шифрование.

Примечание

Пары закрытый/открытый ключ должны быть значительно длиннее, чем ключи для симметричного шифрования. Их длина должна составлять 1024 бит и более.

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

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

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

Ещё одна проблема криптографии с открытым ключом — необходимость проверить подлинность открытого ключа. Для этого используют удостоверяющий центр (certificate authority, CA). Удостоверяющий центр — это сетевая служба, ответственная за выдачу ключей шифрования и управление ими. При запросе пары ключей в удостоверяющем центре он одновременно генерирует открытый и закрытый ключи, используя указанную схему шифрования, например RSA или DSA.

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

Основная роль удостоверяющего центра — удостоверять личность сторон, участвующих в зашифрованном обмене. Удостоверяющий центр выполняет это путём выдачи сертификатов открытого ключа (public key certificates). Сертификат открытого ключа — это цифровое сообщение, подписанное закрытым ключом, которое обеспечивает криптографическую привязку открытого ключа к организации, владеющей закрытым ключом. Сертификат содержит следующие сведения:

  • Название организации
  • Открытый ключ организации
  • Срок действия сертификата
  • Серийный номер сертификата
  • Название удостоверяющего центра, подписавшего сертификат
  • Цифровая подпись удостоверяющего центра

Необходимо знать два типа удостоверяющих центров:

  • Внутренний удостоверяющий центр (Internal CA) — удостоверяющий центр, поддерживаемый организацией для внутреннего использования. В большинстве дистрибутивов Linux пакет OpenSSL устанавливается автоматически и используется для создания удостоверяющего центра на сервере. Этот центр применяется для создания ключей и выдачи сертификатов службам, работающим на сервере. Однако такой центр не является доверенным. Если другие системы подключаются к службам на вашем сервере через защищённое соединение, пользователи удалённой системы получат предупреждение в своём клиентском программном обеспечении: сертификат действителен, но выдан не доверенным удостоверяющим центром. Это объясняется тем, что сертификат выдан вашим собственным удостоверяющим центром. Для внутреннего взаимодействия это не представляет серьёзной проблемы — мы доверяем себе. Однако если вы работаете с внешними сторонами, внутреннего удостоверяющего центра будет недостаточно.

  • Внешний удостоверяющий центр (External CA) — внешние стороны нуждаются в заверении со стороны доверенной объективной третьей стороны в том, что получаемые сертификаты действительны и что вы действительно являетесь тем, за кого себя выдаёте. Это обеспечивается с помощью внешнего удостоверяющего центра, например VeriSign или GTECyberTrust. Эти организации выполняют те же функции, что и внутренний удостоверяющий центр, однако пользуются глобальным доверием. Например, при обращении к защищённому сайту в интернете через браузер Firefox вы не увидите предупреждения, которое появляется при использовании внутреннего удостоверяющего центра. Это объясняется тем, что в браузер заранее встроен список доверенных удостоверяющих центров, как показано на рис. 18-2.

Рис. 18-2. Окно «Менеджер сертификатов» в Firefox со списком доверенных удостоверяющих центров.

Рис. 18-2. Доверенные удостоверяющие центры.

Рассмотрим пример того, как работает криптография с открытым ключом. Допустим, вы используете браузер для посещения сайта www.mydomain.com, нашли товар, без которого просто не можете обойтись, добавили его в корзину и начинаете оформлять заказ. Когда вы отправляете данные кредитной карты на сервер интернет-магазина, происходит следующее (рис. 18-3):

  1. Браузер запрашивает у внешнего удостоверяющего центра открытый ключ для www.mydomain.com.
  2. Удостоверяющий центр возвращает открытый ключ браузеру, который использует его для шифрования сообщения.
  3. Браузер отправляет зашифрованное сообщение на www.mydomain.com.
  4. Веб-сервер на другом конце использует свой закрытый ключ для расшифровки передачи.

Рис. 18-3. Схема работы шифрования с открытым ключом: клиент шифрует данные открытым ключом, полученным от внешнего удостоверяющего центра; веб-сервер расшифровывает их закрытым ключом.

Рис. 18-3. Как работает шифрование с открытым ключом.

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

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