門羅幣隱私保護之環簽名

warm3snow發表於2024-10-22

主頁

微信公眾號:密碼應用技術實戰
部落格園首頁:https://www.cnblogs.com/informatics/
GIT地址:https://github.com/warm3snow

簡介

《門羅幣隱私保護之隱形地址》文章中,我們重點介紹了門羅幣Monero的隱形地址技術,門羅幣透過隱形地址保證了交易的不可連結性,並實現了使用者的隱私保護和監管需求。

本文將繼續介紹門羅幣的另一個核心技術——環簽名技術,Monero透過環簽名技術,實現了交易的不可追蹤性。

  • 不可連結性(Unlinkability):對於任何兩筆outgoing交易,無法證明它們是傳送給同一個人的。即對於任何兩個 outgoing 交易,無法證明它們是由同一個人收款的。
  • 不可追蹤性(Untraceability):對於每一筆incoming交易,所有可能的傳送者都是等機率的。這意味著,對於任何兩個incoming交易,無法證明它們是由同一個人傳送的。

注:incoming和outgoing交易分別表示使用者的收款和支出交易。

基礎知識

術語定義

  • \(\mathbb{Z}_l\):有限域,\(l\)是一個大素數,如:\(l = 2^{252} + 27742317777372353535851937790883648493\)
  • \(P_i\):公鑰,在環簽名中表示環中第\(i\)個公鑰, 當\(i = s\)時,\(P_s\)是簽名者的公鑰
  • \(R\):環簽名的環,一組公鑰的集合,\(R = {P_1, P_2, ..., P_n}\),包含\(P_s\)
  • \(x_s\)或者x_s:環簽名中籤名者的私鑰, 私鑰範圍在\(\mathbb{Z}_l\)
  • \(\sigma\):環簽名的簽名結果
  • \(m\):待簽名的訊息。在簽名時,通常會先對訊息進行雜湊處理。
  • \(H_s\):特性雜湊函式, 將輸入對映到\(\mathbb{Z}_l\),如:\(H_s: \{0, 1\}^* \rightarrow \mathbb{Z}_l\)
  • \(H_p\):特性雜湊函式, 將輸入對映到橢圓曲線上的點,如:\(H_p: \{0, 1\}^* \rightarrow E(\mathbb{F}_q)\)
  • \(I\):金鑰映象,在門羅幣中使用,用於防止雙花攻擊

環簽名

環簽名(Ring Signature)是一種數字簽名方案,允許一組使用者中的任何一個使用者為某個訊息生成簽名,而不需要透露具體是哪個使用者生成的簽名。環簽名的主要特點是它提供了簽名匿名性可驗證性,確保簽名者的身份在簽名過程中保持隱私。

環簽名的基本概念

  • :環簽名的“環”指的是一組公鑰,這些公鑰代表了可能的簽名者。簽名者在生成簽名時,會選擇一個環中的公鑰作為自己的身份,但外部觀察者無法確定具體是哪個公鑰對應的使用者。
  • 簽名:簽名者使用自己的私鑰和環中其他使用者的公鑰生成簽名。這個簽名可以被任何人驗證,但無法確定簽名者的身份。
  • 驗證:任何人都可以使用環來驗證簽名的有效性,確保簽名確實是由環中的某個使用者生成的。

環的大小是環簽名方案的一個重要引數,環越大,簽名者的身份越難以確定,簽名的匿名性越高。但是環的大小也會影響簽名的計算和驗證效能,因此需要在匿名性和效能之間進行權衡。

環簽名構造和驗證流程

image

  1. 初始化:簽名者Bob選擇環R中的公鑰,如{\({P_1, P_2, ..., P_i, ..., P_n}\)},其中Bob自身的公鑰\(P_s\)也在放入環R中
  2. 生成簽名:Bob基於環R中的公鑰和自己的私鑰\(x_s\)以及待簽名訊息\(m\),生成環簽名\(\sigma\)
  3. 驗證簽名:任何人都可以基於環R,訊息m對簽名\(\sigma\)進行驗證

環簽名方案涉及一個三元組\((KeyGen, Sign, Verify)\),其中:

  • \(KeyGen\):金鑰生成演算法,簽名者使用\(KeyGen\)生成公私鑰對\((P_s, x_s)\)
  • \(Sign(m, R, x_s)\):簽名演算法,簽名者使用\(Sign\)生成環簽名\(\sigma\), 其中\(m\)是訊息,\(R\)是環,\(x_s\)是簽名者的私鑰
  • \(Verify(m, R, \sigma)\):驗證演算法,任何人都可以使用\(Verify\)驗證簽名的有效性。演算法結果為布林值,\(true\)表示簽名有效,\(false\)表示簽名無效。

門羅幣之環簽名

回顧在《門羅幣隱私保護之隱形地址》介紹的交易模型,Bob作為收款方,能夠驗證每一筆相關交易的有效性。

image

