零知識證明:區塊鏈隱私保護利器
哈希未来
2018-07-16 06:20
本文约3718字,阅读全文需要约15分钟
報告摘要: 零知識證明是一種基於概率的驗證方式,驗證的內容包括“事實類陳述”和“關於個人知識的陳述”。



作者:報告摘要:

報告摘要:

報告摘要:

報告摘要:

零知識證明是一種基於概率的驗證方式,驗證的內容包括“事實類陳述”和“關於個人知識的陳述”。驗證者基於一定的隨機性向證明者提出問題,如果都能給出正確回答,則說明證明者大概率擁有他所聲稱的“知識”。 Zerocoin(零幣協議)將零知識驗證用於鑄造零幣和贖回零幣過程中,以隱藏了一筆交易對應的發送方和接收方信息,Zerocash(零鈔協議)採用更新穎的zkSNARKs技術,將需要驗證的交易內容轉換成證明兩個多項式乘積相等,結合同態加密等技術在保護隱藏交易金額的同時進行交易驗證。缺點在於若網絡收到攻擊超發零鈔,則無法發現或採取措施;Zerocoin和Zerocash均需要進行預先的“信任設置”,沒有達到真正的“去信任”。英特爾SGX、zkSTARKs等新技術有可能解決上述問題,但仍需經過實踐的檢驗。

一、零知識證明原理

零知識證明是一種加密方案,最初在20實際80年代由MIT研究人員在論文中提出。 “零知識協議是一方(證明方)可以向另一方(驗證方)證明某事是真實的方法,除了這一具體陳述是真實的事實以外,不透露任何額外的信息。例如對於現在登錄網站而言,在Web服務器上存儲了客戶的密碼的哈希值,為了驗證客戶實際上知道密碼,目前大部分網站採用的方式是服務器對客戶輸入的密碼進行哈希計算,並與已存結果對比,但是這種方式的弊病在於服務器在計算時就可以知道客戶的原始密碼,一旦服務器被攻擊,用戶的密碼也就洩露了。如果能夠實現零知識證明,那麼就可以在不知道客戶密碼的前提下,進行客戶登錄的驗證,即使服務器被攻擊,由於並未存儲客戶明文密碼,用戶的賬戶還是安全的。

基本的零知識證明協議是交互式的,需要驗證方向證明方不斷詢問一系列有關其所掌握的“知識”的問題,如果均能夠給出正確回答,那麼從概率上來講,證明方的確很有可能知道其所聲稱的“知識”。例如某人聲稱知道一個數獨難題的答案,一種零知識證明的方式是驗證方隨機指定這一次按列、按行還是按九宮格來檢測,每次檢測不需要看到數字擺的具體位置,只需要檢測出來是否包含了1-9個數字即可,只要驗證的次數足夠多,那麼可以大概率相信證明方是知道數獨題目的解的。但是這樣簡單的方式還不能讓人相信證明方和驗證方均沒有作假,在數獨的案例中,兩者有可能事先串通好,從而使得證明方在不知道答案的前提下通過驗證。如果他們想讓第三方信服,驗證方必須也要證明自己每次的檢測方案是隨機的且自己沒有和證明方串通。

由於第三方觀察者難以驗證交互式零知識證明的結果,因此當我們向多人證明某些內容時,我們需要付出額外的努力和成本。而非交互式的零知識證明顧名思義,不需要互動過程,避免了串通的可能性,但是可能會額外需要一些機器和程序來決定試驗的序列:例如在數獨的例子中,通過程序的方式來決定哪一次按行、哪一次按列來檢測,但是這個試驗序列必須保密,否則驗證方預先知道了試驗的序列就有可能利用這個信息,提前準備,在並不知道真實“知識”的情況下通過驗證。

零知識證明的內容可以概括為兩類:“事實”類陳述:例如證明“一個特定的圖可以進行三著色。”或者“一個數N是合數”;關於個人知識的陳述:例如“我知道這個特定圖的染色方案”或者“我知道N的因式分解”。

