零知識證明初見

husterzxh發表於2020-08-27

零知識證明簡介

零知識證明(Zero-Knowledge Proof)是現代密碼學核心之一,由S.Goldwasser、S.Micali及C.Rackoff在20世紀80年代初提出,其中,S.Goldwasser和S.Micali在2012年榮獲圖靈獎。在零知識證明提出的初期,由於缺乏應用場景,僅僅停留在理論層面。近年來,隨著區塊鏈的蓬勃發展,零知識證明才在實踐層面上有了用武之地。
零知識證明的本質就是在不透露一個論斷的任何資訊的情況下,向別人證明這個論斷是正確的。零知識證明具有三條性質:

  1. 完備性。如果證明方和驗證方都是誠實的,並遵循證明過程的每一步,進行正確的計算,那麼這個證明一定是成功的,驗證方一定能夠接受證明方。
  2. 合理性。沒有人能夠假冒證明方,使這個證明成功。
  3. 零知識性。證明過程執行完之後,驗證方只獲得了“證明方擁有這個知識”這條資訊,而沒有獲得關於這個知識本身的任何一點資訊。

理論上的零知識證明協議具有不同的特點。有的零知識證明協議是專職的,只能證明某些特定的問題,比如,圖同構問題。有些零知識證明協議是全能的,只要你能用程式碼定義的問題,它都能證明(只是理論可行,不意味著有執行效率)。有些協議是互動式的,需要證明者和驗證者來回發很多輪訊息;有些是非互動式的,證明者只需要根據協議向驗證者發一次訊息。有的協議證明大小與問題規模相關,問題越複雜,證明越長。而有些協議下,無論問題多複雜,證明大小都一樣。

一個例子

三色圖問題就是找到一種上色方案使得相鄰兩個節點的顏色不同(圖2-(1)中以連線表示兩個節點相鄰)。三色圖是一個NP問題,這意味著求解過程十分複雜。因此,當小明應小紅的委託艱難地找出一個三色圖問題的答案時,小明沒拿到酬勞是絕不願意向小紅出示答案的。那小明(證明者)如何向小紅(驗證者)證明他知道答案呢?
步驟如下:

  1. 小明把問題圖中已經正確上色的節點都遮起來,見圖2-(2);
  2. 小紅從中任意選相鄰的兩個節點,小明便向其展示這兩個節點的顏色,見圖2-(3)。如果這兩個節點的顏色不同,那麼小紅便有50%的把握相信小明確實知道答案;
  3. 接著,小明隨機選擇一種顏色對映方案將目前圖中的顏色變換成另一種顏色,例如“紫色->白色,橙色->黃色,綠色->黑色”,這樣便生成了一張新的著色圖。雖然顏色不同,但仍是原問題的有效解;
  4. 重複第1-3步N次,如果每次展示的兩個節點顏色都不相同,那麼小明知道答案的可靠性便是1-(0.5)^N。

零知識證明應用

零知識證明的應用非常廣泛,下面是部分常見的應用場景。

  • 區塊鏈:在傳統的區塊鏈架構中,同樣的計算被重複多次,比如簽名的校驗、交易合法性校驗、智慧合約的執行等等,這些計算過程都可以被零知識證明技術進行壓縮。
  • 隱私保護:我們經常會填一些涉及個人資訊的表格,向別人暴露了隱私,給我們的生活造成了困擾。通過零知識證明,我們只需要向對方提供我們部分資訊,最大程度保護個人隱私。比如在買保險的時候,向保險公司證明我沒有心臟病,但是不需要向保險公司提供完整的病歷。
  • 端到端的通訊加密:使用者之間可以互相發訊息,但是不用擔心伺服器拿到所有的訊息記錄,同時訊息也可以按照伺服器的要求,出示相應的零知識證明,比如訊息的來源、與傳送的目的地。
  • 身份認證:使用者可以向網站證明,他擁有私鑰,或者知道某個只有使用者自己才知道的祕密答案,網站並不需要知道具體內容,但是網站可以通過零知識證明來驗證這個私鑰或者答案,從而確認使用者的身份。

參考資料
零知識證明學習資源彙總
讀懂區塊鏈之零知識證明(zk-SNARK)
零知識證明的江湖
一個數獨引發的慘案:零知識證明(Zero-Knowledge Proof)

相關文章