Я разрабатываю способ детерминированной генерации закрытых ключей для произвольных эллиптических кривых на основе некоторого пользовательского ввода (мозгового кошелька). В настоящее время я использую алгоритм хеширования паролей Scrypt с надежными параметрами сложности, чтобы хэшировать ряд входных параметров в ключ.
Вывод Scrypt должен быть равномерно распределен между $[0, 2^{б})$ куда ${б}$ - это количество выходных битов, используемых на выходе алгоритма Scrypt. Но действительные закрытые ключи эллиптической кривой должны быть меньше конечного порядка полей кривой. $N$, распределяется равномерно среди $[0, N)$. Таким образом, использование вывода Scrypt напрямую в качестве мода приватного ключа $N$ создаст небольшое смещение в результирующих ключах, которые генерируются - плохие новости, поэтому мне нужно избегать этого.
Обычно, если вы генерировали закрытые ключи с использованием защищенного ГСЧ, вы просто повторяли ГСЧ, пока не получили число меньше $N$, и вы можете смело использовать его как закрытый ключ.
Существует ли безопасный способ детерминированной итерации вывода Scrypt, чтобы сохранить псевдослучайное распределение вывода Scrypt без повторного запуска Scrypt с новыми параметрами?
Одним из способов, который я рассматривал, было хэширование вывода scrypt с помощью SHA256 или SHA512 до тех пор, пока оно не станет меньше $N$, но это не будет работать так хорошо для кривых размером более 512 бит, таких как P521.
Другое менее элегантное решение состоит в том, чтобы просто отклонить любые входные параметры, которые дают ключ больше, чем $N$. Это должно происходить очень редко, так что, возможно, мне это сойдет с рук? Существуют ли какие-либо общие кривые, порядок которых $N$ не является значительной долей его следующей по величине степени двойки?