Криптография с открытым ключом: RSA, ECC, подписи и обмен ключами

Криптография с открытым ключом: RSA, ECC, подписи и обмен ключами Полезное

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

Важно с самого начала не смешивать три разные задачи, которые эта криптография решает разными алгоритмами:

  • Шифрование — закрыть данные так, чтобы их прочитал только владелец закрытого ключа (RSA-OAEP).
  • Согласование ключа — выработать общий секрет через открытый канал, ничего секретного по нему не пересылая (Диффи-Хеллман, ECDH).
  • Цифровая подпись — подтвердить авторство и целостность данных (RSA-PSS, ECDSA, EdDSA).

На этих задачах держатся TLS, электронные подписи и криптовалюты. Ниже разберу принцип, алгоритмы RSA и ECC с прогоняемым кодом, протокол Диффи-Хеллмана, цифровую подпись, актуальные длины ключей на 2026 год и угрозу со стороны квантовых компьютеров. Весь код в статье запущен, вывод в блоках — реальный.

Симметричное и асимметричное шифрование: в чем разница

В симметричном шифровании один и тот же ключ и шифрует, и расшифровывает (так работают AES, ГОСТ «Кузнечик»). Это быстро, но есть проблема: ключ надо как-то передать собеседнику по защищенному каналу, а его-то часто и нет.

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

Признак Симметричное Криптография с открытым ключом
Ключи один общий секретный пара: открытый + закрытый
Скорость высокая заметно ниже, поэтому не для основного потока данных
Передача ключа нужен защищенный канал открытый ключ можно публиковать, но его принадлежность нужно проверить
Длина ключа 128-256 бит 256 бит (ECC) — 3072+ бит (RSA)
Алгоритмы (по задачам) AES, ChaCha20, «Кузнечик» RSA — шифрование и подпись; DH/ECDH — согласование секрета; ECDSA/EdDSA — подпись; ECC — семейство методов на эллиптических кривых

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

Как работает: пара ключей

Обмен зашифрованными данными идет так:

  1. Получатель генерирует пару ключей — открытый и закрытый.
  2. Открытый ключ он передает отправителю. Скрывать его не нужно, но нужно проверить, кому он принадлежит. В TLS эту связь подтверждает сертификат и цепочка доверия.
  3. Отправитель шифрует данные открытым ключом получателя и отсылает шифртекст.
  4. Получатель расшифровывает его своим закрытым ключом.

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

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

Математически пара опирается на «одностороннюю функцию с секретом» (trapdoor): вычислить результат легко, а обратить без знания секрета вычислительно неподъемно. У RSA это разложение большого числа на простые множители, у ECC — дискретный логарифм на эллиптической кривой.

Алгоритм RSA

RSA (по фамилиям Rivest, Shamir, Adleman, 1977) держится на сложности факторизации — разложения большого числа на простые множители. Перемножить два простых числа легко, а восстановить их из произведения при длине в сотни цифр — практически нет.

Соберу учебную пару на маленьких простых числах и прогоню шифрование и расшифровку. Это математическая демонстрация textbook RSA: она показывает арифметику, но небезопасна и не годится для production. В реальности p и q — числа длиной в сотни десятичных цифр:

# Математическая демонстрация (textbook RSA) на маленьких числах - НЕ для production
p, q = 61, 53              # два простых числа (в реальности - огромные)
n = p * q                  # модуль, входит в оба ключа
phi = (p - 1) * (q - 1)    # значение функции Эйлера от n
e = 17                     # открытая экспонента, взаимно проста с phi
d = pow(e, -1, phi)        # закрытая экспонента: (e*d) mod phi = 1

print("n =", n, "  phi =", phi)
print("Открытый ключ (e, n):", (e, n))
print("Закрытый ключ (d, n):", (d, n))

m = 42                     # число-сообщение, обязательно m < n
c = pow(m, e, n)           # шифруем ОТКРЫТЫМ ключом: c = m^e mod n
m2 = pow(c, d, n)          # расшифровываем ЗАКРЫТЫМ: m = c^d mod n
print("сообщение:", m, "-> шифр:", c, "-> расшифровка:", m2)

Вывод программы:

n = 3233   phi = 3120
Открытый ключ (e, n): (17, 3233)
Закрытый ключ (d, n): (2753, 3233)
сообщение: 42 -> шифр: 2557 -> расшифровка: 42

Секрет-«лазейка» здесь — множители p и q. Открыто публикуется только модуль n = 3233 и экспонента e = 17. Чтобы вычислить закрытую экспоненту d, нужно знать phi, а для этого — разложить n на 61 и 53. На маленьком числе это мгновенно, на 2048-битном — за пределами возможностей современных компьютеров.

