送出和證明是惡意安全的一般技巧
在閱讀了 Lindell 的優秀教程(https://eprint.iacr.org/2016/046.pdf)之後,我想知道以下內容。
為了使協議能夠抵禦完全惡意的安全性,似乎強制各方承諾他們的輸入,然後證明該輸入的知識(使用知識的零知識證明)是一個有用的工具。基本上,知識的零知識證明允許模擬器提取對手的輸入並根據需要偽造數據。
我的問題是關於零知識證明在現實中的用處。ZK證明是否只需要通過安全證明?
在第 43 頁,Lindell 指出解除承諾與 ZK 證明基本相同。因此,對於一個新協議,是否足以在協議的實際實現中的某個時刻解除承諾,但在我的協議的安全**證明中用 ZK 證明替換解除承諾?
不,零知識證明不僅是證明安全性的技巧:基本上所有使用零知識證明的協議都將不安全,如果零知識證明被刪除,或者如您所建議的那樣被“解除承諾”取代。
讓我用一個簡單的例子來說明這一點。假設 Alice 和 Bob 有各自的輸入 $ x $ 和 $ y $ , 哪個是 $ n $ 位字元串。還假設 Bob 想要獲得之間的漢明距離 $ x $ 和 $ y $ . 例如,Bob 可以是一個儲存指紋的伺服器,它應該只授予擁有該指紋的使用者一些訪問權限;因此,協議的目標是檢查 Alice 的指紋是否正確(在這種情況下,它將接近 $ y $ - 由於措施不完善,不一定相等),但不會洩漏 $ x $ 或者 $ y $ .
上述問題的一個簡單解決方案如下: Bob 加密每一位 $ y_1, \cdots, y_n $ 例如,使用“指數”中的 ElGamal 加密方案(即,加密 $ y_i $ 是形式 $ (g^{r}, h^rg^{y_i}) $ ),並發送這些 $ n $ 給愛麗絲的密文。現在,Alice 可以同態計算之間的漢明距離的加密 $ x $ 和 $ y $ ,使用以下事實 $ \mathsf{HD}(x,y) = \sum_{i=1}^n x_i + y_i - 2x_iy_i $ ,並將這個密文發回給 Bob,Bob 解密它並得到 $ \mathsf{HD}(x,y) $ .
現在假設 Bob 是惡意的。在這種情況下,他可以例如作弊如下:而不是加密 $ (y_1, \cdots, y_n) $ , 他加密 $ 2, 4, \cdots, 2^n $ . 不難看出,這樣做可以讓他恢復整個 $ x $ 解密最終密文時。為了防止這種攻擊,自然的解決方案是使用零知識證明。使用一般的送出和證明策略,它看起來如下:Bob 承諾 $ y_1, \cdots, y_n $ ,在零知識中證明每個承諾都承諾與在相應的 ElGamal 密文中加密的相同的值,並在零知識中證明每個承諾的值是一個位(即,每個 $ y_i $ 滿足 $ y_i(1-y_i) = 0 $ )。這保證了 Bob 無法執行我提到的攻擊。在證明中,這將允許模擬器確實提取 $ y_i $ ,但也保證它們是位,並且是在密文中加密的值。
現在,如果我們只是公開承諾,所有的安全都會崩潰。具體來說,鮑勃要麼承諾正確 $ y_i $ ; 但隨後,在解除承諾時,他透露了他所有的私人輸入 $ y $ 給愛麗絲。或者 Bob 送出了錯誤的值;但是,Alice 無法僅通過查看這些不正確值的打開來檢查有關加密值的任何內容。