門限 ECDSA——更安全、更私密的多重簽名

買賣虛擬貨幣
 Keep 開發者 Piotr Dyraga 在 2018 年舊金山區塊鏈週上關於門限 ECDSA 的演講2018年10月9日,在舊金山區塊鏈周的 Epicenter 會議上,Keep 的 Piotr Dyraga 就門限橢圓曲線數字簽名演算法(t- ECDSA)進行了演講。   

去年夏天,Piotr 和他的程式碼合作伙伴 Jakub Nowakowski 為Keep實現了一個原型門限 ECDSA 協議(並在比特幣測試網上建立了一筆門限 ECDSA 簽名的交易!),Piotr 上臺展示了該技術解鎖的一些可能性,以及有關其如何在底層運作的一些技術細節。

首先,我們將討論多重簽名(multi-signatures)——它們是什麼,它們在比特幣中的運作方式,以及它們在以太坊中的運作方式。然後,我們將討論門限簽名(threshold signatures)及其與多重簽名相比的優缺點。最後——事情會變得有些瘋狂——我們將探討一些密碼學的東西,並討論門限 ECDSA 協議——類似於 Keep 中的實現方式。  

在繼續進行之前,請允許我告訴你一些有關 Keep 的資訊,因為這將有助於更好地理解為什麼我們開始有關門限簽名的工作。如果僅用一句話來描述 Keep,我會說Keep是公鏈的隱私層。 

在過去的幾年中,公鏈為我們帶來了令人難以置信的透明性和可審計性(auditability),以及抗審查和不可篡改的記錄。但是,競爭利益可以輕鬆訪問釋出到區塊鏈的任何智慧合約。結果,當公司考慮在區塊鏈上構建應用時,隱私是出現的主要問題之一。Keep 是公鏈和隱私之間的橋樑,允許合約利用區塊鏈技術的全部功能而不會損害安全性。我們也可以說,Keep 是一種私人計算機,能夠儲存和處理甚至隱藏在自身之外的資料。  

讓我們從多重簽名開始。“多重簽名”通常是指需要多把金鑰來簽署交易,並且通常被用於劃分責任。

1-2 多重簽名的一個很好的例子,是夫妻的小額現金聯名賬戶,其中任何一方的簽名都足以執行交易。

2-2 多重簽名的一個例子,是夫妻雙方的儲蓄帳戶,需要雙方同意才能執行交易。

2-3 多重簽名的一個例子,是父母對孩子的儲蓄帳戶。孩子可以在至少一位父母的同意下花錢,如果父母雙方都同意,錢可以完全從孩子那裡拿走。

在比特幣中,多重簽名透過建立一個多重簽名地址來運作,並且在建立多重簽名地址時,我們指定與該地址關聯的金鑰以及簽署交易需要多少把金鑰。然後,經過一段時間,我們建立了一個交易,有人用金鑰對其進行簽名,就是這樣!在此案例中,我們建立了具有三把關聯金鑰的多重簽名地址,並且至少需要兩把金鑰才能提供簽名。

這確實很酷,但也有一些限制。

首先,使用哪把金鑰來履行交易的資訊是公開的。對於某些企業來說,這可能是一種優點,但是對於其他一些需要更大匿名性的企業來說,則可能是一種缺點。另外,在可以使用多少把金鑰上也有一些限制。一旦建立了多重簽名地址,安全策略就固定下來了。因此,你不能在一段時間之後改變主意,說:“好吧,現在我要使用 2-3 的策略,而不是 5-6 的策略”,它需要建立一個有著新安全政策的新多重簽名地址,並把所有資金轉移過去。

它在以太坊中的運作方式有些不同,因為這裡沒有像多重簽名這樣的東西。總有一個地址來簽署一筆交易並花費 gas。但是,有一些多重簽名錢包,它們基本上是智慧合約,能夠儲存代幣並且要求發起的交易需要接受某些要求,包括特定的簽名配置。

最著名的幾個錢包是 BitGo 錢包、Gnosis 錢包和 Parity 錢包。而且,儘管它們是智慧合約(所以它們顯然要比比特幣交易具有更大的靈活性),它們也更難以實現。而且,一旦發生錯誤,錯誤的成本也確實很高。我想這裡的每個人都聽說過 Parity 被黑的故事。    

那麼,有沒有更好的方法?我認為答案是“是”。那就是門限簽名。

多重簽名機制依賴於擁有單獨而唯一的金鑰的各方,他們用這些金鑰來對一筆交易簽名,並且,簽名者一個接一個地提供其簽名。在(上方)這張圖片中,我們在左側有一組簽名者。每個簽名者都有自己的金鑰,他們用它來簽署一筆交易。當驗證者 Bob(在右側)想要驗證交易時,他需要分別檢查每個簽名。

