天天看點

Schnorr 簽名算法與聚合簽名

20世紀80年代,德國密碼學家 Claus-Peter Schnorr 給出了答案。以他命名的 Schnorr 簽名算法可以建構更高效和隐私性更強的區塊鍊系統,一直備受區塊鍊開發者們的關注。 2018 年 7 月,比特币開發者 Pieter Wuille 撰寫了 bip-schnorr[2] 提出了将 bitcoin 的簽名算法更改為 schnorr 方案。Schnorr 與 ECDSA 雖然同為使用 secp236k1[3] 曲線的橢圓曲線加密算法,但相比 Schnorr 來說,ECDSA 有一些不足之處:

證明安全性:在随機預言模型中很容易證明 Schnorr 簽名的安全性,而 ECDSA 不存在這樣的證明。

不可延展性:ECDSA 簽名具有可塑性,不知曉私鑰的第三方可以将給定公鑰和消息的現有有效簽名更改為對同一私鑰和消息的另一個有效簽名,這一問題直到 SegWit 激活後才得以修複。BIP62[4] 和 BIP66[5] 中讨論了此問題。而如果使用 Schnorr 簽名則可以避免類似的情況出現[6]。

線性:Schnorr 簽名是線性的,這一點非常重要。使用 Schnorr 簽名的各方可以生成對其各自密鑰的簽名聚合。以這一特性作為基礎,可以建構更高效和隐私性更強的區塊鍊系統。

schnorr 簽名算法相比 ECDSA 來講,對于上述的優點,除了尚未标準化之外幾乎沒有缺點。而且由于兩種算法都基于同一個橢圓曲線,整個關于簽名的更新成本也是很低的。

什麼是 Schnorr 簽名?

在密碼學中,Schnorr 簽名是由 Schnorr 簽名算法産生的數字簽名。它是一種數字簽名方案,以其簡單高效著稱,其安全性基于某些離散對數問題的難處理性。[7] Schnorr 的原理描述如下:

下面用小寫字母表示數字,比如:a = 42。同時我們将使用一些橢圓曲線(elliptic curve)上的點。這些點是一些滿足橢圓曲線方程的大數對。我們将用大寫字母來表示這些點,比如:A = (4, 68)。橢圓曲線上的點可進行一些代數運算。其上兩個點可以相加可以得到近似随機的第三個點,表示為:C = A + B。某個點可以與自身相加多次:D = C + C + C。當我們講一個點與自身相加多次時,我們稱其為“乘以一個數”:D = 3 C。顯而易見的,如果将一個點 A 與自身相加很多次(或者說将其乘以一個很大的數)然後得到一個點 B ,如果我們隻是知道原始點 A 和結果點 B ,計算出與 A 相乘的這個大數是相當困難的。這裡的“困難”意思是,如果要計算出這個“大數”,我們不能簡單的用 B 除以 A ,隻能不斷的猜測一個值 x ,計算是否 x A等于 B 。是以如果這個 x 的值非常大,甚至大于宇宙中所有原子數目的和,猜測這個 x 的值将花費一個難以接受的時間。同時如果某人持有正确的 x ,計算 x * A 是非常迅速的。這種非對稱性将作為我們讨論的前提。

Alice 持有私鑰 x ,然後選擇一個随機數 r ,以及橢圓曲線上的原點 G ,計算出R := r G,公鑰X := xG,使用哈希函數擷取一個随機的用于驗證的數字e := Hash(R, X, message),然後計算 s := e * x + r。

Alice 給 Bob 發送點 R, X, message ,和點數值 s ,Bob 驗證 s G 等于 R + e X 。事實上,不僅是 Bob,這個世界上的任何人都可以獨自對這一證明進行驗證。一旦s G = R + e X通過了驗證,既可以證明 Alice 持有私鑰 x,并生成了一個合法的簽名:(s, e)。

最終,如果要将簽名從這一證明中創造出來,Alice 需要定制一個哈希函數來對她簽名的消息的進行哈希計算。這樣的話需要确定針對一個消息所計算出的簽名,不能被複用給另外一個消息。

