前言:
密碼學一直被冠以一層神祕的面紗,它深奧的原理一直讓人望而生畏,在區塊鏈技術中,密碼學又顯得尤為重要,所以,嘗試翻譯學習一下 “Zero Knowledge Proofs” 來加深對密碼學的進一步認識。
“零知識” 這個詞非常吸引人,我們假設零知識是“絕對安全”的代名詞,這導致了許多地方在濫用它。它被固定在各種各樣的東西上,比如加密系統和匿名網路,然而它們與真正的零知識協議毫無關係。
這一切都有助於強調一個觀點:零知識證明是密碼學家所設計的最強大的工具之一。但不幸的是,他們的理解也相對較差。接下來,我將嘗試給出一個(大部分)非數學描述 ZK 證明是什麼,以及是什麼使他們如此特別。
ZK 的起源:
“零知識”的概念最早是由麻省理工學院的研究人員Shafi Goldwasser,Silvio Micali和Charles Rackoff在20世紀80年代提出的。這些研究人員正在研究與互動式證明系統有關的問題,即第一方(稱為“證明者”)與第二方(“驗證者”)交換資訊的理論系統,以說服驗證者某些數學陳述是真實的。
在Goldwasser等人之前,這個領域的大部分工作集中在證明系統的正確性上。也就是說,它認為惡意的證明者試圖“欺騙”驗證者相信虛假陳述的情況(有點難理解) 。Goldwasser,Micali和Rackoff所做的就是把這個問題變成現實。他們不僅僅擔心證明者,而是問:如果驗證者是不可信的,你該怎麼辦?
他們提出的具體問題是資訊洩漏。具體地說,在證明過程中,驗證者要了解多少額外的資訊,就會超出了陳述是真實的事實?
注意,這不僅僅是理論上的興趣,這種理論已經有其實際的應用。
下面是一個例子:假設現實中的一個客戶希望使用密碼登入到Web伺服器。這個問題的標準在 “real world” 中涉及到在伺服器上儲存雜湊版本的密碼。因此,登入可以被看作是一種“證明”,即給定的密碼雜湊是某個密碼雜湊函式的輸出 - 更重要的是,客戶端實際上知道密碼。(不理解沒關係,接著往下看)
大多數真實的系統以相當差勁的方式實施這個“證明”。客戶端只需將原始密碼傳送到伺服器,重新計算密碼雜湊並將其與儲存的值進行比較。這裡的問題很明顯:在協議結束時,伺服器已經學習了我的明文密碼。因此,我們只能默默禱告伺服器不會癱瘓,呵呵。
Goldwasser,Micali和Rackoff提出的是進行這種證明新思路。慶幸的是,零知識證明就是用來證明上述問題,同時證明除了與“這個真實的”相對應的單個資訊外沒有任何資訊被洩漏(看完下面的講解再回過頭來理解)。
A ‘real world’ example:
到目前為止,這個討論非常抽象。為了使事情更加具體,讓我們繼續,給出一個 “真正的” 零知識協議(略微瘋狂)的例子。
就這個例子而言,我希望大家能想象我是一個新通訊網路的電信巨頭。我的網路結構如下圖所示。該圖中的每個頂點表示蜂一個無線電塔,連線線(邊緣)表示兩個單元重疊的位置,這意味著它們的傳輸可能相互干擾。
很明顯,這種重疊是有問題的,因為相鄰塔的訊號可能會擾亂我對訊號的接收。幸運的是,我的網路設計允許我將每個塔配置為三個不同頻段之一以避免這種干擾。
因此,要部署我的網路的挑戰是將頻帶分配給塔,使得沒有兩個重疊的無線電塔會共享相同的頻率。如果我們使用顏色來表示頻段,我們可以快速找出解決問題的辦法:
當然,繞了半天圈子,大家會發現,這是一個著名的理論,稱為 Graph three-coloring 問題。您可能也會知道,有趣的是對於某些圖形來說,找到一個解決方案或者確定一個解決方案是否存在都是相當困難的。事實上,Graph three-coloring - 具體來說,就是給定的圖形是否支援三種顏色解決方案的決策問題 - 在已知的複雜度等級 NP-complete 中。
毫無疑問,上面的例子so easy,用手都可以找到著色方案。OK,我們將思維發散。例如,假設我的蜂窩網路非常龐大而複雜,以至於我所掌握的計算能力還不足以找到解決方案。在這種情況下,我們能想到的途徑是將這種解決方法外包給具有這種龐大算力的公司。例如,google。
但是,這會導致一個問題。
假設Google使用大量的計算基礎設施來為我的圖搜尋有效的著色。在我知道他們能夠找到解決途徑之前,我肯定不會付錢給他們。但是,在當我付清之前,谷歌不會給我一個他們的解決方案的副本。我們將陷入僵局。
較為瘋狂的解決方案
Google的工程師與麻省理工學院的Silvio Micali進行了協商,他與Oded Goldreich和Avi Wigderson的同事進行了磋商,提出瞭如下的巧妙協議 - 一個如此優雅,甚至不需要任何計算機。它只需要一個大倉庫,大量的蠟筆和大量的紙張。哦,還有一大堆帽子。
它是如何工作的呢?
首先,我將進入倉庫,用紙覆蓋地板,並畫出我的網路拓撲圖的空白表示。然後,我將退出倉庫。google工程師現在進入,按照他們預先的解決方案,使用(紅色/藍色/紫色,如上例)三種顏色的集合,隨機的為我的空白圖進行著色。注意,使用哪種特定的蠟筆並不重要,只要著色是有效的。
在離開倉庫前,Google工程師用帽子蓋住每個頂點。當我回來的時候,我會看到:
很明顯,這種方法可以完美地保護Google的著色方案。但它對我來說是不利的。我可能會想,Google會用一個隨機的,無效的解決方案填充圖表。他們甚至可能根本沒有對圖表進行著色。
為了消除我的疑慮,Google現在給了我一個“挑戰”圖表著色解決方案的機會。我可以隨意選擇這張圖的一個“邊緣”(也就是兩個相鄰的帽子之間的一條線)。然後谷歌將“揭開”這兩個相應的帽子,展示他們解決方案的一小部分:
對我而言,這個實驗有兩個結果:
- 如果兩個顯示的頂點是相同的顏色(或根本沒有著色),那麼我肯定知道Google正在對我說謊。很明顯,我不會向Google支付一分錢。
- 如果兩個透露的頂點是不同的顏色,那麼Google可能不會對我說謊,(僅僅是可能)。
我們肯定希望第一種情況出現,我直接就能知道Google在騙我(在驗證過程中,我一直是處於懷疑的角色)。問題是,即使在我們的實驗後,谷歌仍然可以對我說謊 - 畢竟,我只看了兩下帽子。如果圖中有E個不同的邊緣,那麼Google可能會填寫一個無效的解決方案。具體來說,經過一次測試,他們可能以(E-1)/ E的概率(1000個邊緣圖的計算結果達到99.9%的時間)成功欺騙我。
幸運的是,Google為了進一步消除我的疑慮,允許我們繼續重複執行上述的操作!
我進入倉庫,重新繪製和我上述一樣的網路拓撲的空白圖表。接下來,google工程師進入倉庫,用一個有效的解決方案重新填充圖形,但是使用上述三種顏色(紅色/藍色/紫色)重新隨機排序。這裡,要注意理解,我進去倉庫後,繪製的還是我原先的圖表,但是google工程師使用的著色方案是與第一次的著色方案不同的。
帽子又回來了。我回來重複挑戰過程,挑選一個新的隨機邊緣。這一次,如果一切順利的話,我現在應該稍微有點自信,Google告訴我的是實話。為什麼呢?因為為了欺騙我,Google必須連續兩次幸運。這可能發生 - 但發生的概率相對較低。現在,Google連續兩次欺騙我的機會現在是(E-1)/ E *(E-1)/ E(或者我們上面的1000個邊緣例子大約有99.8%的概率)。
幸運的是,我們可以一直重複上述的操作過程。直到我確信Google可能會告訴我真相。
這裡有一個例子,大家可以直觀感受一下:零知識證明
請注意,我永遠不會完全確定Google是誠實的 - 他們欺騙我總是會有一個小概率。但經過大量迭代(E ^ 2),我終於可以提高自己的信心,以至於Google只能以微不足道的可能性來欺騙我 - 這足夠低了,實際上並不值得擔心。然後,我可以安全地把我的錢交給Google。
在這個過程中,我們要注意理解,Google 的著色方案也是受到保護的。即使我試圖通過在協議執行之間留下筆記來了解他們的解決方案,也不要緊。google 每次讓我驗證之前都會隨機使用新的解決方案。我每次獲取到的資訊都是不同的,所以我沒辦法將這些資訊串聯起來,最終獲得 google 的著色方案。
What makes it ‘zero knowledge’?
我向你聲稱,這個協議沒有洩露有關Google解決方案的資訊。但是現代密碼學的第一條規則就是永遠不要相信那些沒有證據就要求這樣的事情的人。
Goldwasser,Micali和Rackoff提出了三個以下屬性,每個零知識協議都必須滿足。它們是:
- 完整性。如果谷歌說的是實話,那麼他們最終會說服我(至少很有可能)。
- 確定性。如果Google真的說實話,他們只能說服我(這個方案只對我有用)。
- 零knowledgeness。 (是的,這真的叫做這個。)我不知道Google的解決方案。
我們已經討論了完整性的論點。如果我們執行足夠多的時間,協議最終會說服我(錯誤概率可以忽略不計)。如果谷歌曾經試圖欺騙我,我會以極大的可能性檢測到他們的在說謊。
這裡最困難的部分是“零知識”屬性。要做到這一點,我們需要進行一個腦洞大開的思想實驗。
時光穿梭機
首先,讓我們做一個瘋狂的假設。想象一下,Google的工程師並不像人們想象的那樣有能力。他們在這個問題上工作了很久很久,但他們一直沒有找到合理的解決途徑。所以他們決定欺騙我。
他們的想法是潛入Google “X研討會” 並借用Google的原型時間機器。最初的計劃是倒退幾年,利用額外的工作時間來解決問題。不幸的是,事實證明,像大多數谷歌原型一樣,時間機器有一些限制。最關鍵的是:它只能倒退 4min30s。所以沒辦法使用時間機器來贏得更多的工作時間。但事實證明,即使這種非常有限的技術仍然可以用來欺騙我。
這個計劃執行起來非常簡單。由於Google實際上並不知道圖形的有效顏色,因此他們只會用一堆隨機顏色對紙張著色,然後戴上帽子。如果運氣好的話,我會挑戰他們在一對不同顏色的頂點,每個人都會鬆了一口氣,我們會繼續這個協議。到現在為止還挺好。
然而,不可避免地,我要驗證一副帽子,發現兩個相同顏色的頂點。在正常的協議中,我目前已經知道Google在說謊了。但是Google這個時候啟動時間機器。每當Google發現自己處於這種尷尬境地時,他們只是簡單地修復它。也就是說,一個指定的Google員工拉開一個開關,“倒退”時間大約四分鐘,Google團隊用一個全新的隨機解決方案重新調整圖表。現在,他們讓時間前進,然後再試一次。
時間機器允許谷歌'修復'在他們的虛假協議執行過程中發生的任何事故,這使得我的經驗看起來完全合法。由於壞的挑戰結果只會發生在1/3的時間內,所以協議的預期執行時間(從Google的角度來看)只比執行誠實協議所需的時間稍微大一些。從我的角度來看,我甚至不知道額外的時間機器旅行正在發生。
最後一點是最重要的。事實上,從我的角度來看,不知道時間機器的存在,所以從我的迷之視角來看,由此產生的互動與真實情況完全相同。再強調一點,在時間機器版本中,Google絕對沒有找到合理的著色方案。
這到底是什麼意思?
我們剛剛展示的是一個模擬的例子。請注意,在三維世界中,時間是不可能倒退的,也就是說,沒有人可以用時間機器欺騙我,這個基於帽子的協議是正確的和合理的,這意味著在E ^ 2輪之後,我能夠確信(除了可忽略的概率)Google對圖形的著色方案是正確的。
在上面扯淡的例子中,我們假設如果谷歌能夠“倒退”我的時間觀點 - 那麼即使他們根本沒有關於實際圖的資訊,他們也可以為著色方案偽造有效的執行協議。從我的角度來看,兩個協議有什麼區別?當我們考慮兩者的統計分佈時,根本沒有區別。兩者都傳達了相同數量的有用資訊。
相信與否,這證明了一些非常重要的東西。
具體而言,假設我(驗證者)在觀察到誠實協議的執行之後有一些策略“提取”有關Google著色的有用資訊。那麼當我被時間機器愚弄的時候,我的策略應該也同樣適用。從我的角度來看,協議執行在統計上是相同的。我無法分辨。
因此,如果我所能提取的資訊量在“真實實驗”和“時間機器實驗”中是相同的,但是Google放入“時間機器”實驗的資訊量恰好為零 - 那意味著即使在現實世界的協議下Google也沒有洩露任何有用的資訊。(我的理解就是:加入時間機器實驗之後,Google沒有給出我們任何解決方案,但是在我看來,這個著色方案一樣是可信的,那麼在現實世界,同理。)
上述實驗主要用來輔助理解,什麼是零知識
擺脫帽子和時間機器
當然,我們不能在龐大的網路拓撲圖中使用帽子和時間機器什麼的來解決問題。
把事情聯絡在一起,我們首先需要把我們的協議帶入數字世界。這就要求我們構建一個“帽子”的數字等價物:既隱藏數字價值,又同時“約束”(或“承諾”)製造者的東西,並且在驗證之後她不能改變主意。
幸運的是,我們有這個應用程式的完美工具。這就是所謂的數字承諾計劃。承諾方案允許一方在保密的情況下“承諾”給定的資訊,然後“開啟”由此產生的承諾,揭示內部的內容。它們可以由各種成分構成,包括(強)密碼雜湊函式。
給定一個承諾方案,我們現在擁有了我們所需要的所有要素來以電子方式執行零知識協議。證明者首先將其頂點顏色編碼為一組數字訊息(例如數字0,1,2),然後對每個數字訊息產生數字承諾。這些承諾被髮送到驗證器。當驗證者在邊緣挑戰時,證明者只顯示對應於兩個頂點的承諾的開放值。
所以我們設法消除了帽子。但是,我們如何證明這個協議是零知識?
幸運的是,現在我們處於數字世界,我們不再需要一臺真正的時間機器來證明這個協議的事情。一個關鍵的技巧就是在我們的設定中指定協議不會在兩個人之間執行,而是在兩個不同的計算機程式之間執行(或者是更為正式的概率圖靈機)。
我們現在可以證明的是下面的定理:如果你能夠想出一個在參與協議執行之後提取有用資訊的計算機程式(對於驗證者),那麼就有可能使用“時間機器”在那個程式中,為了使得從證書沒有提供任何資訊開始的協議的“假”執行中提取相同數量的有用資訊。
而且由於我們現在正在談論電腦程式,顯而易見,“時間倒退”很容易。事實上,我們一直在“倒退“電腦程式。例如,我們使用有快照功能的虛擬機器軟體就可以解決。
即使你沒有花哨的虛擬機器軟體,任何計算機程式都可以被“倒帶”到一個較早的狀態,只需從頭開始重新程式設計,併為它提供完全相同的輸入。只要包括所有隨機數在內的輸入是固定的,程式將始終遵循相同的執行路徑。因此,您可以通過從一開始就執行程式來“倒帶”一個程式,並在達到某個期望的點時“分叉”執行。
最終我們得到的是下面的定理。如果有一個 Verifier 計算機程式通過與一些 Prover 互動地執行這個協議成功地提取資訊,那麼我們可以簡單地使用該程式的 “倒帶” 技巧來提交一個隨機的解決方案,然後通過倒退它的執行來 “欺騙” Verifier無法正確回答其挑戰。上面給出的邏輯是相同的:如果驗證者在執行實際協議後成功地提取資訊,那麼它應該能夠從模擬的基於 “倒帶” 的協議中提取相同數量的資訊。但由於沒有資訊進入模擬協議,所以沒有資訊可以提取。因此,驗證者可以提取的資訊必須始終為零。
OK,這是什麼意思呢?
現在,讓我們回顧一下。我們知道,協議是完整的,基於我們上面的分析。在任何情況下,都不存在時間機器這個玩意兒。
同時,協議也是零知識。為了證明這一點,我們證明了任何成功提取資訊的 Verifier 程式也必須能夠從使用的協議執行中提取資訊,並且首先沒有資訊可用。這導致了一個明顯的矛盾,並告訴我們這個協議在任何情況下都不能洩漏資訊。
這一切都有一個重要的好處。由於任何人“偽造”協議都是微不足道的,即使在Google向我證明他們有解決方案之後,我也不能重新還原協議的記錄,以向任何其他人證明任何事情(比如法官) 。這是因為法官不能保證視訊是真實錄制的,而且我也不會像谷歌使用時間機器那樣簡單地進行編輯。這意味著協議轉錄本身不包含任何資訊。協議只有在我自己參與的情況下才有意義,我可以確定它是實時發生的。
總結
可以使用雜湊函式來構建一個簡單的承諾示例。要提交值“x”,只需生成一些(適當長的)隨機數字,我們將其稱為“salt”,並輸出承諾C = Hash(salt || x)。要開啟承諾,你只需要顯示“x”和“salt”。任何人都可以通過重新計算雜湊來檢查原始承諾是否有效。這在一些關於函式本身的假設下是安全的。
原文連結:Zero Knowledge Proofs: An illustrated primer
本文由 Copernicus團隊 冉小龍
翻譯,轉載無需授權。