今天講個故事,讓你明白什麼是零知識證明(ZKP, Zero Knowledge Proofs)

買賣虛擬貨幣

前言:零知識證明是一種特殊的互動式證明,其中證明者知道問題的答案,他需要向驗證者證明“他知道答案”這一事實,但是要求驗證者不能獲得答案的任何資訊。

來源:pixabay

當今密碼學世界中最酷炫的一件事,莫過於那些優美又神秘的專有名詞。“零知識”就是這樣一個熱詞,受盡追捧。

可太過受歡迎也未必是件好事,俗話說,人怕出名豬怕壯,因為“零知識”的概念如此吸引眼球,以至於導致了許多的錯誤理解和誤用。許多人將零知識和“非常非常安全”劃上了等號,還將它與加密系統或匿名網路聯絡起來——這些東西實上與真正的零知識協議毫無關係。

零知識證明是密碼學家設計出來的最強大的工具之一,但同時,理解它的人也不多。今天,我將試著以通俗易懂的表達方式來介紹什麼是“零知識證明”,並解釋到底是什麼讓它如此特別。

一、零知識的起源

在上世紀80年代初,“零知識”的概念最早由麻省理工學院的研究人員 Shafi Goldwasser, Silvio Micali和Charles Rackoff 所提出。當時他們正在研究與互動證明系統相關的問題,這系統使得甲方(證明者)可以和乙方(驗證者)交換資訊,並藉此說服乙方接受(透過驗證)某個數學論述為真 。

Shafi Goldwasser, Silvio Micali and Charles Rackoff  |  維基百科、IACR

零知識證明這個問題不是單純的理論思考,而是在真實、具體的應用中,會面到臨的問題。

我舉個例子,在現實生活中,大家用賬號密碼的方式登入微信、微博等社交軟體時,在輸入密碼後,APP會把你的密碼傳送給伺服器(當然,這裡應該會加密後再傳送的),然後和伺服器中的密碼進行比對,一樣的話,就可以成功登陸了。

可這裡有個問題。大家發現了嗎?實際上,伺服器知道我們的密碼。

大多數系統就是以這樣糟糕的方式進行“證明”的,因此,如何保障密碼安全呢?可能只有祈禱伺服器不會遭受攻擊了。

二、一個“真實世界”的案例

上面那樣討論,可能還比較抽象。為了讓大家能有更具體的概念,現在我們舉個“真正的”零知識證明例子。

請大家配合我想象一下,現在我是一個電信業巨頭,跟隨“一帶一路”,積極參與到非洲地區的電信網路建設中來。現在我要部署一個新的蜂窩電信網路。(這裡我還是解釋一下為什麼叫蜂窩網路吧。大家看下面第一張圖,是行動網路拓撲圖,有沒有很像下邊的蜂窩呢?對!名字就是這樣來的)

蜂窩網路  作者:Mozzerati  |  維基百科

https://zh.wikipedia.org/wiki/蜂窩網路#/media/File:Frequency_reuse.svg

真正的蜂窩 作者:umsiedlungen  |  Pixabay

今天為了方便講述,把網路架構圖這樣展示,如下。圖中的每個頂點代表一個無線電塔,每一條連線代表無線電塔訊號兩兩重疊的區域,這意味著連線上的訊號會互相干擾。(相鄰兩個電塔(小區),訊號頻率相同,產生的同通道干擾)。

為了避免這樣的干擾,在設計網路架構時,我就想到了用三種不同的頻率來部署。

不過現在,我有了新的挑戰!這個挑戰來自我該如何部署不同的頻率,使得相鄰的每兩個電塔不具有相同頻率。我們現在用不同顏色來表示不同頻率,可以很快找到一種解決方案如下圖所示。

可能有很多瞭解過的朋友已經發現,我剛才講的就是著名的演算法問題——三色問題。大家也就知道,這個問題有趣的地方在:某些非常龐大的網路中,我們很難找到解,甚至連證明問題有解都辦不到。

如果只是上面給的這種示例圖,我們用手就能輕鬆找出解。但如果今天我的無線通訊網路規模特別複雜而龐大,我以我所能調配的計算資源都無法找到解答的情況下,我該怎麼辦?我還可以把這個問題“外包”給擁有更龐大算力的人呀!比如去找谷歌幫忙啊。

但這又會導致一個問題。谷歌找到了有效著色方法,因此耗費了大量的算力。不過在我得到有效方法之前,我是不打算付錢的。同樣,谷歌在收到錢之前,也不會願意給我著色方法的副本的。以此,我們雙方陷入了僵局。(這裡不討論現實中情況,畢竟律師和賬戶託管可以解決。但我們今天是來表述密碼學的,所以解決困境,需要瘋狂一點的技術手段。)

三、一種瘋狂的技術手段