這個定制過程可以簡單的通過将 R , X 和簽名資訊進行哈希來做到:

e := Hash(R, X, Message)

一個良好的哈希函數,會在哪怕僅有一個字元有更改的情況下,也會傳回完全不同的哈希值,使得計算出 s 的值是不可能的任務

Schnorr 簽名協定的簡潔描述如下:

基于此,開發者在未來可以添加更複雜的概念,比如聚合簽名。聚合簽名優勢就在于将一筆交易中所有涉及的輸入隻需要一個合并簽名就可以完成,大大減少了資料處理量,使網絡速度更快,更加高效。

什麼是聚合簽名?

聚合簽名是使用 Schnorr 簽名的各方生成的對各自密鑰的簽名聚合,它可以把一筆多簽交易的各個參與方的公鑰和簽名合并為一個公鑰與簽名,整個合并過程是不可見的,無法從合并後的公鑰與簽名推導出合并前的資訊,并且在驗證時僅需一次驗證即可。目前 ,Mimblewimble 已利用 Schnorr 簽名算法實作簽名聚合。

在使用 ECDSA 進行多簽的情況下,如果共有 N 個私鑰進行了簽名,則驗證時需要對 N 個簽名各自進行驗證。由于 Schnorr 簽名算法的線形特性,在同樣的情況下,N 個私鑰的簽名可以「聚合」成為一個簽名,原理如下:

由于橢圓曲線上的點可以滿足乘法結合律,是以對于橢圓曲線上的兩個點 X,Y 和相應的标量(私鑰)x,y 以及原點 G,則:

Schnorr 簽名算法與聚合簽名

對于 ECDSA 簽名算法,驗證 n 個簽名,需要進行 n 次取模和 2 * n 次點乘運算。而對于 Schnorr 簽名,我們可以将驗證方程相加:

Schnorr 簽名算法與聚合簽名
Schnorr 簽名算法與聚合簽名

此時對 Schnorr 簽名算法生成的多簽進行驗證時,隻需要進行 2n 次加法運算和 n + 1 次點乘運算即可。由于加法運算所占用的資源是極低的,兩種多簽驗證方式的資源消耗可以近似的比較為:ECDSA 為一次取模加兩次點乘,Schnorr 為一次點乘的資源消耗。顯而易見的結論是,使用 Schnorr 簽名算法所消耗的資源更少。

對于上述多重簽名的情況,使用 Schnorr 簽名算法進行聚合簽名,可以提供如下額外的好處:

性能方面:可以大大減少驗證簽名的成本。Schonrr 簽名算法的優勢是顯而易見的,對于一筆多簽交易,原本需要進行多次的驗證,而聚合簽名僅需驗證一次,進而提升節點對于交易的驗證速度

交易體積:由于将多個簽名聚合為一個簽名,可以大大減少多重簽名的大小,并且可以顯著降低對于網絡傳輸消耗的帶寬,以及對于節點存儲空間的占用

隐私:使用 Schnorr 聚合簽名可以提高鍊上資料的隐私性。對于驗證者來講,聚合簽名看起來和普通的 Schnorr 簽名并無差別,無法分辨這一筆交易是普通的交易還是一筆多簽交易,而參與交易的使用者的公鑰和簽名都不會暴露出來

在建立一個基于 Schnorr 聚合簽名的多簽方案時,為保證多簽的簽名看起來像單密鑰簽名,并且使傳統的驗證方法有效并且保證整個過程隻需要線性次簽名聚合,該方案需要滿足如下的特性:

在普通的公鑰模型中被證明是安全的

滿足 Schnorr 方程,進而可以将得到的簽名寫成公鑰組合的函數

允許簽名者需要合作的互動式聚合簽名(IAS)

允許非互動式聚合簽名(NAS),其中聚合可以由任何人完成

允許每個簽名者簽署相同的消息

允許每個簽名者簽署自己的消息

