密碼學承諾原理與應用 - 概覽

warm3snow發表於2024-09-23

作者:@warm3snow https://github.com/warm3snow
微信公眾號:密碼應用技術實戰
部落格園首頁:https://www.cnblogs.com/informatics/
標籤:技術分享模板

目錄
  • 簡介
  • 承諾方案原理
    • 符號定義
    • 方案定義
    • 常見承諾方案和原理
      • 雜湊承諾
      • ElGamal承諾
      • Pedersen承諾
    • 零知識證明承諾
      • Sigma承諾
        • Sigma承諾正確性證明
        • Sigma承諾隱藏性證明
        • Sigma承諾繫結性證明
        • Sigma承諾零知識性證明
        • Sigma非互動式零知識證明承諾
      • Pedersen零知識承諾
        • Pedersen零知識承諾的正確性證明
        • Pedersen零知識承諾的零知識性證明
  • 承諾方案對比
  • 總結
  • 參考文獻

簡介

承諾方案(Commitment Scheme)是一個重要的密碼學原語(cryptographic primitive), 承諾方案是一種加密協議,允許傳送者承諾一個選擇的值(或宣告),同時對接收者保持隱藏,而接收者能夠在稍後驗證所承諾的值。承諾方案通常可以分為兩個階段。

  • 承諾階段(Commitment Phase): 傳送方傳送一個承諾值給接收方,這個值是傳送方選擇的,接收方無法知道這個值的內容。
  • 開啟階段(Opening Phase): 傳送方開啟這個承諾,接收方可以驗證這個值的內容。

密碼學承諾方案在多個領域有廣泛的應用,以下是一些主要的應用場景:

  • 電子投票:在電子投票系統中,承諾方案可以確保選民在投票時能夠保密其選擇,同時在投票結束後能夠驗證其投票的有效性。
  • 拍賣:在拍賣中,承諾方案可以讓競標者在拍賣開始時提交他們的出價,而不透露具體的出價金額。拍賣結束時,所有出價可以被揭示並驗證,以確保競標者的出價是誠實的。
  • 安全多方計算:在多方計算中,參與者可以使用承諾方案來承諾他們的輸入,而不需要在計算過程中透露這些輸入。這有助於保護參與者的隱私。
  • 數字簽名:承諾方案可以用於構建數字簽名方案,確保訊息的完整性和不可否認性。
  • 區塊鏈和加密貨幣:在區塊鏈技術中,承諾方案可以用於確保交易的隱私和安全性。例如,某些隱私幣(如Zcash)使用承諾方案來隱藏交易金額和傳送者資訊。
  • 身份驗證:承諾方案可以用於身份驗證協議中,允許使用者在不透露其身份資訊的情況下證明其身份。
  • 遊戲理論:在博弈論中,承諾方案可以用於設計機制,使參與者能夠在不透露其策略的情況下進行合作或競爭。

承諾方案原理

符號定義

  • \(C\): 承諾值
  • \(m\): 明文
  • \(r\): 隨機數,需要保證每次承諾的隨機數不同
  • \(H\): 雜湊函式
  • \(||\): 字串連線
  • \([m]\): 明文\(m\)的承諾值
  • \([m;r]\): 明文\(m\)和隨機數\(r\)的承諾值
  • \(G_p\): 模素數\(p\)的階為\(q\)的迴圈群
  • \(g\): \(G_p\)的生成元
  • \(h\): \(G_p\)的生成元, 與\(g\)為獨立生成元,即g和h生成的子群相互獨立
  • \(G\): 橢圓曲線上的點,即\((G_x, G_y)\), 通常情況下\(G\)是橢圓曲線的生成元
  • \(H\): 橢圓曲線上的點,即\((H_x, H_y)\), 通常境況下\(H\)隨機選取
  • 明文\(m\)的Pedersen承諾值:\([m;r] = g^m \cdot h^r\)

方案定義

