[譯]零知識證實: an illustrated primer

前言:

密碼學一直被冠以一層神祕的面紗,它深奧的原理一直讓人望而生畏,在區塊鏈技術中,密碼學又顯得尤其重要,因此,嘗試翻譯學習一下 「Zero Knowledge Proofs」 來加深對密碼學的進一步認識。html

「零知識」 這個詞很是吸引人,咱們假設零知識是「絕對安全」的代名詞,這致使了許多地方在濫用它。它被固定在各類各樣的東西上,好比加密系統和匿名網絡,然而它們與真正的零知識協議毫無關係。web

這一切都有助於強調一個觀點:零知識證實是密碼學家所設計的最強大的工具之一。但不幸的是,他們的理解也相對較差。接下來,我將嘗試給出一個(大部分)非數學描述 ZK 證實是什麼,以及是什麼使他們如此特別。編程

ZK 的起源:

「零知識」的概念最先是由麻省理工學院的研究人員Shafi Goldwasser,Silvio Micali和Charles Rackoff在20世紀80年代提出的。這些研究人員正在研究與交互式證實系統有關的問題,即第一方(稱爲「證實者」)與第二方(「驗證者」)交換信息的理論系統,以說服驗證者某些數學陳述是真實的。安全

在Goldwasser等人以前,這個領域的大部分工做集中在證實系統的正確性上。也就是說,它認爲惡意的證實者試圖「欺騙」驗證者相信虛假陳述的狀況(有點難理解) 。Goldwasser,Micali和Rackoff所作的就是把這個問題變成現實。他們不只僅擔憂證實者,而是問:若是驗證者是不可信的,你該怎麼辦?服務器

他們提出的具體問題是信息泄漏。具體地說,在證實過程當中,驗證者要了解多少額外的信息,就會超出了陳述是真實的事實?網絡

注意,這不只僅是理論上的興趣,這種理論已經有其實際的應用。svg

下面是一個例子:假設現實中的一個客戶但願使用密碼登陸到Web服務器。這個問題的標準在 「real world」 中涉及到在服務器上存儲散列版本的密碼。所以,登陸能夠被看做是一種「證實」,即給定的密碼散列是某個密碼散列函數的輸出 - 更重要的是,客戶端實際上知道密碼。(不理解不要緊,接着往下看)函數

大多數真實的系統以至關差勁的方式實施這個「證實」。客戶端只需將原始密碼發送到服務器,從新計算密碼哈希並將其與存儲的值進行比較。這裏的問題很明顯:在協議結束時,服務器已經學習了個人明文密碼。所以,咱們只能默默禱告服務器不會癱瘓,呵呵。工具

Goldwasser,Micali和Rackoff提出的是進行這種證實新思路。慶幸的是,零知識證實就是用來證實上述問題,同時證實除了與「這個真實的」相對應的單個信息外沒有任何信息被泄漏(看完下面的講解再回過頭來理解)。學習

A ‘real world’ example:

到目前爲止,這個討論很是抽象。爲了使事情更加具體,讓咱們繼續,給出一個 「真正的」 零知識協議(略微瘋狂)的例子。

就這個例子而言,我但願你們能想象我是一個新通訊網絡的電信巨頭。個人網絡結構以下圖所示。該圖中的每一個頂點表示蜂一個無線電塔,鏈接線(邊緣)表示兩個單元重疊的位置,這意味着它們的傳輸可能相互干擾。

網絡拓撲圖

很明顯,這種重疊是有問題的,由於相鄰塔的信號可能會擾亂我對信號的接收。幸運的是,個人網絡設計容許我將每一個塔配置爲三個不一樣頻段之一以免這種干擾。

所以,要部署個人網絡的挑戰是將頻帶分配給塔,使得沒有兩個重疊的無線電塔會共享相同的頻率。若是咱們使用顏色來表示頻段,咱們能夠快速找出解決問題的辦法:

着色解決-1

固然,繞了半天圈子,你們會發現,這是一個著名的理論,稱爲 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如今給了我一個「挑戰」圖表着色解決方案的機會。我能夠隨意選擇這張圖的一個「邊緣」(也就是兩個相鄰的帽子之間的一條線)。而後谷歌將「揭開」這兩個相應的帽子,展現他們解決方案的一小部分:

着色方案-1

對我而言,這個實驗有兩個結果:

  • 若是兩個顯示的頂點是相同的顏色(或根本沒有着色),那麼我確定知道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員工拉開一個開關,「倒退」時間大約四分鐘,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團隊 冉小龍翻譯,轉載無需受權。

轉載自:mp.weixin.qq.com/s/fgenZvQUj…

相關文章
相關標籤/搜索