隱私是用戶最關(guān)心的問題之一,也是 PPIO 研究的重點。區(qū)塊鏈世界涉及隱私保護的技術(shù)很多,前不久 PPIO Code Talks 的李星老師 給我們分享的“零知識證明 zk-SNARKs”技術(shù) 就是 隱私保護的典型代表,今天我們再來分析一下另一個用于隱私保護的技術(shù)——環(huán)簽名 Ring Signature。
零知識證明解決的問題是,我有一個秘密,我需要向你證明我知道這個秘密,但是我又不能讓你知道這個秘密。而環(huán)簽名解決的問題是,我對你說了一句話,但是你只知道是某一群人中有人對你說了這句話,而不知道這群人里具體哪個人說的。簡言之就是,我把自己藏進了人群里。環(huán)簽名通過將實際簽名者的公鑰藏進一個公鑰集合,來達到保護簽名者身份的目的。
環(huán)簽名(Ring Signature)方案由 Rivest,Shamir 和 Tauman 三位密碼學(xué)家 于2001年首次提出。環(huán)簽名也被稱為 CryptoNote,由群簽名演化而來,典型的應(yīng)用案例是門羅幣。群簽名是利用公開的群公鑰和群簽名進行驗證的方案,其中群公鑰是公開的,群成員可以生成群簽名,驗證者能利用群公鑰驗證所得群簽名的正確性,但不能確定群中的正式簽名者。可是群管理員可以撤銷簽名,揭露真正的簽名者群簽名,這是群簽名的關(guān)鍵問題所在。
環(huán)簽名方案則去掉了群組管理員,不需要環(huán)成員之間的合作,簽名者利用自己的私鑰和集合中其他成員的公鑰就能獨立的進行簽名,集合中的其他成員可能不知道自己被包含在了其中。這種方案的優(yōu)勢除了能夠?qū)灻哌M行無條件的匿名外,環(huán)中的其他成員也不能偽造真實簽名者簽名。外部攻擊者即使在獲得某個有效環(huán)簽名的基礎(chǔ)上,也不能偽造一個簽名。
那么環(huán)簽名是如何做到這點的呢?接下來我們用橢圓曲線來舉例說明環(huán)簽名的具體技術(shù)關(guān)鍵點和原理。
環(huán)簽名生成過程
假設(shè)簽名者擁有某私鑰 sk 和公鑰 pk(為表述方便,下文中所有粗體表示橢圓曲線上的點),其中 pk = sk·g,這里 g 是 橢圓曲線上的 基點(base point),也被稱為生成元(generator)。而 “·” 這里是倍乘,sk·g 表示 sk 個 g 點在橢圓曲線上進行加法運算。更多關(guān)于橢圓曲線密碼學(xué)相關(guān)的知識,可以參見 PPIO 的另一篇文章《橢圓曲線密碼學(xué)》。
· 首先,先定義一個 hash 函數(shù),這個 hash 函數(shù)的輸入是 待簽名的消息 m 和 橢圓曲線上的一個點 A,即 Hash(m, A)。該 hash 函數(shù)和橢圓曲線一樣,是這個簽名和驗簽體系的前提。
該 hash 函數(shù)的一個參考實現(xiàn)為:將 m 和 A 的字節(jié)數(shù)據(jù)拼接,然后用傳統(tǒng)的 hash 函數(shù)(如keccak256),得到的值再對 N 取模(這里的 N 是橢圓曲線上有限群的階)。
· 接下來 ,簽名方想對一消息 m 進行簽名,但是又不想在公開簽名的同時,讓別人知道自己的確切身份,因此 簽名方 決定用環(huán)簽名的方式將自己藏到一群人中。于是 簽名方 找來 n-1 個其他人的公鑰(這些公鑰最好之前在系統(tǒng)中已經(jīng)出現(xiàn)過和使用過,不然 簽名方 藏在一堆新人中,還是會很容易的被識別出來),并編好序號,并將自己的公鑰隨機地插入其中,共同組合了一個包含 n 個公鑰的集合。不妨假設(shè)這 n 個公鑰為
pk0, pk1, pk2, …, pki-1, pki, pki+1, …, pkn-1
其中 pki 為簽名方的公鑰。
· 然后,簽名方隨機生成 n-1 個隨機數(shù) s0, s1, …, si-1, si+1, …, sn-1, 分別與除 pki 以外的 n-1 個公鑰一一對應(yīng)。
注意:這一步無需隨機生成 si,因為 si 會在后面通過計算得到。
· 接著,簽名方隨機生成 k, 并計算 k·g, 這里我們先假設(shè)
k·g = si·g+ci·pki (等式①)
這里 等式① 的用途暫時可能不太好理解,但可先不用管。但根據(jù) 等式① 我們可以確定的是,如果擁有 pki 的私鑰 ski,且如果已知 ci 和 k,那就可以反向求出 si。
注意:這里的 ci 是根據(jù)上一個公鑰 pki-1 和消息 m 計算出的 hash 值
· 接下來引入第2個式子,
cx = Hash(m, sx-1·g+cx-1·pkx-1) (等式②)
等式② 是一個遞推式,且 Hash 函數(shù)的第二個參數(shù)形式上跟 等式① 的右側(cè)是一樣的。這個遞推式的意思是:已知第 x-1 個公鑰對應(yīng)的 sx-1 和 hash 值 cx-1,求下一個公鑰對應(yīng)的 hash 值 cx。注意,當(dāng) x=0 時,x 的上一個其實是 n-1,因為下標(biāo)也要對 n 取模。
· 由于在 等式① 中我們定義了 k·g = si·g+ci·pki 所以 ci+1 可直接由計算得到
ci+1 = Hash(m, si·g+ci·pki) = Hash(m, k·g)
注意:此時求 ci+1 過程中我們暫時并不知道 si 和 ci,但后面計算得到 ci 后,可以由 k, ci+1 和 ci 求出 si。
緊接著,依次計算 ci+2, … , cn-1, c0, …, ci-1, ci: (如圖 1)
ci+2 = Hash(m, si+1·g+ci+1·pki+1)
。..
cn-1 = Hash(m, sn-2·g+cn-2·pkn-2)
c0 = Hash(m, sn-1·g+cn-1·pkn-1)
c1 = Hash(m, s0·g+c0·pk0)
…
ci = Hash(m, si-1·g+ci-1·pki-1)
圖 1 計算 ci+1, … , cn-1, c0, …, ci-1, ci 過程
· 有了 ci之后,回頭觀察等式① ,由于 pki 的私鑰是已知的,即
pki = ski·g
因此 等式① 可寫成
k·g = si·g+ci*ski·g
兩邊約去 g,變?yōu)?/p>
k = si + ci*ski
從而根據(jù) k,ci,ski 可以求出 si (如圖 2)即
si = k - ci*ski
注意:私鑰 ski 在這里發(fā)揮了作用,如果沒有 ski,si也無法求出。
圖 2 根據(jù)私鑰 ski, k, ci求解 si 過程
· si 一旦求出后,環(huán)簽名的環(huán)就形成了。而且此時 k 值的使命也已完成,可以被拋棄掉了。
換句話說,正因為我們擁有私鑰 ski, 所以可以構(gòu)造出一個 si,配合隨機生成的s0, s1, …, si-1, si+1, …, sn-1,使得以下式子都成立:
c0 = Hash(m, sn-1·g+cn-1·pkn-1)
c1 = Hash(m, s0·g+c0·pk0)
…
cn-1 = Hash(m, sn-2·g+cn-2·pkn-2)
反之,如果這 n 個公鑰中的任何一把私鑰 簽名者都沒有,那么他也就無法求出 si 使得{c0, pk0, …。 pkn-1, s0, …。, sn-1}形成一個 環(huán)。
因此,如果上述 n 個等式成立,那么也有意味著,生成這 n 個等式的人至少擁有這 n 個公鑰中一把私鑰。
· 最后消息 m 的環(huán)簽名數(shù)據(jù)為:
Signature = {c0, pk0, …。 pkn-1, s0, …。, sn-1}
簽名驗證過程
驗證者根據(jù) c0, pk0, …。 pkn-1, s0, …。, sn-1,消息 m 和 等式② 依次求出 c1, c2, …。, cn-1, 最后根據(jù) cn-1 求出 c’0,并判斷
c0 ?= c’0
如果相等則簽名有效,如果不等則簽名無效。
應(yīng)用場景
目前,使用環(huán)簽名方案的項目包括門羅幣 Moreno、布爾幣 Boolberry、StealthCoin、XCurrency 等,以太坊平臺也增加了一個類 CryptoNote 環(huán)簽名。
門羅幣(Monero):門羅幣是應(yīng)用環(huán)簽名的典型代表,環(huán)簽名技術(shù)使得門羅被公認為是一個私密性強,不可追蹤的加密貨幣。環(huán)簽名幫助門羅幣實現(xiàn)了交易的隱私性:通過區(qū)塊鏈系統(tǒng)中無關(guān)節(jié)點無法追查交易的發(fā)送方,當(dāng)其它節(jié)點驗證交易時,只能確定簽名是諸多公鑰中的一個,卻無從定位到哪個公鑰才是具體的發(fā)送方。
一票否決場景:例如,某協(xié)會主席提出一種議案,但如果協(xié)會成員中有人提出反對意見則議案需被取消。但投反對票的會員又不想暴露自己的身份,因此他可以用環(huán)簽名的技術(shù),將自己的反對票用自己的私鑰和其他協(xié)會成員的公鑰進行簽名。簽名之后所有協(xié)會成員都可以看到協(xié)會中有人反對該項議案,但不知道確切的反對者是誰。
總結(jié)
回顧一下簽名的整個過程,關(guān)鍵的巧妙點在于,如果知道私鑰 ski,那么就可以反推出 si,使 c1, c2, …。, cn-1 形成一個環(huán)。就好像簽名者找了一根鐵絲,數(shù)學(xué)保證了只有擁有私鑰的人,才能把鐵絲的兩頭接起來,形成鐵絲環(huán)。而且一旦成為鐵絲環(huán)之后,環(huán)的接點處也沒有任何痕跡,這使得驗證者無法判斷鐵環(huán)是在哪個位置上接起來的。
環(huán)簽名雖然可以用來做到一定程度的匿名性,不過畢竟真實的簽名者還是會暴露在環(huán)中。且在目前的公有鏈?zhǔn)袌錾?,與環(huán)簽名相比,零知識證明依然是最佳的匿名方案之一。只是在某些場景下,如果對隱私的要求沒有那么高,同時簽名方的計算能力又很弱,環(huán)簽名不失為一個不錯的選擇。
責(zé)任編輯;zl
評論
查看更多