MuSig簽名方案可替代當(dāng)前比特幣的ECDSA簽名算法
在2018年,區(qū)塊鏈協(xié)議公司Blockstream的密碼學(xué)家Gregory Maxwell、Pieter Wuille等人提出了一種名為MuSig的Schnorr簽名方案,理論上可替代當(dāng)前比特幣的ECDSA簽名算法,而在今日,Blockstream已經(jīng)把MuSig從一篇學(xué)術(shù)論文,轉(zhuǎn)變成了可用的代碼,并進(jìn)行了開源。
對(duì)此,來(lái)自Blockstream的數(shù)學(xué)家Andrew Poelstra向社區(qū)分享了這一技術(shù)的進(jìn)展,以下為其分享內(nèi)容的譯文:
當(dāng)前,比特幣和其他區(qū)塊鏈普遍采用的是ECDSA簽名驗(yàn)證算法。這顯然是中本聰在2008年根據(jù)當(dāng)時(shí)廣泛使用和未授權(quán)的數(shù)字簽名系統(tǒng)所做出的技術(shù)決定。然而,ECDSA簽名存在一些嚴(yán)重的技術(shù)限制。特別是,多重簽名和門限簽名(由獨(dú)立當(dāng)事方的法定人數(shù)而非一人簽署)很難與ECDSA一起生成。ECDSA簽名具有復(fù)雜的代數(shù)結(jié)構(gòu),使其不靈活且難以使用,迫使開發(fā)人員在跨鏈原子交換或閃電網(wǎng)絡(luò)等應(yīng)用中使用比特幣腳本,而這可通過(guò)更靈活的簽名方案,更緊湊、更私密地實(shí)現(xiàn)這些應(yīng)用。
在2018年,區(qū)塊鏈協(xié)議公司Blockstream的密碼學(xué)家Gregory Maxwell、Pieter Wuille等人提出了一種名為MuSig的Schnorr簽名方案,理論上可替代當(dāng)前比特幣的ECDSA簽名算法,這種多重簽名方案提供了可證明的安全性,甚至可防止惡意簽名者的合謀子集,并生成與普通單簽名者Schnorr簽名不可區(qū)分的簽名(提高隱私性)。
經(jīng)過(guò)近1年的發(fā)展,Blockstream已經(jīng)把MuSig從一篇學(xué)術(shù)論文,轉(zhuǎn)變成了可用的代碼,本周,其開發(fā)人員會(huì)把代碼合并到secp256k1-zkp(secp256k1的一個(gè)fork),此外,Blockstream還把保密交易(CT)技術(shù)擴(kuò)展到其Elements和Liquid側(cè)鏈產(chǎn)品。
需要注意的是,目前比特幣core代碼庫(kù)依然使用的是secp256k1,因此目前MuSig并沒(méi)有被應(yīng)用到比特幣,但這也是Blockstream所期待的目標(biāo)。
而假設(shè)比特幣啟用這一簽名方案,將使得閃電網(wǎng)絡(luò)可在無(wú)腳本腳本(scriptless script)中應(yīng)用。
MuSig簽名方案的優(yōu)勢(shì)
根據(jù)Blockstream官方發(fā)布的說(shuō)明,應(yīng)用MuSig簽名方案將重點(diǎn)會(huì)有以下兩大優(yōu)勢(shì):
1. 無(wú)論簽名者設(shè)置如何,驗(yàn)證者都會(huì)看到相同的短的、常量大小的簽名。在區(qū)塊鏈系統(tǒng)中,驗(yàn)證效率是最重要的考慮因素,用簽名者細(xì)節(jié)來(lái)給驗(yàn)證者增加負(fù)擔(dān),是不合理的,除非是安全需要,否則是無(wú)必要的。此外,MuSig簽名方案能夠提高隱私性,因?yàn)樗鼈冸[藏了確切的簽名者策略。
2. 為普通公鑰模型提供可證安全性。這意味著簽名者可完全靈活地使用普通的密鑰對(duì)進(jìn)行多重簽名,而不需要提供任何關(guān)于這些密鑰產(chǎn)生或控制的特定方式的額外信息。有關(guān)密鑰生成的信息,可能很難在比特幣的環(huán)境中提供,因?yàn)楦鱾€(gè)簽名者具有不同的和限制性的密鑰管理策略。此外,對(duì)密鑰生成細(xì)節(jié)的依賴性,可能會(huì)與Taproot(一種提議的比特幣擴(kuò)展方案)產(chǎn)生不良的交互作用,其中公共簽名密鑰可能會(huì)有額外的隱形語(yǔ)義。
誤區(qū)和安全API開發(fā)
與所有多重簽名協(xié)議的數(shù)學(xué)描述一樣,發(fā)布后的MuSig,假定參與者在整個(gè)簽名過(guò)程中都可訪問(wèn)內(nèi)存,而簽名過(guò)程是持久的、易于更新的,并且攻擊者不能“重置”到以前的狀態(tài)。它還假設(shè)簽名者可訪問(wèn)隨機(jī)性來(lái)源,這些來(lái)源與uniform不可區(qū)分。不幸的是,現(xiàn)實(shí)世界并沒(méi)有那么簡(jiǎn)單,Blockstream花了大量的精力設(shè)計(jì)了一個(gè)API,它可以在各種各樣的場(chǎng)景中使用,而不存在因未聲明的假設(shè)而導(dǎo)致密鑰丟失的可能。
就像Schnorr簽名或者ECDSA,MuSig簽名方案在其結(jié)構(gòu)中使用了一個(gè)秘密的“nonce”,其必須統(tǒng)一隨機(jī)生成。任何偏離統(tǒng)一標(biāo)準(zhǔn)的行為,即使只是一點(diǎn)點(diǎn),也可能導(dǎo)致密鑰丟失和資金被盜。
Blockstream的主要設(shè)計(jì)目標(biāo),是創(chuàng)建一個(gè)安全的防誤用API,即使是在受限的環(huán)境中,也不會(huì)鼓勵(lì)危險(xiǎn)的使用模式。
Uniform隨機(jī)性
對(duì)于單個(gè)簽名,實(shí)現(xiàn)統(tǒng)一隨機(jī)nonce的標(biāo)準(zhǔn)方法很簡(jiǎn)單:取一些機(jī)密數(shù)據(jù)和要簽名的消息,通過(guò)加密哈希函數(shù)傳遞這些數(shù)據(jù),得到一個(gè)統(tǒng)一隨機(jī)值,該值對(duì)于每個(gè)要簽名的消息而言都是獨(dú)立的。
然而,有了多重簽名,這個(gè)簡(jiǎn)單而健壯的解決方案就成了一種負(fù)擔(dān)。惡意簽名者可能會(huì)在同一條消息上請(qǐng)求兩個(gè)多重簽名,從而在第二次迭代中調(diào)整自己對(duì)簽名的貢獻(xiàn)。如果第一個(gè)簽名者通過(guò)在消息旁邊哈希一個(gè)秘密來(lái)選擇他的nonce,那么他最終將在兩個(gè)非常不同的簽名中使用相同的nonce(本質(zhì)上是導(dǎo)致PS3被黑客攻擊的相同失敗模式。)不幸的是,與單個(gè)簽名者的情況不同,沒(méi)有簡(jiǎn)單的解決方案,因?yàn)閱蝹€(gè)簽名者必須在知道要生成的簽名的所有細(xì)節(jié)之前選擇它們的nonce。
解決這個(gè)問(wèn)題的一個(gè)傳統(tǒng)方法,是使用硬件隨機(jī)數(shù)生成器,這種方法在散列法( hashing)流行之前就已被使用了。不幸的是,這類方案都是昂貴的,會(huì)受到環(huán)境偏見(jiàn)或其他外部影響,最重要的是,我們沒(méi)有辦法驗(yàn)證它們是否正確運(yùn)行。
關(guān)于驗(yàn)證這一點(diǎn),有一些創(chuàng)造性的解決方案,Blockstream將在以后的文章中探討。目前,其選擇是要求API用戶為每個(gè)簽名會(huì)話提供唯一的“會(huì)話ID”。nonce是通過(guò)哈希簽名者的秘密、簽名者集、要簽名的消息,以及這一會(huì)話的唯一輸入而產(chǎn)生的。可訪問(wèn)隨機(jī)數(shù)生成器的用戶,可以使用它來(lái)生成會(huì)話ID,而可問(wèn)持久內(nèi)存的用戶,只需使用計(jì)數(shù)器即可。
目前開發(fā)人員期望能很快生產(chǎn)出一個(gè)真正強(qiáng)大的解決方案。
關(guān)于重放攻擊(Replay Attack)
即使有一個(gè)可靠的隨機(jī)性來(lái)源,仍有可能從多重簽名的參與者那里提取私鑰(如果在整個(gè)過(guò)程中,可能從一個(gè)點(diǎn)重放簽名協(xié)議的話),這種類型的攻擊被稱為“重放攻擊”,可針對(duì)在可重啟的虛擬機(jī)內(nèi)運(yùn)行的簽名者,以及支持間斷簽名及從可序列化狀態(tài)恢復(fù)的虛擬機(jī)發(fā)動(dòng)攻擊。它甚至可能在沒(méi)有活動(dòng)攻擊者的情況下意外發(fā)生,例如運(yùn)行從同一狀態(tài)克隆的兩個(gè)虛擬機(jī),或者在不同步的分布式數(shù)據(jù)庫(kù)上執(zhí)行代碼。
具體來(lái)說(shuō),如果一個(gè)簽名者貢獻(xiàn)了一個(gè)多重簽名,并且簽名過(guò)程在選擇了他的nonce之后的某一點(diǎn),通過(guò)重啟的方式,則可修改其他簽名者對(duì)簽名的貢獻(xiàn)。
這些類型的攻擊不會(huì)以單個(gè)簽名出現(xiàn),因?yàn)樗鼈兪窃谝粋€(gè)步驟中生成的,沒(méi)有中間狀態(tài)可從中重新啟動(dòng)。這些額外的挑戰(zhàn),對(duì)于多輪加密協(xié)議來(lái)說(shuō)是獨(dú)一無(wú)二的。
如果不去研究新的機(jī)制,目前的MuSig簽名方案就無(wú)法保護(hù)在虛擬機(jī)中進(jìn)行簽名的用戶。同樣,這一限制在Blockstream的開發(fā)者看來(lái)是可消除的,目前他們正在積極研究解決方案。
結(jié)論,以及未來(lái)的工作
所有上述討論都隱含著這樣一個(gè)觀點(diǎn):即相比單方協(xié)議,多方協(xié)議會(huì)面臨新的、實(shí)質(zhì)上更困難的挑戰(zhàn)。就數(shù)學(xué)復(fù)雜性而言,MuSig要比Bulletproofs(防彈證明)要簡(jiǎn)單得多。但在實(shí)現(xiàn)復(fù)雜性方面,MuSig已經(jīng)付出了更多的努力,并且需要在抗脆性和API靈活性之間進(jìn)行更多的權(quán)衡。
這篇文章只描述了多重簽名部分,在未來(lái)的文章中,開發(fā)者還將描述門限簽名,這是一個(gè)相關(guān)的概念,其中n個(gè)簽名者的任何子集,只要數(shù)量足夠,就能夠生成簽名,而不需要整個(gè)簽名組的貢獻(xiàn)。
在以后的文章中,我們還將討論一些使非隨機(jī)性更安全和更可驗(yàn)證的技術(shù)。特別是,通過(guò)使用一種稱為簽訂合約(sign-to-contract)的技術(shù),主機(jī)可以從不可信的硬件錢包的隨機(jī)數(shù)生成器中消除任何偏差的可能性。
更進(jìn)一步的是,通過(guò)利用零知識(shí)證明的能力,應(yīng)該可消除偏隨機(jī)性(biased randomness)和重放攻擊所帶來(lái)的風(fēng)險(xiǎn),消除對(duì)持久內(nèi)存的需求,并將MuSig協(xié)議從3輪通信減少到2輪。
讀者可查看MuSig在Github上的代碼(https://github.com/ElementsProject/secp256k1-zkp/tree/secp256k1-zkp/src/modules/musig),并對(duì)其發(fā)布評(píng)論或提出改進(jìn)。