編者按:本文來自hackernoon.com,作者:Oscar W
譯者:星球日報茶涼
零知識證明(Zero-Knowledge Proof)或零知識協議是一種基於概率的驗證方法,包括兩部分:宣稱某一命題為真的證明者(prover)和確認該命題確實為真的驗證者(verifier)。
零知識證明指的是證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的,在密碼學中非常有用。
顧名思義,零知識證明就是既能充分證明自己是某種權益的合法擁有者,又不把有關的信息洩漏出去,即給外界的 「知識」 為「零」。
「能夠在不知道用戶是誰,或者他們有多少錢的情況下判斷『一個用戶是否有足夠的錢發送給另一個用戶』的問題,是零知識證明在區塊鏈中的主要應用之一。」——Demiro Massessi
為何零知識證明如此重要?
數據隱私是當今社會最重要的課題之一。保護與個人身份有關的個人資料 (出生日期、銀行月結單、交易記錄、學歷) 極為重要,並會不斷增加其重要性。在科技時代,我們正在生成前所未有的海量數據,而我們不斷創造的關於我們自己的數據也在不斷被獲取。像谷歌和 Facebook 這樣的大公司已經利用我們的數據成為了今天主宰世界的科技巨頭。然而,最近密碼學的突破和區塊鏈的興起使一種新的方法能夠幫助保護我們的數據和身份,甚至保護我們與之交互的組織。
零知識證明可能就是如何保護數據隱私的答案。
零知識證明的原則
零知識證明是麻省理工學院研究人員在 20 世紀 80 年代提出的一種加密方案。零知識證明協議是一方 (證明者) 向另一方證明 (驗證者) 某件事情是真實的一種方法。除了該特定聲明是真實的以外,沒有披露任何其他信息。
例如,當前網站將用戶密碼的哈希值存儲在其 web 伺服器中。為了驗證客戶端是否真的知道密碼,大多數網站目前使用的方法是對客戶端輸入的密碼進行哈希值計算,並將其與存儲的結果進行比較。
零知識證明可以保護用戶的帳號信息不被洩露。如果零知識證明可以實現,那麼在客戶的密碼是未知的情況下,仍然可以在客戶端登錄進行身份驗證。當伺服器受到攻擊時,用戶的帳戶仍然是安全的,因為客戶的密碼沒有存儲在 web 伺服器中。
交互式零知識證明
零知識證明協議的基礎是交互式的。它要求驗證者不斷地提出一系列關於證明者所知道的 「知識」 的問題。
例如,如果有人聲稱知道九宮格謎題的答案,零知識證明就是驗證者隨機指定按列、行或九個正方形進行驗證。每個測試不需要知道具體的答案,只需要檢測數字 「1」 到「9」是否包含在其內。只要驗證的次數足夠多,就有可能判斷證明者是否知道九宮格謎題的答案。
然而,這種簡單的驗證方式並不能使人們相信證明者和驗證者都未做偽證。在九宮格遊戲中,兩者可能會事先串通,以便證明者在不知道答案的情況下通過驗證。如果他們想說服第三方相信這個結果,驗證者還必須證明驗證過程是隨機的,並且它不會將答案洩露給證明者。因此,第三方很難驗證交互零知識證明的結果,需要第三方的參與,等額外的努力和成本才能向多人證明某件事是真實的。
非交互式零知識證明
非交互式零知識證明,顧名思義,不需要交互式過程,避免了驗證者和證明者串通的可能性,但可能需要第三方機器和程序來確定驗證的順序。
例如,在九宮格遊戲中,由第三方程序決定要驗證哪一列或哪一行。驗證序列必須保密,否則驗證者可能在不知道真實 「知識」 的情況下通過驗證序列。
零知識證明在區塊鏈中的應用
比特幣和以太坊網絡都使用公共地址來代替驗證者和證明者的真實身份,使得交易部分匿名; 只有發送和接收地址,以及交易數量是公眾知道的。但是,通過區塊鏈上提供的各種信息,如交互記錄等,可以發現地址的真實身份,存在隱私暴露的隱患。
用了零知識證明之後,發送方、接收方和第三方的細節信息可以保持匿名,同時保證交易有效。
最早使用零知識證明技巧的區塊鏈叫做 Zcash,實際的作法叫做 Zk-Snarks,這是許多零知識證明的做法之一,也是最有名的一個。
Zk-Snarks 是 「零知識簡潔無交互知識認證」 的簡稱,是一種在無需洩露數據本身情況下證明某些數據運算的一種零知識證明。
Zk-Snarks 技術縮減了證明所需的時間和驗證它們所需的計算量。它能夠證明有效交易的條件已經滿足,而不需要透露交易所涉及的地址或交易量的任何關鍵信息。
Zcash 可以將交易紀錄上的匯款者、收款者和金額都經過加密隱藏起來,因此礦工無從得知這些交易上的細節,但仍然可以驗證交易。不過,目前多數使用者在 Zcash 上的交易,還是選擇未經加密的作法,因為花費的成本比較高。
另外,以太坊(Ethereum)上的智能合約目前也已經可以運用 Zk-Snarks 這套零知識證明的作法。但以太坊不完全是從隱私的角度切入,而是從節省運算成本的角度應用零知識證明。
透過 Zk-Snarks,以太坊礦工可以不用再重新執行交易的運算,而是只要對方提得出證明即可。大概就像我不需要真的知道你會高一到高三的數學,而只要看到高中畢業證就能確定你懂高中數學。不過,這隻有在製作證明的成本,遠低於實際運算成本的情況下才划算。
Zk-Snarks 將需要驗證的交易內容轉化為兩個多項式乘積相等的證明,並結合同態加密等高級技術,在執行事務驗證的同時保護隱藏的事務量。其過程可簡單描述為:
將代碼分解為可驗證的邏輯驗證步驟,然後將這些步驟分解為由加減乘除組成的計算流程。
進行一系列變換,將待驗證代碼轉換為多項式方程,如 t(x)h(x)= w(x)v(x)。
為了使證明更加簡潔,驗證者事先隨機選擇幾個檢查點 s,檢查這些點上的方程是否為真。
通過同態編碼或加密,驗證者在計算方程時不知道實際輸入值,但仍然可以驗證。
在等式的左右兩邊,乘以一個不等於 0 的密值 k。當驗證 (t(s)h(s)k) = (w(s)v(s)k) 時,具體的 t(s)、h(s)、w(s)、v(s)是不可知的,可以對信息進行保護。
當前履行 Zk-Snarks 算法的一個缺陷是需要在 advanced 中內置參數。如果這些參數洩露,整個網絡將面臨毀滅性的破壞。因此,用戶必須信任在使用這些網絡時不會洩露的信息。
可能的解決方案包括使用現代的「可信執行環境」,如 Intel SGX 和 ARM TrustZone。對於 Intel 的 SGX 技術,即使應用程式、作業系統、BIOS 或 VMM 受到威脅,私鑰也是安全的。此外,最近的一份白皮書揭示了它在零知識密碼學中的創新:Zk-Snarkss(零知識可伸縮透明知識參數)。
根據 Zk-Snarks 白皮書,Zk-Snarks 是第一個不依賴任何信任設置實現區塊鏈驗證的系統,而隨著計算數據數量的增加,計算速度呈指數增長。它不依賴於公鑰加密系統,而且更簡單的假設使它在理論上更安全,因為它唯一的加密假設是哈希函數 (如 SHA2) 是不可預測的。零知識證明和 Zk-S(T|N)ARK 等技術的測試和採用需要時間。