交易簽名的隨機數 R 是如何產生的?
我想知道導致 R 值的簽名中使用的隨機數?x座標 R = G(k) 它是如何創建的?它有特定的字元長度嗎?是否使用了特定的隨機生成器或限制參數?我在網上看到 Python 程式碼,發現它被限制為最大欄位點數:FFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
但由於它是十六進制格式,我不知道這是什麼意思。那麼要使用的最大數字是多少,因為它將作為整數處理?
隨機數
k
應該是 1 到 115792089237316195423570985008687907852837564279074904382605163141518161494336 範圍內的一個不可預測的數字,包括 - 曲線上的每個點,除了無窮大的點(注意:不是欄位的大小,這是非常曲線上)。一種方法是在該範圍內選擇一個統一的隨機數。這可行,但使您的安全性關鍵取決於擁有一個好的隨機數生成器。這在理論上是一個簡單的問題,但在實踐中確實會出現很多問題。值得注意的例子是 Playstation 3 程式碼設計系統(它使用固定常量作為 nonce),或者Android中的一個錯誤,在某些情況下導致應用程序生成相同的“隨機”數字序列。
今天最常見(也是推薦)的方式是使用RFC 6979。它本質上規定在簽名時根本不使用隨機性,而是使用(特定)散列函式計算隨機數,該散列函式將消息和私鑰作為輸入。在合理的假設下,這對於攻擊者(他們不知道私鑰)來說就像使用實際隨機性一樣不可預測,但避免了訪問良好 RNG 的工程挑戰。
一個警告:不可預測性是一個非常廣泛的概念,並且有很多陷阱。實際攻擊是針對從更小範圍內選取的隨機數,或針對以某種相關方式選取的隨機數。不要試圖對此“聰明”。
k 是一個隨機數(nonce)。R 是將 k 與 G(生成點)相乘時得到的點的 x 座標。因此,R 是一個介於 1 和 N 之間的數字,其中 N 是您發布的數字(115792089237316195423570985008687907852837564279074904382605163141518161494337 十進制)