MuSig : 比特幣可用的Schnorr簽名方案

買賣虛擬貨幣
在2018年,區塊鏈協議公司Blockstream的密碼學家Gregory Maxwell、Pieter Wuille等人提出了一種名為MuSig的Schnorr簽名方案,理論上可替代當前比特幣的ECDSA簽名演算法,而在今日,Blockstream已經把MuSig從一篇學術論文,轉變成了可用的程式碼,並進行了開源。

對此,來自Blockstream的數學家Andrew Poelstra向社羣分享了這一技術的進展,以下為其分享內容的譯文:

當前,比特幣和其他區塊鏈普遍採用的是ECDSA簽名驗證演算法。這顯然是中本聰在2008年根據當時廣泛使用和未授權的數字簽名系統所做出的技術決定。然而,ECDSA簽名存在一些嚴重的技術限制。特別是,多重簽名和門限簽名(由獨立當事方的法定人數而非一人簽署)很難與ECDSA一起生成。ECDSA簽名具有複雜的代數結構,使其不靈活且難以使用,迫使開發人員在跨鏈原子交換或閃電網路等應用中使用比特幣指令碼,而這可透過更靈活的簽名方案,更緊湊、更私密地實現這些應用。

在2018年,區塊鏈協議公司Blockstream的密碼學家Gregory Maxwell、Pieter Wuille等人提出了一種名為MuSig的Schnorr簽名方案,理論上可替代當前比特幣的ECDSA簽名演算法,這種多重簽名方案提供了可證明的安全性,甚至可防止惡意簽名者的合謀子集,並生成與普通單簽名者Schnorr簽名不可區分的簽名(提高隱私性)。

經過近1年的發展,Blockstream已經把MuSig從一篇學術論文,轉變成了可用的程式碼,本週,其開發人員會把程式碼合併到secp256k1-zkp(secp256k1的一個fork),此外,Blockstream還把保密交易(CT)技術擴充套件到其Elements和Liquid側鏈產品。

需要注意的是,目前比特幣core程式碼庫依然使用的是secp256k1,因此目前MuSig並沒有被應用到比特幣,但這也是Blockstream所期待的目標。

而假設比特幣啟用這一簽名方案,將使得閃電網路可在無指令碼指令碼(scriptless script)中應用。

MuSig簽名方案的優勢

根據Blockstream官方釋出的說明,應用MuSig簽名方案將重點會有以下兩大優勢:

1. 無論簽名者設定如何,驗證者都會看到相同的短的、常量大小的簽名。在區塊鏈系統中,驗證效率是最重要的考慮因素,用簽名者細節來給驗證者增加負擔,是不合理的,除非是安全需要,否則是無必要的。此外,MuSig簽名方案能夠提高隱私性,因為它們隱藏了確切的簽名者策略。

2. 為普通公鑰模型提供可證安全性。這意味著簽名者可完全靈活地使用普通的金鑰對進行多重簽名,而不需要提供任何關於這些金鑰產生或控制的特定方式的額外資訊。有關金鑰生成的資訊,可能很難在比特幣的環境中提供,因為各個簽名者具有不同的和限制性的金鑰管理策略。此外,對金鑰生成細節的依賴性,可能會與Taproot(一種提議的比特幣擴充套件方案)產生不良的互動作用,其中公共簽名金鑰可能會有額外的隱形語義。

誤區和安全API開發

與所有多重簽名協議的數學描述一樣,釋出後的MuSig,假定參與者在整個簽名過程中都可訪問記憶體,而簽名過程是持久的、易於更新的,並且攻擊者不能“重置”到以前的狀態。它還假設簽名者可訪問隨機性來源,這些來源與uniform不可區分。不幸的是,現實世界並沒有那麼簡單,Blockstream花了大量的精力設計了一個API,它可以在各種各樣的場景中使用,而不存在因未宣告的假設而導致金鑰丟失的可能。

就像Schnorr簽名或者ECDSA,MuSig簽名方案在其結構中使用了一個秘密的“nonce”,其必須統一隨機生成。任何偏離統一標準的行為,即使只是一點點,也可能導致金鑰丟失和資金被盜。

Blockstream的主要設計目標,是建立一個安全的防誤用API,即使是在受限的環境中,也不會鼓勵危險的使用模式。

Uniform隨機性

