EC (эллиптические кривые) – выбор

Выбираем эллиптические кривые

300300

Около 15 лет в IT-системах, связанных с безопасной передачей данных по недоверенным каналам, начали широко использоваться, помимо классических криптографических алгоритмов RSA и DH, сопоставимые с ними по функционалу, но более быстрые и, предположительно, не менее надёжные криптографические алгоритмы семейства EC или ECC – “elliptic curve” или “elliptic curve cryptography” – “на базе эллиптических кривых”.

Вопросы по функциональности этих алгоритмов и реальной стойкости мы рассмотрим отдельно, пока же сосредоточимся на вопросе “Наши системы поддерживают EC-криптографию; как же выбрать нужные настройки?”.

Список поддерживаемых EC

В случае *nix-систем, для распространённой библиотеки OpenSSL команда для вывода ASN1-имён всех поддерживаемых ECC-кривых будет такой:

openssl ecparam -list_curves

Хотелось бы сразу заметить, что при выполнении команды надо учитывать, что это вывод именно для “системной” библиотеки OpenSSL; в случае, например, использования web-сервера nginx, который собирается с конкретной версией данной библиотеки, список ECC, поддерживаемых именно данным ПО, может отличаться – впрочем, это нетрудно побороть, пересобрав тот же nginx с нужной версией библиотеки.

Для Windows-систем ситуация проще – начиная с NT 6.0 (Vista / 2008) поддерживаются кривые с ASN1-именами Nist256, Nist384 и Nist521, а начиная с NT 6.4 (который CloudOS, который NT 10, и в общем-то Windows 10 / Windows Server 2016 в более привычной номенклатуре), можно запросить вывод списка поддерживаемых ECC вот такой вот командой:

certutil -DisplayEccCurve

Фактически поддерживаемые системой ECC-кривые будут задаваться в реестре, список этот будет применяться глобально (на всю систему) и только после перезагрузки (см. статью про SSL/TLS в Windows Server, в которой всё это расписано более подробно).

Как же выбрать подходящий вариант?

Выбираем безопасные ECC

Вообще, сама безопасность криптографических операций с эллиптическими кривыми – что для обмена ключевой информацией (ECDHE), что для подписи (ECDSA) – тема достаточно обширная; но будем всё ж исходить из того, что вы уже решили их использовать и просто выбираете “какие именно”.

Хорошим ресурсом для получения информации будет, например, safecurves.cr.yp.to – там проводится анализ большинства популярных эллиптических кривых по двум классам проблем – ECDLP (т.е. фундаментальным проблемам, связанным с самим алгоритмом) и проблемам реализации данных ECC-алгоритмов. Картинка с результатами на данный момент выглядит примерно так:

Достаточно интересным выглядит то, что используемые в Windows уже десяток лет Nist256 и Nist384 не проходят ряд тестов и считаются небезопасными. При том, что популярные ресурсы – например, cipherli.st – предлагают Nist384 как лучший вариант, чем “простой Nist256“.

Поэтому остановимся на простом варианте – список поддерживаемых вашим сервером ECC-кривых должен содержать:

  1. Curve25519 – как безопасную и быструю;
  2. Nist P-521 – как входящую в комплект NIST’овских “стандартных” и не имеющую известных на данный момент проблем с безопасностью;
  3. Ну и после уже дополнительные и экзотичные варианты по вкусу – только избегая предположительно проблемных типа brainpoolP384t1;

Для Windows настройки ECC приведены в уже упоминавшейся выше статье про SSL/TLS в Windows Server; для приводимого в пример nginx это будет выглядеть простой командой:

ssl_ecdh_curve X25519:secp521r1;

Для другого ПО – действуйте по аналогии.

В общем всё. Удачного применения!






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