Module 1

Шифрование и расшифрование

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

Алгоритмы шифрования можно грубо разделить на 3 категории:

  • алгоритмы без ключа
  • алгоритмы на основе симметричного скрытого ключа
  • алгоритмы на основе асимметричной пары открытого и закрытого ключей

"Безопасность" техники шифрования без ключа основана на идее, что алгоритм расшифрования неизвестен. Вероятно, самый известный такой алгоритм: ROT13, где буквы сдвигаются на 13 позиций с переходом через конец алфавита. В результате, например, 'a' становится 'n'. Алгоритмы без ключа не считаются безопасными и не должны использоваться вне газетных головоломок.

Алгоритмы на основе симметричного скрытого ключа предполагают, что алгоритмы шифрования и расшифрования известны, но обе стороны совместно используют скрытый ключ, так что без ключа расшифрование очень сложно. Вероятно, самый известный такой алгоритм — шифр Цезаря, названный в честь Юлия Цезаря. В шифре буквы сдвигаются на определенное количество позиций с переходом через конец алфавита. Здесь ключ — это целое число, указывающее сдвиг. ROT13 является частным случаем шифра Цезаря, где сдвиг специально зафиксирован равным 13. Сам Юлий использовал сдвиг 3, а его племянник Август — сдвиг 1.

Критически важно, чтобы число кандидатов для ключа было очень большим и делало атаку перебором невозможной. Например, шифр Цезаря можно легко взломать даже без компьютера, поскольку существует только 26 вариантов. Более современный пример — Content Scrambling System (CSS) для DVD, представленная в 1996 году и скомпрометированная в 1999 году. CSS использовала 40-битный ключ, оставляя 240 вариантов значения ключа. Причина такого "маленького" ключа заключалась в том, что в то время в США действовали ограничения на экспорт сильных криптографических методов. Сейчас эти ограничения ослаблены, но не полностью сняты. Короткий ключ позволил провести атаку перебором и взломать шифрование за 17 часов с использованием компьютера того времени.

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

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

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

Криптографические хэши

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

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

В настоящее время наиболее заметное семейство хэш-функций: SHA-2. Известная хэш-функция MD5 также использовалась для хэширования чувствительных данных. Однако она серьезно скомпрометирована и не должна использоваться в приложениях безопасности. MD5 все еще полезна, например, для предоставления уникального идентификатора документов.

Сертификаты

Хотя шифрование гарантирует, что третья сторона не сможет подслушивать коммуникацию, она все еще уязвима к атаке "человек посередине": третья сторона может притвориться сервером, с которым пользователь хочет связаться. Атака выполняется следующим образом. Рассмотрим две стороны, Alice и Bob, а также атакующую Melissa. Alice хочет безопасно отправить сообщение Bob, а Melissa хочет перехватить сообщение.

  1. Melissa заставляет Alice поверить, что она Bob.
  2. Alice запрашивает у Bob, то есть у Melissa под видом Bob, открытый ключ. Вместо этого Melissa предоставляет Alice свой собственный открытый ключ.
  3. Alice шифрует информацию подмененным ключом и отправляет ее обратно Melissa.
  4. Melissa расшифровывает информацию с помощью своего секретного ключа.

Суть проблемы в том, что Alice не может проверить, принадлежит ли открытый ключ Bob. Для решения этой проблемы используются сертификаты.

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

  1. Bob просит Benedict подписать его открытый ключ.
  2. Benedict использует открытый ключ Bob и его идентичность для создания подписи, которая шифруется секретным ключом Benedict, и отправляет подпись Bob.
  3. По запросу Bob отправляет Alice сертификат, то есть свою информацию и зашифрованную подпись.
  4. Alice расшифровывает подпись с помощью открытого ключа Benedict и проверяет, что информация в сертификате соответствует расшифрованной подписи.
  5. Alice проверяет, что идентичность в сертификате действительно принадлежит Bob.
  6. Теперь Alice может доверять открытому ключу, предоставленному в сообщении Bob.

Посмотрим на последовательность этих событий внимательнее. Во-первых, обратите внимание, что подпись создается путем шифрования секретным ключом, а не открытым ключом. Поскольку Benedict — единственный, кто знает секретный ключ, только он может создать подпись. Подпись содержит идентичность Bob, а также открытый ключ, поэтому Alice может доверять корректности информации, доверяя действию Benedict.

Именно так работают сертификаты. В приведенном выше примере Benedict известен как центр сертификации (Certificate Authority, CA), Bob является веб-сервером, а Alice — обычным пользователем. Центры сертификации — это компании, предоставляющие сертификаты для веб-серверов, фактически давая им средство доказать, кто они.

Melissa не может подделать Bob, потому что ей нужно предоставить поддельный сертификат для Bob. У нее есть 3 варианта, и ни один из них не сработает:

  1. Она может использовать сертификат Bob, но не сможет расшифровать входящий трафик, потому что Alice будет шифровать данные открытым ключом Bob.
  2. Она может получить собственный действительный сертификат, но Alice заметит, что сертификат принадлежит Melissa, а не Bob.
  3. Она может изменить сертификат, заменив ключ Bob своим, но содержимое больше не будет соответствовать подписи, поэтому Alice отклонит измененную подпись.

Ключевое предположение здесь состоит в том, что Alice доверяет Benedict. На практике компьютер имеет список доверенных центров сертификации, полученный по защищенному каналу, например при установке новой операционной системы.

На практике могут существовать промежуточные стороны: Bob не использует Benedict напрямую, а просит посредника, например William, выдать сертификат. William имеет собственный сертификат, который он получил от Benedict. Тогда Alice нужно проверить сертификаты и Bob, и William.

Похожая схема также используется для подписи исполняемых файлов.

Вы дошли до конца этого раздела!

Не забудьте проверить свои баллы в индикаторе в правом нижнем углу материала!