Перейти к содержимому
ecdsa.com

RFC 6979 (детерминированный ECDSA)

Спецификация Томаса Порнина (2013), которая выводит nonce k для DSA или ECDSA из закрытого ключа и хеша сообщения с помощью HMAC-DRBG, так что для подписи не нужен генератор случайных чисел.
Другие написанияRFC 6979deterministic ECDSAdeterministic DSA

Процедура (§ 3.2) берёт в качестве начального значения для HMAC закрытый ключ и хеш, приведённый по модулю порядка группы (int2octets(x) ‖ bits2octets(h1)), выполняет шаги обновления HMAC-DRBG и перебирает кандидатов, пока один из них не попадёт в диапазон 1…q−1. Один и тот же ключ с одним и тем же сообщением всегда даёт одинаковый k, а значит, и байт в байт одинаковую подпись. Проверяющие стороны разницы не видят: на выходе получается обычная подпись ECDSA или DSA.

FIPS 186-5 одобряет этот метод под названием «детерминированный ECDSA» (§ 6.3.2, приложение A.3.3). Он устраняет сбой из-за плохого ГСЧ, который стоял за утечкой ключа PlayStation 3 и многими утечками ключей кошельков, и делает тестовые векторы воспроизводимыми: в приложении A.2 к RFC 6979 есть векторы для DSA, P-кривых NIST, а также K- и B-кривых.

Плата за это — подверженность атакам с внесением сбоев и атакам по побочным каналам: если дважды подписать одно и то же сообщение, вызвав при этом сбой, ключ может утечь, поэтому варианты с подмешанной случайностью (hedged) добавляют в то же вычисление дополнительные случайные данные (§ 3.6 допускает дополнительные данные). Переключатели в библиотеках: OpenSSL 3.2 и новее — -pkeyopt nonce-type:1; Python cryptography — ec.ECDSA(hashes.SHA256(), deterministic_signing=True); @noble/curves по умолчанию подписывает детерминированно и предлагает параметр extraEntropy для подмешивания случайности.

Стандарты и ссылки

Все термины