加密貨幣中的“加密”:為什麼一切又怪又難

注:本文為技術公司Blockstream研究主管Andrew Poelstra在紐約MCC會議中發表的演講。他在演講中從密碼學講到了數字簽名的安全,指出簽名機制的設計從理論和實際應用情況來看是完全不同的,因此對於很多自稱能創造神奇效果的項目來說,用戶應該更多選擇保持警惕。同時,在他看來,比特幣的發展速度驚人,因此從技術角度來看,適當地放慢腳步並沒有錯。

加密貨幣中的“加密”:為什麼一切又怪又難

以下為演講全文:

我沒有準備PPT。我想要儘可能地讓這次演講不是那麼技術,我試圖剝奪自己在屏幕上寫下方程式的權力。我演講的主題是為什麼在加密貨幣中所有的一切都是奇怪和困難的。從數學和科學角度來看,什麼是密碼學?其在實踐中是如何運作的?

加密

從歷史上看,密碼學的用途是加密,就像試圖想出一些隨機的東西。這裡的安全性很簡單:如果你有一個密鑰,那麼你就可以解密一些東西,而使用一個安全模型或風險模型來描述它的想法實際上沒有意義。

在現代,密碼學已經取得了長足的進步,包括零知識證明。零知識證明是由計算機程序證明的,這些程序只對輸入進行狀態說明,而不洩露輸入的細節。

數字簽名和加密是相關的。簽名類似於對兩個密鑰的加密,一個公鑰和一個私鑰。任何擁有公鑰的人都可以加密數據,任何擁有解密密鑰或私鑰的人都可以解密數據。這也意味著經過加密的數據可以通過不安全的通道進行發送。

數字簽名

數字簽名正好相反——只有擁有私鑰的人才能生成簽名,只有擁有公鑰的人才能驗證簽名。如果你想討論這裡方案的安全性,那就更難做到,也更難做出定義。我要講的是學術背景下的數字簽名,然後我要講的是隨機數生成的實際問題,然後如果我有時間,我要講的是如何將其擴展到多重簽名設置。

沒有密鑰的人就不能偽造消息和公鑰的簽名。從學術上來說,將其形式化是相當困難的。這裡所說的形式化指的是做一個定義清晰的狀態說明。

多年之後,我們嘗試了很多次來找出這些定義——我們得出了這樣的結論:如果不存在任何多項式概率時間算法可以成為主導,那麼數字簽名方案就是安全的。我們將絕對排除任何算法存在的可能性(只要其界限合理),絕對不能偽造。即使這樣,在定義的時候,也很難證明其安全性。在現實生活中,有一個知道密鑰的人,這個人應該能夠生成簽名。所以你怎麼能明確排除一切但依然包含特殊情況?

假設在一場比賽中你有一個對手,你的對手無法贏得下面的比賽:我隨機取一個私鑰和一個公鑰,我把公鑰給了你的對手。如果他能生成一個簽名,那麼這個簽名就是偽造的,這個方案是不安全的。

直觀地來看,這是有道理的。你生成了一個隨機密鑰,對手沒有私鑰。對手唯一知道的關鍵只有公鑰。然而,這種想法是錯誤的。這個方案的問題在於,對手掌握了這個公鑰的大量簽名,而類似GPG的東西可能在區塊鏈上進行過電子郵件或者過往的比特幣交易簽名。這個公鑰包含了一堆簽名。現有的簽名方案對能夠看到公鑰的對手是安全的,但對看到簽名的對手是不安全的。這不應該是其運作方式,但現實仍然如此。這東西很難。有一種競爭幣就有這個問題。有許多人聲稱能解決不可能解決的問題。但大多數人都在對你撒謊,這才是這次演講的真正目的。

假設這個對手更強大,他可以向挑戰者索要信息,而挑戰者必須在這條信息上簽名。現在,對手不僅可以偽造信息,而且是在我們給出了幾乎所有可能給出的信息的情況下。我們想提供儘可能多的信息。因此,在任意消息上簽名就足夠了。當對手偽造信息時,他必須在一條新的信息上生成簽名。

