Tôi đang phát triển một cách để tạo khóa riêng một cách xác định cho các đường cong elip tùy ý dựa trên một số thông tin đầu vào của người dùng (ví não). Hiện tại, tôi đang sử dụng thuật toán băm mật khẩu Scrypt với các tham số độ khó mạnh mẽ để băm một số tham số đầu vào thành một khóa.
Đầu ra của Scrypt phải được phân phối đồng đều giữa các $[0, 2^{b})$ ở đâu ${b}$ là số bit đầu ra được sử dụng từ đầu ra thuật toán Scrypt. Nhưng các khóa riêng của đường cong elip hợp lệ phải nhỏ hơn thứ tự trường hữu hạn của đường cong $N$, phân bổ đều cho $[0, N)$. Do đó, sử dụng đầu ra của Scrypt trực tiếp làm mod khóa riêng $N$ sẽ tạo ra một sai lệch nhỏ trong các khóa kết quả được tạo - tin xấu, vì vậy tôi cần tránh điều đó.
Thông thường, nếu bạn đang tạo khóa riêng bằng RNG an toàn, bạn chỉ cần thử lại RNG cho đến khi bạn nhận được một số nhỏ hơn $N$và bạn có thể sử dụng nó làm khóa riêng một cách an toàn.
Có cách nào an toàn để lặp lại một cách xác định đầu ra của Scrypt, sao cho chúng tôi duy trì phân phối giả ngẫu nhiên của đầu ra của Scrypt mà không phải chạy lại Scrypt với các tham số mới không?
Một cách mà tôi cân nhắc là băm đầu ra của scrypt bằng SHA256 hoặc SHA512 cho đến khi nó nhỏ hơn $N$, nhưng điều này sẽ không hoạt động tốt đối với các đường cong lớn hơn 512 bit, chẳng hạn như P521.
Một giải pháp kém thanh lịch khác là chỉ cần từ chối bất kỳ tham số đầu vào nào tạo ra khóa lớn hơn $N$. Nó rất hiếm khi xảy ra, vì vậy có lẽ tôi có thể thoát khỏi nó? Có bất kỳ đường cong phổ biến nào ngoài đó có thứ tự $N$ không phải là một phần đáng kể của sức mạnh cao nhất tiếp theo của nó là hai?