前言:零知識證明是一種特殊的互動式證明,其中證明者知道問題的答案,他需要向驗證者證明“他知道答案”這一事實,但是要求驗證者不能獲得答案的任何資訊。
來源: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(零知識簡明非互動式知識證明)。具體技術細節,大家可以自行檢視哦。
關於零知識證明,還有一個非常經典的例子,可以更好的幫助大家理解:
阿里巴巴被強盜抓住,為了保命,他需要向強盜證明自己擁有開啟石門的口令,同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開自己一箭之地,距離足夠遠讓強盜無法聽到口令,足夠近讓阿里巴巴無法在強盜的弓箭下逃生。如果強盜舉起左手,阿里巴巴就使用口令將石門開啟,如果舉起右手,就將石門關閉。阿里巴巴就在這個距離下向強盜展示了石門的開啟和關閉。如果每次都能正確開啟和關閉大門,則證實阿里巴巴確實知道石門的密碼。
這個整個過程就是零知識證明,即證明者能夠在不向驗證者提供任何有用資訊(石門的口令)的情況下,使驗證者相信某個論斷(阿里巴巴知道開啟石門的方法)是正確的。
好了,關於零知識證明就說到這裡了,全文試著用兩個例子來試圖向大家說明什麼是零知識證明,希望大家看了之後,能對零知識證明有一定了解。