Подпись RSA — отдельная задача, покажу ее отдельным примером на той же учебной паре ключей (n, e, d из кода выше). Это тоже только демонстрация арифметики:

# Отдельный пример: подпись на той же учебной паре (n, e, d) - тоже НЕ для production
n, e, d = 3233, 17, 2753   # та же учебная пара ключей из кода выше
m = 42                     # то же число-сообщение
sig = pow(m, d, n)         # закрытым ключом получаем значение подписи
check = pow(sig, e, n)     # открытым ключом восстанавливаем исходное значение
print("подпись:", sig, "-> проверка открытым ключом:", check)

Вывод программы:

подпись: 3065 -> проверка открытым ключом: 42

Здесь видно, почему подпись и шифрование — разные задачи, хотя обе используют модульное возведение в степень. Шифруют открытым ключом (читает только владелец закрытого), а значение подписи получают закрытым (проверить может каждый). Но это не «шифрование закрытым ключом»: безопасные схемы шифрования (RSA-OAEP) и подписи (RSASSA-PSS) имеют разные кодирования и не взаимозаменяемы. Учебный код выше не добавляет этих обязательных для боевого RSA дополнений, поэтому «голый» textbook RSA небезопасен — не переносите его в production. И еще важнее: сама модель «зашифровать закрытым ключом» — лишь особенность арифметики RSA и не переносится на ECDSA и EdDSA, где подпись устроена принципиально иначе.

Диффи-Хеллман: общий секрет без передачи ключа

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

Идея на свойствах остатков от деления: каждая сторона держит свой закрытый показатель, обменивается только публичными значениями, а из чужого публичного и своего закрытого обе получают одно и то же число:

# Протокол Диффи-Хеллмана: общий секрет через открытый канал
p = 23        # простой модуль (в реальности 2048+ бит)
g = 5         # генератор группы

a = 6         # закрытый ключ Алисы, не покидает ее машину
b = 15        # закрытый ключ Боба, не покидает его машину

A = pow(g, a, p)   # Алиса публикует A = g^a mod p
B = pow(g, b, p)   # Боб публикует B = g^b mod p
print("Алиса -> Боб (A):", A)
print("Боб -> Алиса (B):", B)

s_alice = pow(B, a, p)   # Алиса считает B^a mod p
s_bob   = pow(A, b, p)   # Боб считает A^b mod p
print("секрет у Алисы:", s_alice)
print("секрет у Боба: ", s_bob)
print("секреты совпали:", s_alice == s_bob)

Вывод программы:

Алиса -> Боб (A): 8
Боб -> Алиса (B): 19
секрет у Алисы: 2
секрет у Боба:  2
секреты совпали: True

Перехватчик видит p, g, A и B, но чтобы получить секрет, ему нужно решить задачу дискретного логарифма (найти a по g^a mod p) — при больших p это вычислительно неподъемно. Отдельно оговорюсь про границу: базовый Диффи-Хеллман согласует ключ, но не подтверждает, с кем именно, поэтому без аутентификации сторон он уязвим к атаке человек посередине. В TLS его всегда дополняют подписью на основе сертификата.

ECC и другие асимметричные алгоритмы

Криптография на эллиптических кривых (ECC) дает ту же стойкость при заметно более коротком ключе, поэтому вытесняет RSA в мобильных устройствах, TLS и блокчейне. Стойкость ECC опирается на сложность дискретного логарифма в группе точек эллиптической кривой.

Алгоритм На чем стоит Для чего
RSA факторизация больших чисел шифрование ключа и подпись
Диффи-Хеллман (DH/ECDH) дискретный логарифм согласование общего ключа
DSA дискретный логарифм цифровая подпись (стандарт DSS)
ECDSA / EdDSA дискретный логарифм на кривой подпись (TLS, Bitcoin, Ethereum)
ГОСТ Р 34.10-2012 дискретный логарифм на кривой подпись, российский стандарт

Bitcoin и Ethereum используют ECDSA на кривой secp256k1 для подписи транзакций; современный TLS и мессенджеры чаще берут EdDSA (Ed25519) и обмен ключами X25519. Схема Эль-Гамаля и «классический» DSA сегодня почти не применяются в новых системах, но их полезно знать как исторические основы подписи.

Длина ключа и надежность на 2026 год

Надежность асимметричного шифра определяется длиной ключа и сложностью базовой задачи для текущих вычислительных мощностей. Мощности растут, поэтому пороги длин со временем поднимают. Ключи RSA на 512-1024 бита сегодня считаются небезопасными.

Ниже — ориентир по сопоставимой стойкости (по методике NIST SP 800-57): сколько бит RSA и ECC дают защиту, эквивалентную симметричному ключу.

Стойкость, бит Симметричный RSA (модуль) ECC (ключ)
112 3DES 2048 224-255
128 AES-128 3072 256-383
192 AES-192 7680 384-511
256 AES-256 15360 512+