現在有一個大倉庫、大量的蠟筆和紙張。哦,對了,還得有C位選手——帽子!

下面是運作原理。

1、我進入倉庫,在地板上鋪滿紙張,並在空白的紙上畫出電塔圖;

2、谷歌工程師進來,蠟筆中隨機選三種顏色,然後照著他們已經算出來的解決方案進行著色(顏色不重要,方案有效就行)。著色完成後,每個紙上的電塔用帽子蓋住,然後離開倉庫。

我回到倉庫,看到下圖。很顯然,谷歌的方案我是看不出來的,我也不知道他們的方案是否有效

為了消除我的疑慮,谷歌工程師告訴我,可以隨機選擇其中一條線,然後要求他們揭開對應的帽子,這樣我就能看到他們著色方案的一小部分了。如下所示。

谷歌工程師方案沒問題的話,這兩種顏色一定是不相同的。但我這時候會想,萬一只是碰巧呢?在目前條件下谷歌仍有很大的可能是給了我一個無效的著色方案。假設一共有X條邊,在僅僅是經過以此揭開帽子的觀察後,我仍有高達 (X-1)/X 的概率被騙。

好了,谷歌也不想浪費了大量算力的方案,卻得不到付款。就讓我再一次,重新進行觀察。

剛剛的運作原理,谷歌工程師再按照方案做一遍,只是蠟筆的顏色,換了。

我這時候再隨機選擇一條線,然後谷歌工程師揭開帽子,進行驗證。這次情況會好些,我對他們有了更多的信心,但騙我的概率依然存在,概率為 [(X-1)/X]* [(X-1)/X](在1000條線的情況下,大約有99.8%的可能性,還是比較高。)

不過好在,這個挑戰可以一直進行下去,不斷重複以上操作,直到我們相信為止。

不過還是別這樣了,太麻煩了,這時候還是寫段程式碼來驗證以上邏輯更加方便。事實上,我被騙的概率是一直存在的,但我可以把這概率降低到一個程度(進行X^2次挑戰),那時候,谷歌只剩下微不足道的概率可以騙我,這概率低到我大可以放心付款。

來源:pixabay

在這整個過程中,不只有我需要保護,谷歌也需要。所以,在我進行“無數次”挑戰時(隨機選出一條線來驗證的過程),我是無法推敲谷歌耗費了大量的算力得出的著色方案的,因為每次驗證後,他們都會換三種顏色。我獲得的資訊,對我來說,毫無幫助,每次挑戰的結果也無法被串聯起來。

這就是零知識證明。

四、零知識證明特性

零知識證明有三個特性,任何零知識都必須滿足。簡單來說:

1、完整性(Completeness)。如果谷歌說的真話,那麼他們最終能說服我(至少讓我相信可能性非常高)。

2、安全性(Soundness)。只有當他們說的是真話時,谷歌才有可能說服我。

3、零知識性(Zero-knowledgeness)。我無法從中獲得任何關於谷歌解決方案的資訊。

來源:pixabay

五、區塊鏈上的零知識證明

比特幣和以太坊都是用公共地址來代替當事方的真實身份,使交易部分匿名,公眾只知道傳送和接收的地址以及交易的數量。然而,可以透過區塊鏈上可用的各種資訊(如互動記錄)找出地址的真實身份,因此存在暴露隱私的可能。

零知識證明,可以在傳送方、接收方和其他交易細節都保持匿名的情況下,保證交易有效。

ZCash可能是成功實現零知識證明的最著名的區塊鏈專案之一。Zcash實現了ZKP的修改版本,被稱為zk-SNARKS,代表Zero-Knowledge Succinct Non-Interactive Argument of Knowledge(零知識簡明非互動式知識證明)。具體技術細節,大家可以自行檢視哦。

關於零知識證明,還有一個非常經典的例子,可以更好的幫助大家理解:

阿里巴巴被強盜抓住,為了保命,他需要向強盜證明自己擁有開啟石門的口令,同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開自己一箭之地,距離足夠遠讓強盜無法聽到口令,足夠近讓阿里巴巴無法在強盜的弓箭下逃生。如果強盜舉起左手,阿里巴巴就使用口令將石門開啟,如果舉起右手,就將石門關閉。阿里巴巴就在這個距離下向強盜展示了石門的開啟和關閉。如果每次都能正確開啟和關閉大門,則證實阿里巴巴確實知道石門的密碼。

這個整個過程就是零知識證明,即證明者能夠在不向驗證者提供任何有用資訊(石門的口令)的情況下,使驗證者相信某個論斷(阿里巴巴知道開啟石門的方法)是正確的。

好了,關於零知識證明就說到這裡了,全文試著用兩個例子來試圖向大家說明什麼是零知識證明,希望大家看了之後,能對零知識證明有一定了解。

免責聲明:

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

推荐阅读

;