對於單個簽名,實現統一隨機nonce的標準方法很簡單:取一些機密資料和要簽名的訊息,透過加密雜湊函式傳遞這些資料,得到一個統一隨機值,該值對於每個要簽名的訊息而言都是獨立的。

然而,有了多重簽名,這個簡單而健壯的解決方案就成了一種負擔。惡意簽名者可能會在同一條訊息上請求兩個多重簽名,從而在第二次迭代中調整自己對簽名的貢獻。如果第一個簽名者透過在訊息旁邊雜湊一個秘密來選擇他的nonce,那麼他最終將在兩個非常不同的簽名中使用相同的nonce(本質上是導致PS3被駭客攻擊的相同失敗模式。)不幸的是,與單個簽名者的情況不同,沒有簡單的解決方案,因為單個簽名者必須在知道要生成的簽名的所有細節之前選擇它們的nonce。

解決這個問題的一個傳統方法,是使用硬體隨機數生成器,這種方法在雜湊法( hashing)流行之前就已被使用了。不幸的是,這類方案都是昂貴的,會受到環境偏見或其他外部影響,最重要的是,我們沒有辦法驗證它們是否正確執行。

關於驗證這一點,有一些創造性的解決方案,Blockstream將在以後的文章中探討。目前,其選擇是要求API使用者為每個簽名會話提供唯一的“會話ID”。nonce是透過雜湊簽名者的秘密、簽名者集、要簽名的訊息,以及這一會話的唯一輸入而產生的。可訪問隨機數生成器的使用者,可以使用它來生成會話ID,而可問持久記憶體的使用者,只需使用計數器即可。

目前開發人員期望能很快生產出一個真正強大的解決方案。

關於重放攻擊(Replay Attack)

即使有一個可靠的隨機性來源,仍有可能從多重簽名的參與者那裡提取私鑰(如果在整個過程中,可能從一個點重放簽名協議的話),這種型別的攻擊被稱為“重放攻擊”,可針對在可重啟的虛擬機器內執行的簽名者,以及支援間斷簽名及從可序列化狀態恢復的虛擬機器發動攻擊。它甚至可能在沒有活動攻擊者的情況下意外發生,例如執行從同一狀態克隆的兩個虛擬機器,或者在不同步的分散式資料庫上執行程式碼。

具體來說,如果一個簽名者貢獻了一個多重簽名,並且簽名過程在選擇了他的nonce之後的某一點,透過重啟的方式,則可修改其他簽名者對簽名的貢獻。

這些型別的攻擊不會以單個簽名出現,因為它們是在一個步驟中生成的,沒有中間狀態可從中重新啟動。這些額外的挑戰,對於多輪加密協議來說是獨一無二的。

如果不去研究新的機制,目前的MuSig簽名方案就無法保護在虛擬機器中進行簽名的使用者。同樣,這一限制在Blockstream的開發者看來是可消除的,目前他們正在積極研究解決方案。

結論,以及未來的工作

所有上述討論都隱含著這樣一個觀點:即相比單方協議,多方協議會面臨新的、實質上更困難的挑戰。就數學複雜性而言,MuSig要比Bulletproofs(防彈證明)要簡單得多。但在實現複雜性方面,MuSig已經付出了更多的努力,並且需要在抗脆性和API靈活性之間進行更多的權衡。

這篇文章只描述了多重簽名部分,在未來的文章中,開發者還將描述門限簽名,這是一個相關的概念,其中n個簽名者的任何子集,只要數量足夠,就能夠生成簽名,而不需要整個簽名組的貢獻。

在以後的文章中,我們還將討論一些使非隨機性更安全和更可驗證的技術。特別是,透過使用一種稱為簽訂合約(sign-to-contract)的技術,主機可以從不可信的硬體錢包的隨機數生成器中消除任何偏差的可能性。

更進一步的是,透過利用零知識證明的能力,應該可消除偏隨機性(biased randomness)和重放攻擊所帶來的風險,消除對持久記憶體的需求,並將MuSig協議從3輪通訊減少到2輪。

讀者可檢視MuSig在Github上的程式碼(https://github.com/ElementsProject/secp256k1-zkp/tree/secp256k1-zkp/src/modules/musig),並對其釋出評論或提出改進。

更多數字貨幣資訊:www.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;