對於門限簽名,情況有所不同,因為我們只有一把公鑰,一把金鑰和一個簽名。在上圖中,左側有一組簽名者。每個簽名者都有相同的公鑰和私鑰的一個唯一部分。簽名者使用一種特殊的通訊協議進行協作,該協議不會為了生成簽名而暴露金鑰,並且只會生成一個簽名。現在,驗證者只需檢查一個簽名即可確定交易是否正確。

那麼,什麼門限簽名可以給我們帶來什麼呢?首先,我們避免了基於合約的多重簽名。使用門限簽名,我們可以讓多方簽署以太坊交易,而無需將我們的代幣鎖定在智慧合約錢包中。我認為這對以太坊來說是一個巨大的勝利。其次,門限簽名在鏈上是無法區分的。

這是我們在比特幣測試網路上執行的具有 20 個簽名者的門限交易示例。你會注意到,這筆交易與只有一個簽名者的標準比特幣交易之間沒有區別。這提供了更大的匿名性,因為有關哪些部分被用於簽署交易(即誰簽署了交易)的資訊不會被公開洩漏。

同樣,就驗證而言,門限簽名比多重簽名交易便宜。多重簽名需要為每個簽名者建立一個新的簽名,並且成本隨著簽名者數量的增加而增加。對於門限簽名,只有一個簽名,因此在驗證方面成本是固定的。

門限簽名還提供了更好的靈活性。首先,簽名者的數量不限。其次,可以在一段時間後修改安全策略。它是一種單點故障演算法,但是你仍然可以改變主意,說:“好吧,我要 3-6 而不是 7-10。” 

但是總會有陷阱存在。第一個陷阱是,儘管門限簽名並不是什麼新鮮事物,但大多數人仍不熟悉它們。這意味著要花一些時間來接受這項技術。而且,工具還不存在。對於多重簽名,我們有一堆工具,比如有良好 UI 支援的硬體錢包。在門限簽名這裡沒有這些東西,至少現在還沒有。另一個問題是簽名者需要保持線上。對於多重簽名,你可以提供你的簽名,然後下線去度假,同時,其他人過來提供另一個簽名,交易就會被接受。對於門限簽名,簽名者需要合作(至少達到最低數量)才能產生簽名。 

我希望這一切對你來說都令人興奮!現在是時候討論它實際上如何運作了。但首先,我們需要回顧一些模型和定義。它們是“加法同態加密(additively homomorphic encryption)”,“門限加密(threshold encryption)”和“承諾方案(commitment scheme)”。

首先,是加法同態加密。同態加法加密有一個很好的功能,可以對密文進行運算。加法同態加密方案的一個示例是 Pailier,對於該方案,存在一個可有效計算的運算“加”,因此加法運算(在幻燈片上帶有 e 分指數)可將兩個密文加在一起。

因此,如果我們有兩個值 a 和 b。我們可以首先加密這兩個值,然後用這一特殊運算將這兩個密文加在一起。或者,我們可以首先有這兩個值,然後將它們加在一起,然後對結果進行加密。當我們解密時,在兩種情況下我們將獲得完全相同的值。   

接下來是(t,n)門限加密。解釋它的最簡單方法,是說我們有 n 個參與者;每個人都有相同的公鑰,但每個人也都有私鑰的獨特部分。因此,在這張幻燈片上,我們有 secret_share 1,secret_share 2,secret_share 3 … secret_share n 和簽名者——如果你有一條用公鑰加密的訊息,則簽名者必須使用一種特殊通訊協議進行合作,這種協議不會為了解密而暴露金鑰。

例如,假設 Alice 和 Caroline 正在玩擲硬幣遊戲。Alice 選擇硬幣的一面,評估對其選擇的承諾,並將承諾傳送給 Caroline 。現在, Caroline 將硬幣扔向空中,說出結果會是什麼。接下來,Alice 傳送一個特殊的值,稱為解除承諾金鑰(decommitment key),它使得 Caroline 可以評估承諾並檢視 Alice 最初選的值是否真的如她現在所說。 

解除承諾金鑰可以驗證承諾,但它還有一個很棒的功能,即允許定義無條件的隱藏方案。因此,無論 Caroline 做什麼,無論她具有多麼高的算力,如果沒有解除承諾金鑰,她都無法猜測 Alice 承諾的值。她不能僅憑承諾就做到這一點。

