Security

關於 Schnorr sig 的幾個問題

  • October 3, 2018

在 Pieter Wuille 的 BIP 中,當該方案與 BIP32 的未硬化派生結合使用時,需要密鑰前綴版本的 Schnorr 簽名。有人可以提供一個例子來說明這種必要性嗎?我一個人也想不出來。

總是在 BIP 中,當進行批量驗證時,我們可以看到需要生成隨機數。再次,有人可以提供一個例子表明更簡單的版本是不安全的嗎?我發現原因是所謂的“取消攻擊”。我想弄清楚它是如何被利用的。

提前感謝您的回答!

沒有密鑰前綴的 schnorr 簽名是一個元組 {pubkey (P), message (m), R, s},其中等式 R == sG + H(R||m)P 成立。

現在,假設您有 pubkeys P 和 P2,它們的離散日誌與我所知的 c 不同,當我知道擴展的 pubkey (P2 == P + cG) 時,非硬化 BIP 32 就是這種情況。如果我知道消息 m 的公鑰 P 的簽名,我可以用它來偽造公鑰 P2 的 m 簽名:{P2, m, R, s - H(R||m)c} 因為如果你寫出P2 的關係,然後根據第一個簽名的關係來表達它,這就是你得到的。

對於批處理:我們有兩到 n 個形式為 R_n = s_nG + h_nP_n 的方程,我們可以通過首先將它們重寫為 0 = sum(s_n)G + sum(h_nP_n) - sum(R_n) 和然後使用有效的 multiexp 來計算大乘積和。例如,如果我們想讓 {P1, m1, R1, s1} 保持不變,我們可以將 {-P1, m1, R1, -s1} 添加到批處理中,這樣現在錯誤就會取消。

為了解決這個問題,驗證者應該通過將每個方程乘以攻擊者未知值來使方程去線性化,這使得它們無法以比機會更好的機率取消。這可以通過將其代入 multiexp 中的標量而在不影響效率的情況下完成。

舉一個更簡單的例子:考慮攻擊者知道所有有效簽名的批量驗證。攻擊者可以簡單地打亂批次中籤名之間的 s 值。如果沒有去線性化,批次顯然仍然會通過(因為天真的總和不關心 s 值的順序),但簽名都是無效的。

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