в стандартное определение ECDSA, одноразовый номер $к$ должно быть секретным равномерно случайным целым числом в диапазоне $[1,n)$, куда $n$ является простым порядком генератора. Анализ пар сообщение/подпись при $к$ известен или имеет дефект (например, предвзятость или склонность к повторению) может привести к утечке закрытого ключа, что приведет к генерированию $к$ имеет значение для безопасности.
Реализация генерации подписи ECDSA не может осмысленно проверить, что значение вход $к$ он получает подходит для безопасного использования как предписано в стандартное определение подписи ECDSA, потому что невозможно сказать по значению, является ли оно секретным или нет, что является наиболее важным качеством $к$ должен обладать. Также невозможно оценить, является ли данное $к$ является случайным, как предполагает вопрос, по крайней мере, если мы не знаем, как он был произведен. И в любом случае, в контексте случайность вторична по отношению к тайне.
Поэтому вместо принятия $к$ в качестве входных данных, общая процедура состоит в том, чтобы сделать генерацию случайного $к$ часть реализации генерации подписи ECDSA. Основная (хотя и не обязательно рекомендуемая) процедура состоит в том, чтобы нарисовать $\lceil\log_2(n)\rceil$ биты из предполагаемого криптографически стойкого ГСЧ (например, /dev/urandom
) и интерпретировать эти биты как целое число $к$ напр. соглашение с обратным порядком байтов, пока оно не будет выполнено $0<k<n$ (что для многих $n$ используется на практике по существу всегда, т.к. $n$ чуть меньше степени двойки). Я игнорирую эту основную процедуру в остальной части ответа (хотя это комментарий предполагает, что это была суть вопроса).
Можно изменить процедуру генерации подписи ECDSA, чтобы безопасно использовать любые $к$ он получает. Вместо $к$, генерация подписи может использовать $k':=f(d_U,H,k)$ куда $d_U$ закрытый ключ, $Ч$ это хэш сообщения для подписи, и $f$ представляет собой функцию получения открытого ключа, использующую $d_U$ как мастер-ключ, с выходом, близким к равномерному в $[1,n)$ куда $n$ это порядок генератора. Такая практика никоим образом не нарушает совместимость и обнаруживается только с обоими $к$ и закрытый ключ (поверх другой общедоступной информации). За $n$ по крайней мере до 384-бит, подходящей функцией будет $$k':=1+(\operatorname{HMAC-SHA-512}(d_U,H\mathbin\|k)\bmod(n-1))$$
Примечание: теоретически процедура подписания имеет ряд «возвратов к шагу 1», которые повторно вызывают $f$ и ожидать другого $к'$, и не получит этого.Однако это спорно, так как вероятность повторного вызова $ф$ совершенно пренебрежимо мал и не поддается проверке даже при контроле $d_U$, $Ч$ и $к$, для правильной фиксированной незлокачественной $ф$. Если эта возможность, тем не менее, предотвращает попадание резинового штампа на бумагу, мы могли бы использовать $k'=f(d_U,H\oplus j,k)$ куда $j$ количество предыдущих вызовов $ф$ в подписи.
Примечание: если нет недостатка в том, чтобы сделать подпись детерминированной, мы можем игнорировать входные данные. $к$. При рассмотрении некоторых (но далеко не всех) атак по побочным каналам, которые могут быть даже безопаснее, в частности, против атак злоумышленников, которые знают и контролируют $к$.