這安全嗎?這在常規的安全概念下是安全的,又被稱為選擇信息攻擊下的存在性不可偽造性。但是在更復雜的系統中,由於一些原因,這是不安全的。我們在比特幣中發現,通過允許對手只在一條新消息上提供簽名,我們排除了對手可能使用現有的簽名並在保持其有效性的同時對其進行調整的可能性。模型中沒有捕捉到這一點。一旦某條消息簽名完成,誰在乎對手可以針對同一條消息產出不同的簽名?

在比特幣中,我們使用的ECDSA和txid都是基於這些簽名的。所以攻擊者有能力改變簽名,允許他們改變交易的txid,這將保持交易的有效性,但會使任何引用該txid的交易無效,因為txid是有延展性的。所以我們需要一個更強的模型。

我們現在需要一個對手,我們說,如果其在某個消息上提供簽名,消息可以是相同的,但簽名也必須是始終相同的。這就是所謂的“強簽名”。這是安全的嗎?不。

假設你有一個簽名方案——假設你正在使用Schnorr簽名,這些簽名特別容易受到攻擊,比如1989年的原始Schnorr算法……攻擊者獲取了你的一個簽名,他沒有對簽名進行調整,而是以一種保留消息有效性但更改公鑰的方式對簽名進行調整。他將獲取一個針對一個公鑰進行驗證的簽名,並生成一個與第一個公鑰相關的簽名。通過比特幣,某種程度上你可以生成與代數相關的密鑰,比如bip32分層確定性生成的密鑰。

理論上來說,有人可以生成一個簽名,其他人可以拿到這個簽名的交易,在另一個交易上創建一個簽名,這是針對不同密鑰的代數關係攻擊。

在實際情況中,這對比特幣來說不是一個問題,因為基於比特幣的設計,在比特幣交易中籤名的數據不僅包括有關交易的所有細節,還包括之前的交易(以及其公鑰)。所以結果就是你得到了一個看起來像Schnorr簽名的東西(除了公鑰)……但事實證明,這比“強簽名”更安全,這就是對簽名信息和同一簽名密鑰的零知識簽名。這比我想講的要複雜得多。

在每一個步驟中,我都在強化安全的概念,並徹底消除偽造的可能性。我們花了一些時間來探索這個設計,研究偽造行為以及其在實際情況中的表現。對於簽名,我能夠在舞臺上描述一個安全比賽,而不需要到處使用圖表和箭頭。多重簽名則更加複雜。

當你談論零知識證明——包含一個零知識證明和一個模擬器和所有不同的規則——試圖證明這些複雜系統的獨特性,部署更理想的模型等等,直到你得到一些具體的東西。然而,在現實生活中,擁有可證明的安全性具有巨大的價值。

可證明的安全性

接下來我想談談可證明安全的概念,儘管我告訴過你們這很難。其中一件事就是隨機數生成的概念。我將把話題從定義安全性切換到部署安全系統實操。

基於ECDSA或Schnorr,生成這些簽名需要生成一致隨機數據。一致隨機是指你可以選擇所有可能的隨機數——實際上是在0和某個固定的大素數之間。如果你沒能隨機生成數字,你在多個簽名中重複使用相同的數字或相同的nonce,那麼你的幣就會被盜。這種情況已經發生過幾次了,比如有人用這個小問題破解了ps3。2012年比特幣就發生了這種情況,一些安卓錢包重複使用了nonces,並且生成了一個糟糕的隨機數生成器。最終很多人的密鑰及幣都丟了。

並不是nonce被重用了。隨機的nonces是存在的,但是有一些軟件生成的nonces在某種程度上是有偏差的,比如前幾位始終是0。即使與隨機數無關,只要有足夠的簽名,也足以洩露你的私鑰。所以我們有這些在學術模型中被證明是安全的簽名方案,但他們總是需要一致的隨機性。直覺告訴我們隨機不能被猜出來,但這裡隨機和一致隨機沒有區別。把兩者區分開來就足以打破學術證明,而在實踐中,你會丟失密鑰和幣。

總結

這些東西是困難而微妙的,對於那些自稱能夠創造神奇事物的新項目,你不應該感到興奮,而是保持懷疑態度。比特幣的發展速度非常快。我們需要慢下來,保持警惕。

相關推薦

推薦中...