門羅幣隱私保護之環簽名

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\)
  • \(S\):環簽名的環,一組公鑰的集合,\(S = {P_1, P_2, ..., P_n}\),包含\(P_s\)
  • \(P_i\):公鑰,在環簽名中表示環中第\(i\)個公鑰, 當\(i = s\)時,\(P_s\)是簽名者的公鑰
  • \((x_s, P_s)\):使用者公私鑰對, 公鑰為\(P_s\), 私鑰為\(x_s\)且$ x_s \in \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選擇環S中的公鑰,如{\({P_1, P_2, ..., P_i, ..., P_n}\)},其中Bob自身的公鑰\(P_s\)也在放入環S中
  2. 生成簽名:Bob基於環S中的公鑰和自己的私鑰\(x_s\)以及待簽名訊息\(m\),生成環簽名\(\sigma\)
  3. 驗證簽名:任何人都可以基於環S,訊息m對簽名\(\sigma\)進行驗證

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

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

門羅幣之環簽名

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

image

進一步說明:

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

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

門羅幣環簽名

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

image

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

門羅幣環簽名方案

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

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

金鑰生成KeyGen

門羅幣的KeyGen演算法與一般的環簽名方案類似,目的都是生成公私鑰對\((x_s, P_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

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

門羅幣的Sign演算法如下:

  1. 初始化:
  • 隨機選取其他使用者的公鑰\(P_i\),併合並自己的公鑰\(P_s\),構成環\(S\), 如:\(\{ {P_1, P_s, ..., P_i, ..., P_n}\}\)
  • 選擇兩個隨機數集合\(Q\)\(W\),如下
    • \(Q = \{q_i\}\) , \(i = 1, 2, ..., n \quad q_i \in \mathbb{Z}_l\)
    • \(W = \{w_i\}\) , \(i = 1, 2, ..., n \quad i \neq s \quad w_i \in \mathbb{Z}_l\)
  1. 計算環簽名
    環簽名的簽名演算法,類似零知識承諾,包含:承諾-挑戰-響應等幾個步驟
  • 計算承諾,承諾由兩個集合組成\(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\), 如下:

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

驗證演算法Verify

image

區塊鏈礦工在收到交易後,會對交易進行簽名驗證。礦工已知環\(S = {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 & \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 - 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 & \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) - 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, P_s)\)的計算關係如下:

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

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

結語

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

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

參考文獻

  • 【1】CryptoNote wiki
  • 【2】Monero wiki
  • 【3】Home | Monero - secure, private, untraceable
  • 【4】Elliptic-curve cryptography
  • 【5】CryptoNote whitepaper v2.0
  • 【6】《密碼學承諾原理與應用 - 概覽》

相關文章