承諾方案是一個三元組, 包含\((Commit, Open, Verify)\),其中:

  • \(Commit\):傳送方的承諾演算法,通常傳送方選擇一個明文\(m\)和一個隨機數\(r\),計算承諾值\(C\)
  • \(Open\):傳送方的開啟演算法, 通常傳送方揭示明文\(m\)和隨機數\(r\)
  • \(Verify\):接收方的驗證演算法, 通常接收方驗證承諾的正確性。

承諾值有兩個屬性:

  • 隱藏性(Hiding):接收方無法知道傳送方的承諾值對應的明文。
  • 繫結性(Binding):傳送方無法在承諾值開啟之後更改明文。

注:以上兩種描述並不嚴謹

承諾方案一般涉及到兩方,傳送方和接收方。傳送方選擇一個明文\(m\)和一個隨機數\(r\),計算承諾值\(C\),併傳送\(C\)給接收方。在某個時刻,傳送方開啟承諾,揭示\(m\)\(r\)。接收方使用\(C\)和揭示的\(m\)\(r\)驗證承諾的正確性。

常見承諾方案和原理

常見的承諾方案有 雜湊承諾ElGamal承諾Pedersen承諾Sigma承諾等。雖然承諾方案的實現方式不同,但其基本原理相似。

關鍵流程如下:

image

[01] 傳送承諾:Sender選取隨機數\(r\), 並計算\(m\)的承諾值\(C\),傳送給Receiver。(這裡的隨機數\(r\)是為了保證每次承諾的值不同)
[02] 開啟承諾:Sender開啟承諾,揭示\(m\)\(r\)
[03] 驗證承諾:Receiver重新計算承諾值\(C^{'}\),並驗證\(C^{'}\)\(C\)是否相等。相等則認為承諾驗證透過,否則承諾驗證失敗。

雜湊承諾

雜湊承諾是一種簡單的承諾方案,透過雜湊函式來實現承諾。假設\(H\)是一個雜湊函式,\(m\)是明文。

雜湊承諾的構造如下:

  • 承諾階段:傳送方選擇一個明文\(m\),計算承諾值\(C = H(m)\),併傳送\(C\)給接收方。
  • 開啟階段:傳送方揭示明文\(m\)
  • 驗證階段:接收方重新計算承諾值\(C^{'} = H(m)\),並驗證\(C^{'}\)\(C\)是否相等。

雜湊承諾的隱藏性和繫結性是基於雜湊函式的性質,雜湊函式是單向函式,接收方無法從承諾值\(C\)推匯出明文\(m\)。同時,雜湊函式是抗碰撞的,傳送方無法找到兩個不同的\(m\),使得\(C = H(m)\)

雜湊承諾隱藏性較差,在明文空間有限的情況下,可能會發生碰撞; 雜湊承諾對於相同的明文\(m\),承諾值\(C\)是固定的,雖然引入隨機數\(r\)可以解決這個問題,但會破壞繫結性,因為傳送方可以在保證\(m||r\)不變的情況下,隨便更改\(m\)\(r\)的值。

ElGamal承諾

ElGamal承諾是一種基於離散對數問題的困難性假設構造的承諾方案。假設\(G_p\)是階為\(q\)的迴圈群,\(g, h\)是生成元, \(m\)是明文

ElGamal承諾的構造如下:

  • 承諾階段:傳送方選擇一個明文\(m\)和一個隨機數\(r\),計算承諾值\(C = (g^r, m \cdot h^r)\),併傳送\(C\)給接收方。
  • 開啟階段:傳送方揭示明文\(m\)和隨機數\(r\)
  • 驗證階段:接收方重新計算承諾值\(C^{'} = (g^r, m \cdot h^r)\),並驗證\(C^{'}\)\(C\)是否相等。

ElGamal承諾的隱藏性和繫結性是基於離散對數問題的困難性假設,接收方無法從承諾值\(C\)推匯出明文\(m\),傳送方無法找到兩個不同的\((r_1, m_1)\)\((r_2, m_2)\),使得\(C = (g^{r_1}, m_1 \cdot h^{r_1}) = (g^{r_2}, m_2 \cdot h^{r_2})\)