進一步說明:

  • Bob作為收款人,在驗證每筆交易時,Bob只需對每個輸出執行兩次橢圓曲線乘法和一次加法(即生成\(P'\)),以檢查該交易是否屬於他。
  • 對於每個屬於Bob的UTXO,Bob恢復一個金鑰對\((x, P)\)並將其儲存在錢包中。
  • 只有Bob可以生成地址\(P\)的私鑰\(x\),因此只有Bob能夠花費這筆收入。

值得注意的是,\((P, x)\)一次性金鑰,當Bob花費這筆收入時,會使用該金鑰參與環簽名,之後可以丟棄。

門羅幣環簽名

門羅幣使用環簽名技術,實現了交易的不可追蹤性。門羅幣的環簽名方案基於CryptoNote協議。在CryptoNode協議中,環簽名交易模型如下:

image

  • 加入環:Bob從門羅幣公開賬本中隨機選擇UTXO,以及自己待花費的UTXO,放入到新建立的UTXO中,作為交易的Tx input, 所有UTXO的收款方地址{\({P_1, ..., P_s, ..., P_n}\)}構成環\(R\)
  • 生成金鑰映象:Bob使用自己的簽名私鑰\(x_s\)和公鑰\(P_s\), 生成金鑰映象\(I\),區塊鏈礦工在驗證交易時,會驗證\(I\)是否已經被使用過,以防止雙花攻擊
  • 生成簽名:Bob使用環\(R\)和自己的私鑰\(x_s\),對交易進行簽名,生成環簽名\(\sigma\)

門羅幣環簽名方案

門羅幣環簽名方案涉及一個四元組\((KeyGen, Sign, Verify, Link)\),其中:

  • \(KeyGen, Sign, Verify\)與一般的環簽名方案功能類似
  • \(Link\):區塊鏈礦工透過\(Link\)演算法驗證對應的金鑰映象\(I\)是否已經被使用過,以防止雙花攻擊

金鑰生成KeyGen

門羅幣的KeyGen演算法與一般的環簽名方案類似,目的都是生成公私鑰對\((P_s, x_s)\),其中\(P_s\)是簽名者的公鑰,\(x_s\)是簽名者的私鑰。
不同的是:

  • 門羅幣的公鑰來自於隱形地址技術,即\(P_s = H_s(aR)G + B\), 對應的私鑰\(x_s = H_s(aR) + b\)
  • 門羅幣的KeyGen演算法還會生成金鑰映象\(I\),用於防止雙花攻擊。其中, \(I = x_s \cdot H_p(P_s)\)

簽名演算法Sign

在門羅幣中,由於簽名公私鑰對\((P_s, x_s)\)是由隱形地址技術生成的,並且僅用於一次性簽名,因此門羅幣環簽名我們也稱為一次性環簽名

門羅幣的Sign演算法如下:

  1. 初始化:

    • 隨機選取其他使用者的公鑰\(P_i\),結合自己的公私鑰對\((x_s, P_s)\),構成環\(R = {P_1, P_2, ..., P_s, ..., P_n}\)
    • 選擇兩個隨機數集合\(Q\)\(W\),如下
      • \(Q = \{q_i\}\), \(i = 1, 2, ..., n \And q_i \in \mathbb{Z}_l\)
      • \(W = \{w_i\}\), \(i = 1, 2, ..., n \And i \neq s \And w_i \in \mathbb{Z}_l\)
  2. 計算環簽名(類似零知識承諾:承諾-挑戰-響應,可以參考之前的文章《零知識證明之承諾方案》

    • 計算承諾,承諾由兩個集合組成\(L\)\(R\),集合元素計算如下:

      \[L_i = \begin{cases} q_i \cdot G + w_i \cdot P_i & \text{if } i \neq s \\ q_s \cdot G & \text{if } i = s \end{cases} \]

      \[R_i = \begin{cases} q_i \cdot H_p(P_i) + w_i \cdot I & \text{if } i \neq s \\ q_s \cdot H_p(P_s) & \text{if } i = s \end{cases} \]

    • 計算挑戰(實際上是前面已有知識的雜湊值)

      \[c = H_s(m, L, R) = H_s(m, L_1, ..., L_n, R_1, ..., R_n) \]

      其中,\(m\)是待簽名的訊息,在這裡表示交易資訊(簽名除外,因為簽名還未生成)

    • 計算響應

    \[c_i = \begin{cases} w_i & \text{if } i \neq s \\ c - \sum_{i \neq s, i = 0}^{n} c_i \mod l & \text{if } i = s \end{cases} \]

    \[r_i = \begin{cases} q_i & \text{if } i \neq s \\ q_s - c_s \cdot x_s \mod l & \text{if } i = s \end{cases} \]

    \[\sigma = (I, c_1, ..., c_n, r_1, ..., r_n) \]

    其中,\(\sigma\)就是環簽名的簽名值,\(\sigma\)

驗證演算法Verify

image

區塊鏈礦工在收到交易後,會對交易進行簽名驗證。礦工已知\(R = {P_1, P_2, ..., P_n}\),以及環簽名\(\sigma = (I, c_1, ..., c_n, r_1, ..., r_n)\), 簽名驗證Verify演算法如下:

  • \(L^{'}\)\(R^{'}\)為兩個集合,\(\forall i \in [0, n]\)

\[L_i^{'} = r_i \cdot G + c_i \cdot P_i \]

\[R_i^{'} = r_i \cdot H_p(P_i) + c_i \cdot I \]

  • 簽名驗證等式

\[\sum_{i=0}^{n} c_i \stackrel{?}{=} H_s(m, L^{'}, R^{'}) \]

如果上述等式成立,則簽名有效,否則簽名無效,交易被拒絕。

正確性驗證

  • 計算\(L^{'}\)

\[L_i^{'} = r_i \cdot G + c_i \cdot P_i = \]

\[\begin{cases} q_i \cdot G + w_i \cdot P_i & \text{if } i \neq s \\ (q_s - c_s \cdot x_s) \cdot G + c_s \cdot P_s = q_s \cdot G - c_s \cdot x_s \cdot G + c_s \cdot P_s = q_s \cdot G & \text{if } i = s \end{cases} \]

\[= \begin{cases} q_i \cdot G + w_i \cdot P_i & \text{if } i \neq s \\ q_s \cdot G & \text{if } i = s \end{cases} \]

\[= L_i \]

在上述推導中,由於\(P_s = x_s \cdot G\),所以:\(-c_s \cdot x_s \cdot G + c_s \cdot P_s = -c_s \cdot P_s + c_s \cdot P_s = 0\)

  • 計算\(R^{'}\)

\[R_i^{'} = r_i \cdot H_p(P_i) + c_i \cdot I = \]

\[\begin{cases} q_i \cdot H_p(P_i) + w_i \cdot I & \text{if } i \neq s \\ (q_s - c_s \cdot x_s) \cdot H_p(P_s) + c_s \cdot I = q_s \cdot H_p(P_s) - c_s \cdot x_s \cdot H_p(P_s) + c_s \cdot I = q_s \cdot H_p(P_s) & \text{if } i = s \end{cases} \]

\[= \begin{cases} q_i \cdot H_p(P_i) + w_i \cdot I & \text{if } i \neq s \\ q_s \cdot H_p(P_s) & \text{if } i = s \end{cases} \]

\[= R_i \]

在上述推導中,由於\(I = x_s \cdot H_p(P_s)\),所以:\(-c_s \cdot x_s \cdot H_p(P_s) + c_s \cdot I = -c_s \cdot I + c_s \cdot I = 0\)

  • 計算\(\sum_{i=0}^{n} c_i\)

\[\sum_{i=0}^{n} c_i = c_1 + c_2 + ... + c_s + ... + c_n \]

\[= \sum_{i \neq s, i = 0}^{n} c_i + c_s \]

\[= \sum_{i \neq s, i = 0}^{n} w_i + (c - \sum_{i \neq s, i = 0}^{n} c_i \mod l) \]

\[= c \]

\[= H_s(m, L, R) \]

由於\(L^{'} = L\)\(R^{'} = R\),所以:

\[H_s(m, L^{'}, R^{'}) = H_s(m, L, R) = c \]

因此,簽名驗證等式成立,簽名有效。

,金鑰映象和金鑰對之間的關係如下:

\[I = x_s \cdot H_p(P_s) \]

金鑰映象\(I\)的計算方式,反映了使用者金鑰和金鑰映象之間存在一一對應關係,而使用者金鑰(x, P)基於隱形地址技術,只使用一次,且與交易繫結。
礦工會記錄所有交易的金鑰映象列表,在收到新交易時,會檢查交易中的\(I\)是否已存在於列表中,如果存在,則說明該交易的(x, P)已經被使用過,是一筆雙花交易,交易被拒絕。

結語

環簽名是門羅幣的另一個核心技術,透過環簽名技術,實現了交易的不可追蹤性。本文簡單介紹了環簽名的基本概念,並詳細介紹了門羅幣的環簽名方案,包括金鑰生成、簽名、驗證和雙花驗證等演算法。希望透過本文的介紹,讀者對隱私幣的匿名技術有更進一步的瞭解。

門羅幣隱私保護使用了多種技術,包括隱形地址、環簽名、機密交易等,這些技術共同構成了門羅幣的隱私保護體系。在接下來的文章中,我們將繼續介紹門羅幣的其他隱私保護技術。

參考文獻

  • 【1】CryptoNote wiki
  • 【2】Monero wiki
  • 【3】Home | Monero - secure, private, untraceable
  • 【4】Elliptic-curve cryptography
  • 【5】CryptoNote whitepaper v2.0
  • 【6】《零知識證明之承諾方案》

相關文章