open atlas
↑ К треку
Основы безопасности SECF · 02 · 03

Асимметричная криптография и обмен ключами

Криптография с открытым ключом решает проблему распределения ключей, которую симметричные шифры решить не могут, но она в 1000 раз медленнее — поэтому её применяют лишь для согласования симметричного ключа. Урок про RSA и ECC, обмен Диффи-Хеллмана и прямую секретность.

SECF Middle ◷ 15 min
Уровень
ОсновыJuniorMiddleSenior

Симметричное шифрование быстрое и нерушимое — и бесполезное, пока две стороны не разделят ключ. Вот загвоздка, о которой никто не предупреждает: AES-256 прекрасен, но как браузер и сервер оба узнают одни и те же 32 случайных байта, когда их первый пакет идёт через открытый Wi-Fi, полный людей, способных прочитать всё? Послать ключ в открытую нельзя — перехватчик заберёт его и расшифрует всю сессию. Заранее договориться нельзя — вы никогда не встречались с сервером. Десятилетиями это было настоящей стеной — пока в 1976-м Диффи и Хеллман не опубликовали трюк, позволяющий двум незнакомцам вывести общий секрет по прослушиваемой линии, где атакующий видит каждый байт и всё равно не может его вычислить. Всё, что вы зовёте «HTTPS», держится на этом одном приёме.

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

Зачем существует второй вид криптографии

Симметричные шифры — AES, ChaCha20 — используют один ключ и для шифрования, и для расшифровки. Они быстрые (современный CPU выдаёт гигабайты в секунду с AES-NI) и при 256 битах недостижимы для перебора. Их фатальное ограничение — проблема распределения ключей: обеим сторонам нужен один и тот же секрет, прежде чем они смогут общаться, а безопасно доставить его по недоверенной сети — ровно та задача, которую вы и пытались решить.

Асимметричная криптография (с открытым ключом) ломает симметрию. У каждой стороны есть пара ключей: открытый ключ, который она свободно раздаёт, и закрытый ключ, который она никогда не разглашает. Они математически связаны так, что сделанное одним отменяет только другой. Это даёт две разные возможности:

  • Шифрование: кто угодно шифрует на ваш открытый ключ; расшифровывает только ваш закрытый. Конфиденциальность без заранее разделённого секрета.
  • Подписи: вы подписываете своим закрытым ключом; кто угодно проверяет вашим открытым. Подлинность и целостность — доказательство, что сообщение пришло от владельца этого закрытого ключа и не было изменено.

Загвоздка в цене. Расшифровка RSA-2048 примерно в тысячу раз медленнее AES на байт, а у асимметричных алгоритмов есть жёсткий предел на размер того, что можно зашифровать напрямую (RSA не зашифрует больше, чем размер ключа минус набивка). Поэтому никто не шифрует тело запроса в 4 МБ через RSA. Универсальный приём — гибридное шифрование: дорогой асимметричный шаг выполняют один раз, чтобы согласовать свежий случайный симметричный ключ, а затем шифруют сам массовый трафик быстрым AES. Асимметрия — это рукопожатие; симметрия — это разговор.

RSA против эллиптических кривых: одна задача, разная математика

Доминируют два семейства. RSA опирается на сложность факторизации произведения двух больших простых чисел. Оно старое, проверенное и простое для рассуждений — но его ключи большие и растут по мере улучшения атак факторизации. Криптография на эллиптических кривых (ECC) опирается на другую трудную задачу (дискретный логарифм на эллиптической кривой), которая сопротивляется атакам куда лучше на бит, поэтому даёт эквивалентную стойкость при кардинально меньших ключах и более быстрых операциях. Именно поэтому мобильные платформы, TLS и современные протоколы перешли на кривые вроде P-256 и X25519.

Разрыв в стойкости-на-бит — это вся суть; вот эквивалентность, которую публикуют органы стандартизации:

Уровень стойкостиСимметрия (AES)Размер ключа RSAРазмер ключа ECCЧто это значит
~112 бит3DES (наследие)2048 бит224 битаМинимум, приемлемый сегодня
128 битAES-1283072 бита256 битСовременный дефолт (P-256 / X25519)
192 битаAES-1927680 бит384 битаВысокая гарантия (P-384)
256 битAES-25615360 бит521 битЗаметьте жестокое масштабирование RSA: впятеро больше бит ради вдвое большей стойкости

Вчитайтесь в нижнюю строку: чтобы сравняться с AES-256, RSA нужен ключ в 15360 бит — на котором генерация ключа и операции мучительно медленны, — тогда как ECC хватает 521 бита. Размер ключа RSA растёт примерно как кубический корень из работы по его взлому, поэтому удвоение уровня стойкости более чем удваивает ключ. Этот нелинейный штраф — причина, по которой новые системы по умолчанию берут кривые, а RSA вы встречаете в основном лишь в наследных сертификатах и существующей PKI.

Диффи-Хеллман: согласовать секрет в открытую

Передача ключа в стиле RSA (одна сторона выбирает симметричный ключ и шифрует его на открытый ключ другой) работает, но у неё есть изъян, к которому мы вернёмся. Более важный примитив — обмен ключами Диффи-Хеллмана (DH) и его форма на эллиптических кривых ECDH. DH — это не шифрование, а способ для двух сторон совместно вычислить общий секрет, который ни одна из них не выбирала в одиночку, по каналу, который атакующий читает целиком.

Механизм, очищенный до сути: обе стороны договариваются об открытых параметрах. Каждая сторона выбирает закрытое случайное значение, выводит из него открытое значение и посылает по проводу только открытое. Затем каждая сторона комбинирует своё закрытое значение с чужим открытым — и по алгебре конструкции обе приходят к идентичному общему секрету. Перехватчик видел оба открытых значения, но ни одного закрытого, а восстановить секрет из того, что прошло по проводу, — та самая трудная задача (дискретный логарифм), для которой нет эффективной атаки. Затем общий секрет прогоняют через функцию выведения ключа, получая симметричный сессионный ключ.

Есть критическая оговорка: чистый DH даёт конфиденциальность против пассивного перехватчика, но не говорит, кто на другом конце. Активный атакующий, севший посередине, может провести отдельный DH с каждой стороной и ретранслировать между ними — человек посередине (MITM). Поэтому DH обязан сочетаться с аутентификацией: в TLS сервер подписывает своё открытое значение DH закрытым ключом из-за своего сертификата, чтобы клиент знал, что значение пришло от настоящего сервера, а не от самозванца. Обмен ключами устанавливает секрет; подписи и сертификаты устанавливают, с кем вы им делитесь. Нужно и то, и другое.

Почему это работает

Почему не продолжать пользоваться передачей ключа RSA, где клиент шифрует выбранный сессионный ключ на открытый ключ сервера? Из-за того, что происходит после взлома. При передаче ключа RSA сессионный ключ защищён долгоживущим закрытым ключом сервера — поэтому атакующий, записавший ваш зашифрованный трафик сегодня и укравший этот закрытый ключ через два года, сможет вернуться и расшифровать каждую записанную сессию. Статический ключ никогда не менялся, поэтому одна кража отпирает весь архив. Именно эту слабость убирает эфемерный Диффи-Хеллман, и именно поэтому TLS 1.3 полностью отказался от передачи ключа RSA и предписывает эфемерный (EC)DH для каждого рукопожатия.

Прямая секретность: делая прошлое нерасшифровываемым

Лекарство от той архивной проблемы — прямая секретность (forward secrecy, она же совершенная прямая секретность). Идея: генерировать совершенно новую, одноразовую пару ключей DH для каждой сессии — это и есть эфемерность в ECDHE — и выбрасывать закрытые значения в тот же миг, как рукопожатие завершилось. Долговременный ключ сертификата используется лишь чтобы подписать эфемерный обмен, доказывая личность; он никогда не шифрует сессионный ключ и никогда не касается общего секрета.