假設傳送方找到兩個不同的\((r_1, m_1)\)\((r_2, m_2)\),使得\(C = (g^{r_1}, m_1 \cdot h^{r_1}) = (g^{r_2}, m_2 \cdot h^{r_2})\),則有:

\[g^{r_1} = g^{r_2} \Rightarrow r_1 = r_2 \]

\[m_1 \cdot h^{r_1} = m_2 \cdot h^{r_2} \Rightarrow m_1 \cdot h^{r_1} = m_2 \cdot h^{r_1} \Rightarrow m_1 = m_2 \]

與假設矛盾,因此ElGamal承諾具有繫結性。

Pedersen承諾

Pedersen承諾是一種基於離散對數問題的困難性假設構造的承諾方案。假設\(G_p\)是階為\(q\)的乘法群,\(g, h\)是獨立生成元,\(m\)是明文。
Pedersen承諾的構造如下:

  • 承諾階段:傳送方選擇一個明文\(m\)和一個隨機數\(r\),計算承諾值¥C = g^m \cdot h^r\(,併傳送\)C$給接收方。
  • 開啟階段:傳送方揭示明文\(m\)和隨機數\(r\)
  • 驗證階段:接收方重新計算承諾值\(C^{'} = g^m \cdot h^r\),並驗證\(C^{'}\)\(C\)是否相等。

Pedersen承諾的隱藏性和繫結性是基於離散對數問題的困難性假設,接收方無法從承諾值\(C\)推匯出明文\(m\),傳送方無法找到兩個不同的\((r_1, m_1)\)\((r_2, m_2)\),使得\(C = g^{m_1} \cdot h^{r_1} = g^{m_2} \cdot h^{r_2}\)

假設傳送方找到兩個不同的\((r_1, m_1)\)\((r_2, m_2)\),使得\(C = g^{m_1} \cdot h^{r_1} = g^{m_2} \cdot h^{r_2}\),則有:

\[g^{m_1} \cdot h^{r_1} = g^{m_2} \cdot h^{r_2} \Rightarrow g^{m_1 - m_2} = h^{r_2 - r_1} mod p \]

由於\(g\)\(h\)是獨立生成元, 即它們生成的子群沒有重疊,這意味著\(g^{m_1 - m_2} = h^{r_2 - r_1}\)只有在\(_1 - m_2 = 0\)\(r_2 - r_1 = 0\)時才成立,即:

\[m_1 - m_2 = 0 \Rightarrow m_1 = m_2 \]

\[r_2 - r_1 = 0 \Rightarrow r_2 = r_1 \]

與假設矛盾,因此Pedersen承諾具有繫結性。

Pedersen承諾也可以基於ECC構造,假設\(G\)\(H\)是橢圓曲線上的點,\(m\)是明文,\(r\)是隨機數。

  • 承諾階段:傳送方選擇一個明文\(m\)和一個隨機數\(r\),計算承諾值\(C = mG + rH\),併傳送\(C\)給接收方。
  • 開啟階段:傳送方揭示明文\(m\)和隨機數\(r\)
  • 驗證階段:接收方重新計算承諾值\(C^{'} = mG + rH\),並驗證\(C^{'}\)\(C\)是否相等。
    隱藏性和繫結性略,與上述類似。

Pedersen承諾有一個重要的性質:同態性。即兩個Pedersen承諾的和等於明文的和的Pedersen承諾。假設\(C_1 = g^{m_1} \cdot h^{r_1}\)\(C_2 = g^{m_2} \cdot h^{r_2}\)是兩個Pedersen承諾,\(m_1, m_2\)是明文,\(r_1, r_2\)是隨機數。則有:

\[C_1 \cdot C_2 = g^{m_1} \cdot h^{r_1} \cdot g^{m_2} \cdot h^{r_2} = g^{m_1 + m_2} \cdot h^{r_1 + r_2} \]

\[commit(m_1, r_1) \cdot commit(m_2, r_2) = commit(m_1 + m_2, r_1 + r_2) \]

使用ECC構造的Pedersen承諾也具有同樣的性質。如下:

\[m_1G + r_1H + m_2G + r_2H = (m_1 + m_2)G + (r_1 + r_2)H \]

\[commit(m_1, r_1) + commit(m_2, r_2) = commit(m_1 + m_2, r_1 + r_2) \]

Pedersen承諾的同態性可以用於保證密態的加法性,即兩個密文的和等於明文的和的密文。如在門羅幣中,礦工節點透過驗證Pedersen承諾可以檢查交易UTXO的輸入和是否等於輸出和(是否憑空產生門羅幣)。

零知識證明承諾

在上一章中介紹的承諾方案中,傳送方和接收方之間的通訊是明文的,即接收方可以獲得傳送方的明文資訊。在某些情況下,傳送方希望向接收方證明自己擁有某個明文,而不透露明文的具體內容。這時,可以使用 零知識證明承諾方案。

零知識證明承諾是一種特殊的承諾方案,允許傳送方向接收方證明自己擁有某個明文,而不透露明文的具體內容。零知識證明承諾方案根據在證明階段是否互動可以分為:

  • 互動式零知識證明承諾:傳送方和接收方之間需要互動,傳送方向接收方傳送證明,接收方驗證證明。
  • 非互動式零知識證明承諾:傳送方可以在不與接收方互動的情況下生成證明,接收方可以驗證證明。

Sigma承諾

Sigma承諾是一種基於離散對數問題的困難性假設構造的零知識承諾方案。Sigma承諾的互動式證明流程如下:

image

  • [01] 傳送承諾:Sender選取隨機數\(r\),並生成承諾\(C = r.G\),傳送\(C\)給Receiver。
  • [02] 傳送挑戰:Receiver傳送一個隨機挑戰\(e\)給Sender;
  • [03] 傳送挑戰:Sender計算證明\(z = m + er\),併傳送給Receiver。(注這裡的proof是z,用於隱藏r和m)
  • [04] 承諾驗證:Receiver驗證Proof, 即驗證\(z.G == C + e.Q\)

Sigma承諾正確性證明

\[z.G = (r + e.m).G = r.G + e.m.G = C + e.Q \]

等式左邊等於等式右邊,因此按照Sigma承諾協議流程,驗證方Receiver可以正確驗證

Sigma承諾隱藏性證明

非嚴格證明,由於Receiver僅知道\(C\),根據離散對數問題的困難性假設,Receiver無法計算出\(r\)的值,保證了承諾的隱藏性。

Sigma承諾繫結性證明

假設Receiver可以找到兩個不同的\((r_1)\)\((r_2)\),使得\(C = r_1.G = r_2.G\),則有:

\[r_1.G = r_2.G \Rightarrow r_1 = r_2 \]

與假設矛盾,因此Sigma承諾具有繫結性。

Sigma承諾零知識性證明

非嚴格證明,由於Receiver僅知道\((Q, C, e, z)\),並且基於該已知資訊,無法計算出\(m\)的值,保證了承諾的零知識性

Sigma非互動式零知識證明承諾

Sigma承諾也可以使用Fiat-Shamir heuristic構造為非互動式零知識證明承諾。具體流程如下:

image

  • [01] 計算承諾:Sender選取隨機數\(r\),並生成承諾\(C = r.G\);
  • [02] 計算挑戰:Sender計算挑戰\(e = H(Q, C)\),並計算證明\(z = r + e.m\);
  • [03] 傳送(e, z):Sender傳送挑戰\(e\)和證明\(z\)給Receiver;
  • [04] 驗證:Receiver計算\(A = z.G - e.Q\),並驗證\(e == H(Q, A)\)

Sigma承諾的非互動式零知識證明承諾的正確性、隱藏性、繫結性和零知識性證明與互動式零知識證明承諾類似。需要注意的是:

  • 非互動式零知識證明承諾的安全性與雜湊函式的選擇有關,需要選擇一個安全的雜湊函式。
  • 與互動式零知識證明承諾相比,非互動式零知識證明承諾的效能更好,因為傳送方和接收方之間不需要互動。
  • 與互動式零知識證明承諾相比,非互動式零知識證明承諾傳送的資料量更小,資料量只有挑戰\(e\)和證明\(z\),不需要傳送承諾值\(C\)

