bên trong định nghĩa tiêu chuẩn của ECDSA, nonce $k$ phải là một số nguyên ngẫu nhiên thống nhất bí mật trong phạm vi $[1,n)$, ở đâu $n$ là thứ tự chính của máy phát điện. Phân tích các cặp tin nhắn/chữ ký khi $k$ đã biết hoặc có một khiếm khuyết (chẳng hạn như sai lệch hoặc xu hướng lặp lại) có thể làm rò rỉ khóa riêng tư, do đó tạo ra $k$ quan trọng đối với an ninh.
Việc triển khai tạo chữ ký ECDSA không thể kiểm tra một cách có ý nghĩa rằng giá trị của một đầu vào $k$ nó nhận được là phù hợp để sử dụng an toàn theo quy định bên trong định nghĩa tiêu chuẩn của chữ ký ECDSA, bởi vì không có cách nào để biết từ một giá trị liệu nó có bí mật hay không, đó là phẩm chất thiết yếu nhất $k$ nên sở hữu. Cũng không thể đánh giá nếu một $k$ là ngẫu nhiên như câu hỏi gợi ý, ít nhất là trừ khi chúng ta biết nó được sản xuất như thế nào. Và dù sao đi nữa, trong bối cảnh, ngẫu nhiên là thứ yếu so với bí mật.
Vì vậy, thay vì chấp nhận $k$ như một đầu vào, quy trình phổ biến là tạo ra một ngẫu nhiên $k$ một phần của việc thực hiện tạo chữ ký ECDSA. Một quy trình cơ bản (nếu không nhất thiết phải khuyến nghị) là vẽ $\lceil\log_2(n)\rceil$ bit từ một RNG mã hóa mạnh được giả định (chẳng hạn như /dev/urandom
) và diễn giải các bit này dưới dạng số nguyên $k$ mỗi ví dụ quy ước big-endian, cho đến khi nó giữ nguyên $0<k<n$ (mà đối với nhiều người $n$ được sử dụng trong thực tế về cơ bản là luôn luôn, bởi vì $n$ chỉ dưới lũy thừa hai). Tôi bỏ qua thủ tục cơ bản này trong phần còn lại của câu trả lời (mặc dù điều này bình luận gợi ý rằng đó là cốt lõi của câu hỏi).
Có thể sửa đổi quy trình tạo chữ ký ECDSA để sử dụng an toàn bất kỳ $k$ nó nhận được. Thay vì $k$, việc tạo chữ ký có thể sử dụng $k':=f(d_U,H,k)$ ở đâu $d_U$ là khóa riêng, $H$ là hàm băm của tin nhắn cần ký và $f$ là một hàm phái sinh khóa công khai bằng cách sử dụng $d_U$ làm khóa chính, với đầu ra gần như thống nhất trong $[1,n)$ ở đâu $n$ là thứ tự của máy phát điện. Thực tiễn như vậy không phá vỡ khả năng tương thích theo bất kỳ cách nào và chỉ có thể phát hiện được với cả hai $k$ và khóa riêng (trên đầu trang của thông tin công khai khác). Vì $n$ ít nhất lên đến 384-bit, một chức năng phù hợp sẽ là $$k':=1+(\operatorname{HMAC-SHA-512}(d_U,H\mathbin\|k)\bmod(n-1))$$
Lưu ý: về lý thuyết thủ tục ký có một số lần "return to Step 1" sẽ gọi lại $f$ và mong đợi một sự khác biệt $k'$, và sẽ không nhận được điều đó.Tuy nhiên, đó là tranh luận, vì khả năng gọi lại $f$ là hoàn toàn không đáng kể và không thể kiểm tra được ngay cả khi có kiểm soát $d_U$, $H$ và $k$, đối với cố định thích hợp không ác tính $f$. Tuy nhiên, nếu khả năng đó ngăn không cho con dấu cao su đập vào giấy, chúng ta có thể sử dụng $k'=f(d_U,H\oplus j,k)$ ở đâu $j$ là số lần gọi trước đó của $f$ trong chữ ký.
Lưu ý: khi nào và nếu không có nhược điểm nào trong việc tạo chữ ký xác định, chúng ta có thể bỏ qua đầu vào $k$. Khi xem xét một số (nhưng không phải tất cả) các cuộc tấn công kênh bên thậm chí có thể an toàn hơn, đặc biệt là chống lại các cuộc tấn công của các đối thủ biết và kiểm soát $k$.