現在該討論協議了。我們的實現基於紐約城市學院和普林斯頓大學的 Rosario Gennaro、Steven Goldfeder 和 Arvind Narayanan 的工作,他們描述了門限最佳 DSA/ECDSA 簽名及其在比特幣錢包安全中的應用(https://link.springer.com/chapter/10.1007/978-3-319-39555-5_9)。我們對該協議做了一些小的修改,但是現在沒有時間討論它。並且,協議由兩個部分組成:金鑰生成協議和簽名協議。我們將首先討論金鑰生成。     

我們現在就要討論密碼學了。假設我們有 n 位簽名者,每位簽名者都用加法同態門限加密方案進行了初始化,並且這種情況發生在設定階段:  

現在,我們將跳過它是怎樣完成的,並在最後回過頭來進行簡要的討論。

這可能會造成混淆,因為我們有兩種型別的金鑰。一種是門限加法同態加密方案金鑰(threshold additively homomorphic encryption scheme key),這些金鑰在設定階段已初始化,另一種是我們用於簽名的 門限-ECDSA 金鑰(t-ECDSA key)。這第二種金鑰就是我們現在要生成的。對於加法同態門限加密方案,我們僅假設它是在設定階段完成的。   

在第一步裡,每位參與者選擇一個隨機整數 x,它將被用於該參與者的私鑰部分: 

x 不能大於 q 。q 是橢圓曲線的基數,因此它是橢圓曲線有的點數。在所有的幻燈片裡,q 都代表橢圓曲線的基數。每個參與者將 y 計算為 g 的 x 次冪。這是一種橢圓曲線運算,基本上,我們將曲線的生成點乘以 x 。這是你經常在組裡用到的一種表示法,但是由於橢圓曲線是一個組,因此我們也可以在這裡使用它。            

然後,每個參與者計算對此值的承諾,並在第 2 輪中,將該承諾釋出給組裡的所有參與者:

接下來,在第三步中,每個參與者都揭示加密形式的 x,在幻燈片上為 α :    

加密是透過我們在設定階段初始化的加法同態加密方案完成的。此外,每個參與者都揭示公鑰部分、解除授權金鑰,以及表明所有這些值合在一起正確的零知識證明。這不僅可以驗證承諾,還可以讓所有參與者檢視他們剛剛一起展示的所有部分是否正確。

這樣,零知識證明說的是,存在一個數字 x ,於是曲線的生成點的 x 次方等於 y ,並且 y 是公開的,因為它剛剛被揭示,並且如果我們解密剛剛釋出的值 α ——這是加密的金鑰——我們將獲得該數字 x 。          

當然,這是一個零知識證明,所以我們不可能猜出 x 是多少,但我們在這裡說的是,它位於(-q³, q³)的區間內,由於 q 是橢圓曲線的基數,這個範圍確實很大。     

在第四步中,所有簽名者都使用加法同態門限方案的加法運算來生成最終的 t-ECDSA 金鑰,因此可以將 x 的所有加密部分相加:   

作為結果,我們得到了加密形式的金鑰,y 的所有顯露出來的公共部分可以被相加,並且,作為結果,我們得到了公鑰。這裡的加法運算只是橢圓曲線點的加法,因此很簡單。  

第二部分是簽名——讓我們看一下簽名演算法。

我們有了 α,它是所有簽名者之間共享的加密形式的 t-ECDSA 私鑰,而且我們有了 y ,它是 t-ECDSA 公鑰;它只是橢圓曲線上的一個點。   

在第一輪中,各方都挑一個隨機整數 ρ :

使用加法同態門限加密方案對該值進行加密: 

並將 ECDSA 金鑰(幻燈片上的α)乘以該隨機值: 

我們能這樣做,因為有了加法同態加密方案的加法運算,我們也可以進行乘法。每個簽名者都發布對這些值的承諾,並在第二輪中揭示所有這些值以及零知識證明,指出它們是正確的:

在本演示中,我們跳過了零知識證明的構造。

因此,在第二回合之後,參與者使用同態加密方案定義的加法運算,將揭示出的各個部分合並在一起。

第 3 輪和第 4 輪使用相同的承諾-揭示模式:

在右側,我們具有到目前為止評估的所有引數,並且所有參與者都具有相同的值。  

在第三輪中,每一方挑選一個隨機整數 kᵢ: 

和隨機整數 cᵢ: 

q 始終代表橢圓曲線的基數,也就是橢圓曲線上的點數。 

各方把 rᵢ 計算為 g 的 k 次方——我們基本上用它來乘以曲線生成點:    

各方計算引數 w ,它是 k 乘以 ρ 加上 c 乘以 q            

q 一直是橢圓曲線的基數,由於我們使用加法同態門限加密,因此我們可以對其進行計算。 

最後,各方承諾所有這些引數,並在第 4 輪中揭示生成的引數,以及說明它們在一起正確的零知識證明:

現在,我們跳過零知識證明。

有了所有小組成員的所有引數之後,我們可以將它們加在一起,就像在第 2 輪之後一樣。我們把所有 k 部分,所有 c 部分,所有 w 部分相加。更重要的是,我們把引數 r 評估為所有 rᵢ 部分的總和,我們使用了一種特殊的雜湊函式:     

實際上,這是我們從標準 ECDSA 協議中知道的函式:它是x 點座標模除(modulo,譯註:一個數除以另一個數的餘數)橢圓曲線的階數;這是來自標準 ECDSA 協議的內容。  

在第 4 輪之後,右側的所有引數將由組裡的所有簽名者共享。現在我們需要玩一些離散數學的把戲來產生一個簽名。使用到目前為止我們評估過的所有這些引數,由於我們運算的是加密的資料,因此簽名也會是加密的。但這是我們將在最後的第 6 輪中處理的事情。 

我們要做的第一件事是執行門限解密機制,以便使所有參與者都解密引數 w 並把該值賦給 η:   

接下來,我們計算一個叫 Ψ 的引數,它是 η 的模 q 乘法逆元,並且 q 一直是橢圓曲線的基數:

然後,有了 m,即我們正在簽名的訊息的雜湊值(或這筆交易的雜湊值),我們開始使用以下公式評估簽名: 

c 是我們剛剛評估過的值,而 u ,r 和 v 是所有簽名者在前幾輪中共同評估的引數。   

因此,由於 u 是一個加密的 ρ ,並且 v 是一個加密的 ρ 乘以 ECDSA 金鑰,因此我們可以執行以下轉換:   

如果我們把 Ψ 替換為它所代表的值,我們會得到下面的公式:  

最後,如果消掉 ρ ,我們得到: 

我想你們大多數人都知道該方程的含義——這是標準 ECDSA 簽名的方程,其中 k 是加密安全的隨機整數,m (譯註:原文此處寫成了 n,應該是筆誤)是訊息雜湊,x 是我們的 ECDSA 金鑰,而 r 是曲線生成點的 k 次方(譯註:原文此處多寫了一個模 q,應該是筆誤)。因此,這是一個標準 ECDSA 協議的方程。

所有這些方程都是在密文上完成的,因此最後我們的簽名也被加密了:

我們需要處理它,這是在第 6 輪中完成的,在這一輪裡所有參與者都執行門限解密機制以瞭解 s 的值。解密值 s 和在第4輪中評估的引數 r 共同構成簽名:     

我知道第一次見到它顯然不容易理解。我的意圖不是要讓你對協議有一個全面的瞭解,而是要透過所有步驟瞭解你如何在後臺進行工作。

因此,有兩個注意事項。

實際上,這是關於被問到的問題的——簽名協議的單點故障是不可接受的。在金鑰生成這裡是容易的,因為我們可以檢測到一方是否有行為不當。我們有零知識證明和承諾。如果一方在金鑰生成協議期間行為不當,我們可以刪除結果,然後將行為不當的一方替換為其他人,然後重啟協議。在簽名這裡就不那麼容易了,因為即使一方行為不當,我們也應該能夠產生簽名。只要我們有 t 加 1,其中 t 是誠實的門限參與者——這是我們在生成加法同態門限加密方案時設定的引數——我們仍然可以生成一個簽名。因此,我們需要一些最低限度的誠實參與者,然後就一切都好了。    

另一個重要的注意事項是這些金鑰是如何生成的。我們這裡通常有兩種可能的方法——有一個受信任的經辦人設定,其中一方會生成那些金鑰並將其交付給組中的所有其他參與者,而受信任的經辦人應該忘記所有這些金鑰,擦除記憶體。第二種可能性是我們執行某種無經辦人協議,以便由所有組員一起執行金鑰。還有明天史蒂夫可能還會提出第三種方法(http://stevengoldfeder.com/papers/GG18.pdf)。這兩篇論文(編者注:https://link.springer.com/chapter/10.1007/978-3-642-17955-6_4和https://link.springer.com/article/10.1007/s10207-010-0119-9)顯示了該設定的可能演算法。     

那麼,它真的有效嗎?是的,我們已經簽名了許多以太坊和比特幣交易。但重要的是要了解該解決方案確實是通用的,因此我們可以在此處使用任何橢圓曲線。

因此,不管你是一個錢包公司或提供機構託管解決方案,還是你只是想保護自己的個人錢包,你都可以受益於 t-ECDSA,尤其是在不支援多重簽名的鏈上。因此,例如,作為一個加密貨幣交易所,你可以把以太坊金鑰儲存在多個伺服器上,甚至可以將某些部分儲存線上下,因此這應該降低了遭受攻擊的可能性。  

免責聲明:

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

推荐阅读

;