Signature

為什麼簽名時nonce不相關很重要?

  • November 18, 2021

我知道,如果隨機數(通常在簽名算法中表示為 k)與使用相同的公鑰進行相關簽名,這會揭示有關私鑰的資訊。我想更好地理解為什麼會這樣。

我將在這裡使用 Schnorr 方程(s = k + H(R||P||m)*d用於 signature (R,s)、 pubkey P = d*G、 message m),但一切都同樣適用於 ECDSA(使用s = (H(m) + R.x*d) / k),甚至適用於兩者之間的混合。所有方程都是模數n,即群階。

相同的隨機數

想像一下,在兩條不同的消息上,您有兩個具有相同私鑰和相同nonce 的簽名。這意味著你有:

  • s1 = k + H(R||P||m1)*d
  • s2 = k + H(R||P||m2)*d

將這兩個方程相互減去得到:

  • s2 - s1 = (H(R||P||m2) - H(R||P||m1))*d

這可以解決d

  • d = (s2 - s1) / (H(R||P||m2) - H(R||P||m1)

具有已知偏移量的隨機數

因此,我們知道您不應該對多個簽名使用相同的 nonce。但是,如果你使用 noncesk1並且k2wherek1是隨機的,但是k2 = k1 + f,對於攻擊者已知的 offset怎麼辦f

現在你得到:

  • s1 = k1 + H(R||P||m1)*d
  • s2 = k2 + H(R||P||m2)*d = k1 + f + H(R||P||m2)*d

再次減法給我們:

  • s2 - s1 = f + (H(R||P||m2) - H(R||P||m1)*d

換一種說法:

  • d = (s2 - s1 - f) / (H(R||P||m2) - H(R||P||m1)

具有已知因子的隨機數

好的,所以攻擊者無法知道這兩個隨機數之間的區別。如果他們只知道他們之間的一個因素怎麼辦?k2 = k1*u.

  • s1 = k1 + H(R||P||m1)*d
  • s2 = k2 + H(R||P||m2)*d = k1*u + H(R||P||m2)*d

計算s2 - u*s1現在給出:

  • s2 - u*s1 = H(R||P||m2)*d - H(R||P||m1)*d*u

因此:

  • d = (s2 - u*s1) / (H(R||P||m2) - H(R||P||m1)*u)

所以,這也是一個問題。

隨機數之間的任意已知關係

如果 nonce 之間的關係比形式的線性關係更複雜k2 = u*k1 + f,通常不會有一個簡單的公式可以讓您輕鬆地從簽名中計算出私鑰。但是,缺少已知公式並不意味著不存在,也不構成安全證明。

我們關心的問題是,在什麼情況下,隨機數之間的關係足夠複雜,攻擊者無法利用它。事實證明,有幾種方法可以證明:

  • 所有隨機數都是均勻隨機生成的
  • 隨機數被計算為 PRF(偽隨機函式)的輸出;這大致對應於 RFC6979 所做的(使用簽名者密鑰為 PRF 播種)。
  • MuSig-DN 的確定性 nonce 函式

另一方面,我們知道一些被主動破壞的方式:

  • 彼此之間具有已知線性關係的隨機數(如上所示)
  • 從小範圍數字中提取的隨機數。

但在這兩者之間,存在著巨大的技術差距,這些技術既不被破壞,也不被證明是安全的。他們中的許多人可能很安全,但我們不知道。所以不幸的是,這意味著“需要什麼屬性”這個問題實際上沒有答案;我們所知道的只是一些有效的技術。

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