但並不是所有的問題都有零知識證明的加密方案,Goldreich, Micali 和Wigderson 給出了理論上存在零知識證明解的有效範圍。他們發現對於在多項式時間內可以驗證解的決策問題(問題的答案僅為是/否),存在已知的零知識證明方案。只需要在這樣NP問題中找到想要證明的論述,並轉化為三色問題的一個實例,那麼就可以利用已有的協議實現零知識證明。由於三色問題屬於NPC問題,任何其他的NP問題都可以轉化為這個問題的實例。

二、區塊鏈中的零知識證明應用

在區塊鏈上的交易中,如比特幣和以太坊網絡網絡,除了使用地址來替換交易雙方的真實身份,使得交易具有部分匿名性以外,發送、接收地址和金額都是已知的,別人有可能通過網絡上的各種信息、和現實世界發生的交互記錄等將比特幣地址和真實身份對應起來,也因此具有隱私暴露的隱患。 Zerocoin設計了一種全新的思路,無法通過交易歷史分析來獲得用戶真實身份。 Zerocoin裡需要消耗一定價值的要交易的貨幣,以生成具有獨特序列號的一枚零幣。零知識證明可以在不透露花費了具體哪個貨幣的基礎上,驗證出你的確花了這筆錢。為了將這筆錢轉給他人,邏輯上需要我們使得這枚零幣不能再被別人花費,零幣的辦法是大家共同維護一個作廢列表,存著所有已經花費的零幣的序列號。礦工在驗證這筆花費交易時運用零知識證明的方法,不需要知道具體花掉哪一個零幣,也可以驗證零幣的序列號是否在作廢列表裡。由於花費交易並沒有輸入地址和簽名的信息,整個交易過程中,礦工也並不知道這個零幣的來源,因此也就難以對交易歷史進行分析而獲取用戶身份。

在零幣裡,交易的金額是可以知道的,而採用zkSNARKs技術的Zerocash連交易金額都可以隱密,賬本唯一公開記錄的唯一內容就是交易的存在性。可以證明對於NP中的所有問題存在zkSNARKs。它引入了多項創新技術,使它們可以在區塊鏈中使用。最重要的是,zkSNARKs減少了證明的大小和驗證它們所需的計算量。它的過程可以簡述為。

1. 將要驗證的程序拆解成一個個邏輯上的驗證步驟,將這些邏輯上的步驟拆解成由加減乘除構成的算數電路。

2. 通過一系列的變換將需要驗證的程序轉換成驗證多項式乘積是相等的,如證明t(x)h(x)= w(x)v(x)。

3. 為了使得證明更加簡潔,驗證者預先隨機選擇幾個檢查點s,檢查在這幾個點上的等式是否成立。

4. 通過同態編碼/加密的方式使得驗證者在計算等式時不知道實際的輸入數值,但是仍能進行驗證。

5. 在等式左右兩邊可以同時乘上一個不為0的保密的數值k,那麼在驗證(t(s)h(s)k)等於(w(s)v(s)k)時,就無法知道具體的t(s)、h(s)、w(s)、v(s),因此可以使得信息得到保護。

不同於Zerocoin的密碼學原語RSA累加器,zkSNARKs技術較新,未經廣泛驗證,存在風險,同時由於更強的匿名性,Zerocash的漏洞也更難發現,和Zerocoin相比,Zerocash由於交易金額信息也是未知的,所以如果有攻擊者無限制地發行零鈔,這樣的情況是無法檢測的。

參考文獻:


參考文獻:

參考文獻:

參考文獻:https://z.cash/technology/zksnarks.html.

1. Zcoin中文社區,《Zcoin和Zcash: 相似性和不同處》.http://www.zcoinchina.org/zcoin-and-zcash/

4. Christian Reitwiessner,《zkSNARKs in a nutshell》,https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/

5. Matthew Green,《Zero Knowledge Proofs: An illustrated primer》,https://blog.cryptographyengineering.com/2014/11/27/zero-knowledge-proofs-illustrated-primer/

2. Zcash團隊,《What are zk-SNARKs?》http://www.sohu.com/a/224915382_117959

3. 零幣技術白皮書《一種通過使用零幣協議(zerocoin protocol)來保障賬務隱私的加密貨幣》

6. 老錢,《一個數獨引發的慘案:零知識證明(Zero-Knowledge Proof)》,





哈希未来
作者文库