Практический вывод на 2026 год: для RSA минимум — 2048 бит, а для новых систем с расчетом на годы вперед — 3072 бита и больше. Для ECC достаточно 256-битного ключа (P-256, Ed25519) — он дает стойкость уровня 128 бит при куда меньших накладных расходах, чем RSA-3072.

Отдельная угроза — квантовые компьютеры. Алгоритм Шора теоретически решает и факторизацию, и дискретный логарифм за полиномиальное время, то есть ломает и RSA, и ECC, как только появится достаточно мощная машина (по состоянию на 2026 таких нет). На этот случай NIST в 2024 году утвердил первые постквантовые стандарты (FIPS 203, 204, 205): ML-KEM (FIPS 203) для обмена ключами и ML-DSA, SLH-DSA (FIPS 204, 205) для подписи. Отдельные протоколы и продукты уже внедряют гибридные схемы, но этап и охват перехода зависят от конкретной системы.

Цифровые подписи

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

Подпись и шифрование — разные задачи, а не одна операция «наоборот». При шифровании открытым ключом закрывают данные для владельца закрытого. При подписи закрытым ключом фиксируют авторство: проверить подпись открытым ключом может любой, а подделать без закрытого ключа — нет. Если сообщение изменили хоть на бит, хэш не сойдется и проверка провалится. В RSA обе операции опираются на модульное возведение в степень, поэтому их легко перепутать, но у современных подписей (RSASSA-PSS, ECDSA, EdDSA) собственная математика, никак не сводимая к «шифрованию закрытым ключом».

Важная оговорка: подпись доказывает, что данные не менялись и что их подписал владелец конкретного закрытого ключа. Но что этот ключ принадлежит именно «Иванову», подпись сама по себе не гарантирует — за это отвечают сертификаты и удостоверяющие центры (PKI).

Ограничения метода

У асимметричного подхода есть цена и слабые места:

  • Скорость. Операции с открытым ключом обычно существенно дороже симметричных, поэтому ими шифруют не сам трафик, а только ключ или хэш (разница зависит от алгоритма, длины ключа, операции и реализации).
  • Зависимость от секретности закрытого ключа. Если он утек, скомпрометированы все зашифрованные им данные и все подписи.
  • Потеря ключа. Утратив закрытый ключ, владелец теряет и доступ к зашифрованным данным — в криптокошельках это означает безвозвратную потерю средств.
  • Доверие к открытому ключу. Нужен способ убедиться, что открытый ключ действительно принадлежит нужной стороне, — отсюда сертификаты и инфраструктура PKI.

Выводы

  • Криптография с открытым ключом использует пару ключей и решает три разные задачи разными алгоритмами: шифрование (RSA-OAEP), согласование ключа (Диффи-Хеллман, ECDH) и подпись (RSA-PSS, ECDSA, EdDSA); из открытого ключа закрытый практически не вычислить.
  • RSA стоит на сложности факторизации, ECC и Диффи-Хеллман — на дискретном логарифме; ECC дает ту же стойкость при более коротком ключе.
  • На 2026 год безопасный минимум — RSA 2048 бит (для новых систем 3072+) или ECC 256 бит; ключи до 1024 бит небезопасны.
  • Асимметрию почти всегда сочетают с симметричным шифром (гибридная схема в TLS): медленный асимметричный шаг согласует быстрый сеансовый ключ.
  • Против будущих квантовых компьютеров RSA и ECC уязвимы; переход идет на постквантовые стандарты NIST (ML-KEM, ML-DSA), утвержденные в 2024 году.

Где применяется и что учить дальше

Асимметричное шифрование лежит в основе повседневной безопасности: рукопожатие HTTPS/TLS при открытии любого сайта, электронная подпись документов, защищенная почта (S/MIME, PGP), SSH-доступ к серверам, подпись транзакций в блокчейне и криптокошельках. Понимание пары ключей, подписи и длины ключа — база для любой работы с защитой данных.

Освойте тему на практике

Если хочется разобрать криптографию системно — от математики RSA и эллиптических кривых до протоколов, PKI и постквантовых схем — посмотрите курс Криптографическая защита информации. Оценить формат и уровень до старта помогают бесплатные открытые уроки Otus — живые занятия с преподавателями.

FAQ

Каким ключом шифруют, а каким расшифровывают? Шифруют открытым ключом получателя, расшифровывает он своим закрытым. У подписи наоборот: создают закрытым ключом, проверяют открытым.

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

Что будет с RSA и ECC, когда появятся квантовые компьютеры? Достаточно мощный квантовый компьютер сломает их алгоритмом Шора. На этот случай с 2024 года есть постквантовые стандарты NIST (ML-KEM, ML-DSA), и переход на них уже начался.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)