Зачем понадобились кривые
Чем длиннее ключ RSA, тем тяжелее вычисления и тем больше данных нужно пересылать при рукопожатии. Эллиптическая криптография, ECC, решает ту же задачу иначе: безопасность достигается при значительно меньших размерах. Ключ на кривой длиной 256 бит по стойкости примерно сопоставим с RSA-3072, что обычно приводят как сравнительную оценку в рекомендациях по безопасности.
В результате рукопожатие быстрее, сертификаты короче, а батарея телефона расходуется меньше. Для мобильных устройств и встраиваемых систем это существенно. Основную идею ключей и подписей мы разбирали в статье про асимметричное шифрование, здесь речь о другой математической основе.
Что такое эллиптическая кривая здесь
Кривая описывается уравнением определённого вида, а в криптографии её рассматривают над конечным полем, то есть над ограниченным набором чисел, а не над непрерывной плоскостью. Точки такой кривой можно складывать по особым правилам, и на этом строится операция умножения точки на число.
Прямое умножение точки на число, то есть многократное сложение, вычисляется быстро. Обратная задача: зная начальную и итоговую точки, найти число, считается трудной. Её называют задачей дискретного логарифма на эллиптической кривой. На ней держится обмен ключами ECDH и подписи ECDSA и EdDSA. Логика обмена такая же, как в схеме Диффи-Хеллмана, но вместо возведения в степень применяют умножение точки.
Curve25519 и другие кривые
Не все кривые одинаково удобны. Стандартные кривые NIST, например P-256, широко поддерживаются, но их параметры вызывали вопросы у части специалистов, так как происхождение констант объясняли не до конца. Curve25519, предложенная Даниэлем Бернштейном, устроена так, чтобы типичные ошибки реализации было трудно допустить: выбор параметров прозрачен, а вычисления удобно выполнять за постоянное время.
На её основе построены обмен ключами X25519 и схема подписи Ed25519. Их использует TLS 1.3, SSH, мессенджеры и многие современные VPN-протоколы. В браузерах группа X25519 обычно предлагается первой в списке для обмена ключами, что можно увидеть в сведениях о соединении.
Ограничения ECC
Первое: эллиптические схемы уязвимы для квантовых компьютеров ещё сильнее, чем RSA, поскольку алгоритм Шора решает и эту задачу, причём для меньших размеров ключей. Поэтому для долгосрочной защиты обсуждают гибридные схемы, которые сочетают обычный обмен с постквантовым.
Второе: качество реализации имеет значение больше, чем название кривой. Ошибки со случайными числами при подписи ECDSA привели к известным утечкам закрытых ключей: если для подписи повторно применить одно и то же одноразовое число, ключ вычисляется. EdDSA спроектирована так, чтобы такой ошибки не допускать, потому что число вычисляется детерминированно.
Третье: не все программы поддерживают все кривые, поэтому совместимость старых систем надо проверять.
Как увидеть кривые у себя
Информация о группе обмена ключами доступна в инструментах разработчика браузера на вкладке безопасности. Для сайта команда openssl s_client -connect имя:443 покажет в выводе группу и тип ключа сервера, например id-ecPublicKey и prime256v1. Список поддерживаемых кривых можно получить командой openssl ecparam -list_curves.
Чтобы создать современный ключ SSH, выполните ssh-keygen -t ed25519. Получится короткий ключ, который удобно копировать и хранить. О взаимосвязи с прямой секретностью и эфемерными обменами рассказано на странице про PFS.
ECC в сертификатах и SSH
Сертификаты сайтов всё чаще выпускают с эллиптическими ключами, например на кривой P-256. Такое рукопожатие короче и быстрее, особенно на мобильных устройствах. Некоторые старые клиенты не понимают эллиптических сертификатов, поэтому серверы иногда держат оба варианта: RSA и ECDSA, и выбирают по возможностям клиента. В SSH тип ed25519 стал рекомендуемым по умолчанию во многих системах: публичный ключ занимает всего около сотни символов, а генерация и проверка подписи выполняются практически мгновенно. Совместимость стоит проверить на самых старых серверах, к которым вы подключаетесь.