Введение

Криптографический алгоритм для цифровых подписей

В криптографии алгоритм цифровой подписи на эллиптических кривых (ECDSA) является вариантом алгоритма цифровой подписи (DSA), использующим криптографию на эллиптических кривых.

Размер ключа и подписи

Как и в случае с криптографией на эллиптических кривых в целом, размер частного ключа ECDSA, который считается необходимым для обеспечения безопасности, примерно вдвое превышает уровень безопасности в битах. Например, при уровне безопасности 80 бит – то есть, для нахождения частного ключа злоумышленнику потребуется максимум около 2^80 операций – размер частного ключа ECDSA составит 160 бит. С другой стороны, размер подписи одинаков для DSA и ECDSA: примерно *n* бит, где *n* – показатель степени в формуле *q = 2^n*, то есть около 320 бит при уровне безопасности 80 бит, что эквивалентно 2^80 операциям.

Безопасность

В декабре 2010 года группа, называющая себя fail0verflow, объявила об извлечении закрытого ключа ECDSA, используемого Sony для подписи программного обеспечения для игровой консоли PlayStation 3. Однако эта атака сработала лишь из-за некорректной реализации алгоритма Sony, поскольку параметр *k* был статичным, а не случайным. Как указано в разделе, посвященном алгоритму генерации подписей, это делает параметр *k* вычислимым, сводя на нет эффективность всего алгоритма. 29 марта 2011 года два исследователя опубликовали статью в IACR, демонстрирующую возможность извлечения закрытого ключа TLS сервера, использующего OpenSSL для аутентификации с помощью Elliptic Curves DSA над двоичным полем, посредством атаки по времени. Уязвимость была устранена в OpenSSL 1.0.0e. В августе 2013 года стало известно, что ошибки в некоторых реализациях класса Java SecureRandom иногда приводили к коллизиям в значении *k*. Это позволило злоумышленникам восстановить закрытые ключи, предоставив им такой же контроль над транзакциями Bitcoin, как и законным владельцам ключей, используя тот же эксплойт, который был использован для раскрытия ключа подписи PS3 в некоторых реализациях Android-приложений, использующих Java и полагающихся на ECDSA для аутентификации транзакций. Эту проблему можно предотвратить, используя детерминированный способ генерации *k*, как описано в RFC 6979.