基于 Schnorr 的聚合簽名方案目前有多種實作,最終 Blockstream 給出的方案是 MuSig,各個實作方式的差別以及 MuSig 的具體原理可以參照引用[8][9]。

聚合簽名的使用

7月10日,Qtum量子鍊基金會宣布實作QTUM-BEAM原子交換(Atomic Swap),原子交換(Atomic Swap)允許兩個獨立鍊上進行原子性的跨鍊交易。(連結:Qtum量子鍊實作QTUM-BEAM原子交換,支援隐私跨鍊交易|附實驗步驟詳解)

而通過聚合簽名,可以安全又簡單的實作原子交換。聚合簽名本質是一個簽名的偏移量,一旦與真實的簽名進行組合,即可計算出簽名所用的私鑰。聚合簽名的可信度可以進行驗證,同時又無需暴露任何資訊。聚合簽名可以保證原子交換的原子性,又可以保證交易雙方的安全。

通過聚合簽名進行一筆原子交換的簡潔過程如下[10]:

Alice 和 Bob 将加密貨币分别存入兩個各自簽名的位址之中

Alice 所用的私鑰會是一次性的,因為她需要将這個私鑰發送給 Bob

Alice 向 Bob 提供一個聚合簽名,這個簽名需要經過 Bob 的确認

當 Alice 廣播她的簽名來證明她持有的加密貨币時,Bob 可以獲得足夠的資訊計算出 Alice 的私鑰并獲得她持有的加密貨币

Bob 簽署一筆交易發送加密貨币給 Alice

Alice 使用另一半私鑰對接收加密貨币的交易進行簽名并将其廣播

Bob 獲知全部的私鑰并收到 Alice 持有的加密貨币,同時 Alice 也将獲得 Bob 的貨币

引入 Schnorr 和聚合簽名的影響

優勢:

節省資料:簽名聚合可在區塊鍊上提供資料壓縮

隐私:除交易結算外,關于無腳本智能合約的任何東西都不會記錄在區塊鍊上(簽名聚合過程發生在鍊下)

多重性:可在單個交易結算中在雙方之間轉移多種資産(跨鍊原子交換)

隐式可伸縮性:區塊鍊的可伸縮性是通過将多個交易壓縮到單個結算事務中實作的。隻有滿足所有先決條件後,交易才會被廣播

結合聚合簽名的 Scriptless script 相比标準智能合約具有更好的擴充性。因其合約執行是發生在鍊下的,通過将此執行結果推送給關心它的人,公共計算資源可以減輕存儲合約資料和執行條件的負擔。非公開的合約也可以提供更好的隐私性。合約的詳情隻有參與者可以知曉,對于其他人來說,該筆交易與普通的交易并沒有什麼差別

劣勢:

Maxwell 等人的工作指出[11],滿足密鑰聚合的 Schnorr 多重簽名的簡單實作并不是安全的。在普通的公鑰模型中,如使用 BN Schnorr 的簽名方案,需要通過放棄密鑰聚合的屬性來獲得安全性。他們提出了一個新的基于 Schnorr 的多簽模型,叫做 MuSig,以在普通的公鑰模型中可使用密鑰聚合,并具備應有的安全性。其與标準的 Schnorr 簽名具有相同的密鑰和簽名大小。對于單個「聚合」公鑰可以通過與标準 Schnorr 簽名相同的方式進行驗證(通過簽名者各自的公鑰進行計算得出證明)。

引用

https://en.wikipedia.org/wiki/EllipticCurveDigitalSignatureAlgorithm

https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki

http://www.secg.org/sec2-v2.pdf

https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki

https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki

送出公鑰的限制是其取消了公鑰恢複或根據短公鑰哈希驗證簽名的能力。這些結構通常與批量驗證不相容。

https://en.wikipedia.org/wiki/Schnorr_signature

https://blockstream.com/2018/01/23/musig-key-aggregation-schnorr-signatures.html

https://eprint.iacr.org/2018/068.pdf

https://download.wpsoftware.net/bitcoin/wizardry/mw-slides/2017-03-mit-bitcoin-expo/slides.pdf

繼續閱讀