主頁
微信公眾號:密碼應用技術實戰
部落格園首頁: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)是一種數字簽名方案,允許一組使用者中的任何一個使用者為某個訊息生成簽名,而不需要透露具體是哪個使用者生成的簽名。環簽名的主要特點是它提供了簽名的匿名性和可驗證性,確保簽名者的身份在簽名過程中保持隱私。
環簽名的基本概念
- 環:環簽名的“環”指的是一組公鑰,這些公鑰代表了可能的簽名者。簽名者在生成簽名時,會選擇一個環中的公鑰作為自己的身份,但外部觀察者無法確定具體是哪個公鑰對應的使用者。
- 簽名:簽名者使用自己的私鑰和環中其他使用者的公鑰生成簽名。這個簽名可以被任何人驗證,但無法確定簽名者的身份。
- 驗證:任何人都可以使用環來驗證簽名的有效性,確保簽名確實是由環中的某個使用者生成的。
環的大小是環簽名方案的一個重要引數,環越大,簽名者的身份越難以確定,簽名的匿名性越高。但是環的大小也會影響簽名的計算和驗證效能,因此需要在匿名性和效能之間進行權衡。
環簽名構造和驗證流程
- 初始化:簽名者Bob選擇環R中的公鑰,如{\({P_1, P_2, ..., P_i, ..., P_n}\)},其中Bob自身的公鑰\(P_s\)也在放入環R中
- 生成簽名:Bob基於環R中的公鑰和自己的私鑰\(x_s\)以及待簽名訊息\(m\),生成環簽名\(\sigma\)
- 驗證簽名:任何人都可以基於環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作為收款方,能夠驗證每一筆相關交易的有效性。
進一步說明:
- Bob作為收款人,在驗證每筆交易時,Bob只需對每個輸出執行兩次橢圓曲線乘法和一次加法(即生成\(P'\)),以檢查該交易是否屬於他。
- 對於每個屬於Bob的UTXO,Bob恢復一個金鑰對\((x, P)\)並將其儲存在錢包中。
- 只有Bob可以生成地址\(P\)的私鑰\(x\),因此只有Bob能夠花費這筆收入。
值得注意的是,\((P, x)\)是一次性金鑰,當Bob花費這筆收入時,會使用該金鑰參與環簽名,之後可以丟棄。
門羅幣環簽名
門羅幣使用環簽名技術,實現了交易的不可追蹤性。門羅幣的環簽名方案基於CryptoNote協議。在CryptoNode協議中,環簽名交易模型如下:
- 加入環: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演算法如下:
-
初始化:
- 隨機選取其他使用者的公鑰\(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\)
-
計算環簽名(類似零知識承諾:承諾-挑戰-響應,可以參考之前的文章《零知識證明之承諾方案》
-
計算承諾,承諾由兩個集合組成\(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
區塊鏈礦工在收到交易後,會對交易進行簽名驗證。礦工已知\(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^{'}\)
在上述推導中,由於\(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^{'}\)
在上述推導中,由於\(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\)
由於\(L^{'} = L\)且\(R^{'} = R\),所以:
因此,簽名驗證等式成立,簽名有效。
雙花驗證Link
,金鑰映象和金鑰對之間的關係如下:
金鑰映象\(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】《零知識證明之承諾方案》