Signature

比特幣中基於 RFC6979 的確定性 ECDSA 問題

  • February 25, 2015

在橢圓曲線中生成隨機數k至關重要,在比特幣的任何交易簽名中,k都需要隨機數來計算一個點k*G。如果這k不是隨機選擇的,它會立即洩露私鑰。因此,他們提出了在RFC6979

中描述的確定性生成 ECDSA 的想法。基本上,它們將私鑰與散列消息連接起來,並使用 HMAC 函式並生成偽隨機數。 這種方法看起來簡單易行。k

  • 它會引入任何成本嗎?
  • 如果是,這個成本可以忽略不計嗎?

或者通常這種方法是否存在任何低效或問題,為什麼我們仍然看到 ECDSA 的非確定性實施?

沒有任何嚴重的效率問題。對於任何特定的客戶,簽名都很少進行(通常每筆交易只有幾個簽名)。雖然簽名可能需要稍長的時間才能產生k價值,但它不會引起注意,尤其是考慮到任何一個特定客戶使用它的頻率有多低。驗證所有簽名是比特幣區塊驗證的 CPU 瓶頸,因為所有全節點都必須驗證網路上所有交易的簽名,而無論k參數如何選擇,這都需要相同的時間。

Gregory Maxwell 在這裡對確定性k值的使用發表了評論:

大多數反對去隨機化 DSA 的主要論點是 FIPS 一致性(與我們無關)和對使用(較少)審查的加密結構的風險的合理擔憂。隨著對去隨機化 DSA 的廣泛運動,後一種擔憂不再是一個問題。

Pieter Wuille的新libsecp256k1庫實際上使用確定性生成k.

另請注意,使用此構造的主要好處之一是您不必擔心您的 PRNG 的弱點在簽名過程中被利用。k例如,用相同的值對不同的數據進行簽名會立即洩露您的私鑰。如果 PRNG 足夠弱,無法確定k簽署同一條數據時使用的不同值之間的關係,也可以利用類似的攻擊。由於k是從您正在簽名的數據(和私鑰)確定性地生成的,因此對 PRNG 的這些擔憂不再相關,因為您將始終為同一條數據生成相同的簽名。這也使得編寫 ECDSA 單元測試更容易。

引用自:https://bitcoin.stackexchange.com/questions/36127