Pedersen零知識承諾

Pedersen承諾也可以構造為零知識承諾方案。 下面我們直接介紹非互動式版本的Pedersen零知識承諾方案。

image

  • [01] 傳送承諾:Sender選取隨機數\(r\),並生成承諾\(C = m.G + r.H\),傳送\(C\)給Receiver。(承諾階段不變)
  • [02] 生成挑戰:Sender生成兩個隨機數\(x\)\(y\);
  • [03] 生成證明:Sender計算\(P = x.G + y.H\),並計算\(h = H(P)\),然後計算\(x^{'} = x + h.m\)\(y^{'} = y + h.r\);
  • [04] 傳送證明:Sender傳送證明\((P, x^{'}, y^{'})\)給Receiver;
  • [05] 驗證:Receiver驗證證明,計算\(h = H(P)\),並驗證\(P + h.C == x^{'}G + y^{'}H\)

Pedersen零知識承諾的隱藏性、繫結性與Pedersen承諾類似。需要注意的是:

  • Pedersen零知識承諾的安全性與雜湊函式的選擇有關,需要選擇一個安全的雜湊函式。

Pedersen零知識承諾的正確性證明

\[P + h.C = (x.G + y.H) + h.(m.G + r.H) \newline = x.G + y.H + h.m.G + h.r.H \newline = (x + h.m).G + (y + h.r).H \newline = x^{'}G + y^{'}H \]

等式左邊等於等式右邊,因此按照Pedersen零知識承諾協議流程,驗證方Receiver可以正確驗證.

Pedersen零知識承諾的零知識性證明

非嚴格證明,由於Receiver僅知道\((C, P, x^{'}, y^{'})\),並且基於該已知資訊,無法計算出\(m\)\(r\)的值,保證了承諾的零知識性。

承諾方案對比

下表對比了雜湊承諾、ElGamal承諾、Pedersen承諾和Sigma承諾的性質:

承諾方案 隱藏性 繫結性 同態性 零知識性 效能 |
雜湊承諾
ElGamal承諾 較高
Pedersen承諾 較高
Sigma承諾-互動式 一般
Sigma承諾-非互動式 較高
Pedersen零知識承諾-非互動式 較高

透過對比發現,Pedersen承諾和Sigma承諾是比較優秀的承諾方案,具有隱藏性、繫結性和同態性。Sigma承諾是一種零知識承諾方案,可以保證傳送方向接收方證明自己擁有某個明文,而不透露明文的具體內容。Pedersen承諾具有同態性,可以用於保證密文的加法性。因此,Pedersen承諾和Sigma承諾在實際應用中具有廣泛的應用。

總結

本文介紹了承諾方案的基本原理和常見的承諾方案,包括雜湊承諾、ElGamal承諾、Pedersen承諾和Sigma承諾。承諾方案是一種重要的密碼學原語,可以用於保證傳送方的承諾值對應的明文,同時隱藏明文的具體內容。承諾方案在多個領域有廣泛的應用,包括電子投票、拍賣、安全多方計算、數字簽名、區塊鏈和加密貨幣、身份驗證和遊戲理論等。透過對比發現,Pedersen承諾和Sigma承諾是比較優秀的承諾方案,具有隱藏性、繫結性和同態性。Pedersen承諾具有同態性,可以用於保證密文的加法性。Sigma承諾是一種零知識承諾方案,可以保證傳送方向接收方證明自己擁有某個明文,而不透露明文的具體內容。因此,Pedersen承諾和Sigma承諾在實際應用中具有廣泛的應用。

希望透過本文的介紹,讀者對承諾方案有一個更深入的瞭解,為實際應用提供參考。

參考文獻

  • 【1】Pedersen Commitment
  • 【2】Zero-Knowledge Proofs: An illustrated primer
  • 【3】Sigma Protocol
  • 【4】Zero Knowledge Proofs: Example with Pedersen Commitments in Monero

相關文章