為什麼簽名時nonce不相關很重要?
我知道,如果隨機數(通常在簽名算法中表示為 k)與使用相同的公鑰進行相關簽名,這會揭示有關私鑰的資訊。我想更好地理解為什麼會這樣。
我將在這裡使用 Schnorr 方程(
s = k + H(R||P||m)*d
用於 signature(R,s)
、 pubkeyP = d*G
、 messagem
),但一切都同樣適用於 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。但是,如果你使用 nonces
k1
並且k2
wherek1
是隨機的,但是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 函式
另一方面,我們知道一些被主動破壞的方式:
- 彼此之間具有已知線性關係的隨機數(如上所示)
- 從小範圍數字中提取的隨機數。
但在這兩者之間,存在著巨大的技術差距,這些技術既不被破壞,也不被證明是安全的。他們中的許多人可能很安全,但我們不知道。所以不幸的是,這意味著“需要什麼屬性”這個問題實際上沒有答案;我們所知道的只是一些有效的技術。