一.零知識證明
零知識證明(Zero—Knowledge Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世紀80年代初提出的。它指的是證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的。零知識證明實質上是一種涉及兩方或更多方的協議,即兩方或更多方完成一項任務所需採取的一系列步驟。零知識證明必須包括兩個方面,一方爲證明者P,另一方爲驗證者V。證明者試圖向驗證者證明某個論斷是正確的,或者證明者擁有某個知識,卻不向驗證者透露任何有用的消息。零知識證明目前在密碼學中得到了廣泛的應用,尤其是在認證協議、數字簽名方面。
舉個例子:A要向B證明自己擁有某個房間的鑰匙,假設該房間只能用鑰匙打開鎖,而其他任何方法都打不開。這時有2個方法:(一)A把鑰匙出示給B,B用這把鑰匙打開該房間的鎖,從而證明A擁有該房間的正確的鑰匙。(二)B確定該房間內有某一物體,A用自己擁有的鑰匙打開該房間的門,然後把物體拿出來出示給B,從而證明自己確實擁有該房間的鑰匙。後面這個方法屬於零知識證明。好處在於在整個證明的過程中,B始終不能看到鑰匙的樣子,從而避免了鑰匙的泄露。
對於零知識證明的介紹有個有、意思的帖子,若有興趣請移步《一個數獨引發的慘案:零知識證明(Zero-Knowledge Proof)》。在Goldwasser等人提出的零知識證明中,證明者和驗證者之間必須進行交互,這樣的零知識證明被稱爲“交互零知識證明”。80年代末,Blum等人進一步提出了“非交互零知識證明”的概念,用一個短隨機串代替交互過程並實現了零知識證明。非交互零知識證明的一個重要應用場合是需要執行大量密碼協議的大型網絡。接下來要講的Feige-Fiat-Shamir協議會以交互式的角度來進行。
二.Feige-Fiat-Shamir零知識身份認證
從實用角度考慮,要保證用戶身份識別的安全性,身份識別協議至少要滿足以下條件:
- 識別者A能夠向驗證者B證明他的確是A(A向B證明自己有A的私鑰)。
- 在識別者A向驗證者B證明他的身份後,驗證者B沒有獲得任何有用的信息,B不能模仿A向第三方證明他是A 。
1986年,Feige,Fiat 和 Shamir基於零知識的思想設計了一個零知識身份識別協議,這就是著名的 Feige-Fiat-Shamir 零知識身份識別協議。該協議的目的是證明者P向驗證者V證明他的身份(私鑰),且事後V不能冒充P。
先從簡化版本的Feige-Fiat-Shamir 零知識身份識別協議談起:
在發放私人密鑰之前,仲裁方隨機選取一個模數n,n爲兩個大素數之積。實際中,n應至少爲 512 位長,儘量接近 1024 位。n值可在一組證明者之間共享。
證明者P的公私鑰生成方法如下:
公鑰v與私鑰s間滿足的關係是什麼,你能看出來嗎?
身份鑑別協議如下:
簡要分析:
完整版本的Feige-Fiat-Shamir 零知識身份識別協議如下:
簡要分析:
現在證明者P有k個公私密鑰對(向量),公鑰組(v1,v2,…vk)與與其對應的私鑰組(s1,s2,…sk)。簡化版本其實是k=1的情況。這樣P欺騙V一次的概率爲1/2k,欺騙t次的概率爲1/2kt 。