Выигрыш — это свойство, при котором атакующий, скомпрометировавший долговременный закрытый ключ сервера позже, не может расшифровать трафик, захваченный раньше. Секрет каждой сессии умер вместе с эфемерными ключами, которые его породили; на диске не осталось ничего, из чего его можно восстановить. Без прямой секретности один украденный закрытый ключ задним числом отпирает годы записанных сессий — атака «собери сейчас, расшифруй потом», где противник записывает шифртекст сегодня именно для того, чтобы взломать его, как только получит ключ. С прямой секретностью каждая сессия — свой остров. Именно поэтому TLS 1.3 делает эфемерный (EC)DH необсуждаемым.

Выбери лучший вариант

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

Где асимметрия применяется, а где нет

Зрелая ментальная модель: асимметрия — для начальной загрузки доверия и ключей, а не для массовой работы. Она появляется ровно в трёх моментах — согласование сессионного ключа (ECDHE), доказательство личности (подпись сертификата над рукопожатием) и проверка подлинности в покое (подписанные обновления ПО, подписанные JWT, подпись кода). Всё остальное — гигабайты реальных тел запросов и ответов, данные, зашифрованные в вашей БД, файлы на диске — это симметричный AES, потому что асимметрия слишком медленна и ограничена по размеру для такой работы. Когда вы видите «зашифруй эту загрузку в 50 МБ», ответ никогда не «RSA»; он — «сгенерируй случайный ключ AES, зашифруй данные через AES и защити этот один маленький ключ асимметричным слоем».

Викторина

Почему реальные системы используют гибридное шифрование (асимметрия для согласования ключа, затем симметрия для данных), а не просто шифруют всё открытым ключом получателя?

Викторина

Атакующий два года молча записывал ваш TLS-трафик. Сегодня он крадёт долговременный закрытый ключ вашего сервера. При эфемерном ECDH из TLS 1.3 что он сможет расшифровать?

Расставь шаги по порядку

Упорядочьте шаги рукопожатия и сессии TLS с прямой секретностью, от первого к последнему:

  1. 1 Каждая сторона генерирует свежую эфемерную пару ключей DH для этой сессии
  2. 2 Каждая сторона посылает своё эфемерное открытое значение DH по проводу
  3. 3 Сервер подписывает своё эфемерное значение закрытым ключом сертификата (аутентификация)
  4. 4 Обе стороны комбинируют своё закрытое значение с открытым значением партнёра и выводят один общий секрет
  5. 5 Массовые данные приложения идут зашифрованными быстрым симметричным ключом (AES), выведенным из этого секрета
Вспомните перед уходом
  1. 01
    Объясните, почему системы используют гибридное шифрование и что делает каждое семейство криптографии в TLS-сессии.
  2. 02
    Что такое Диффи-Хеллман, почему ему нужна аутентификация и как эфемерный DH даёт прямую секретность?
Итог

Симметричная криптография (AES) быстра и стойка, но не может решить распределение ключей: обеим сторонам сначала нужен один и тот же секрет. Асимметрия чинит это парами открытый/закрытый ключ — кто угодно шифрует на ваш открытый ключ, расшифровывает только ваш закрытый; вы подписываете закрытым ключом, проверяет кто угодно открытым. Но она примерно в 1000 раз медленнее и ограничена по размеру, поэтому универсальный приём — гибридное шифрование: применить асимметрию один раз для согласования симметричного ключа, затем AES для массива. ECC кардинально бьёт RSA на бит (256-битная кривая равна 3072-битному ключу RSA), поэтому современные протоколы берут P-256 и X25519. Диффи-Хеллман позволяет двум незнакомцам вывести общий секрет по прослушиваемой линии, потому что восстановить его — задача дискретного логарифма, — но ему нужна аутентификация (подпись), чтобы остановить человека посередине. Делая ключи DH эфемерными и посессионными, вы получаете прямую секретность: будущая кража долговременного ключа не расшифрует записанный прошлый трафик, поэтому TLS 1.3 предписывает эфемерный (EC)DH. В следующий раз, увидев «зашифруй эту большую нагрузку», ваш рефлекс — сгенерировать случайный ключ AES, зашифровать данные через AES и защитить этот один маленький ключ асимметричным слоем — никогда не «RSA» целиком.

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 6 завершено
Связанные уроки

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.