YOUChain Research YOUChain 研究團隊,成員畢業於國內外頂級名校,有長期的工業界經驗。咱們持續跟蹤的區塊鏈學界和業界的前沿發展,致力於深刻區塊鏈本質,推進學術和技術發展。團隊誠邀加密、算法、區塊鏈、工程人才加入!html
本文來自 Darlzan@YOUChainResarchgit
隨着Algorand項目的發起,原來越多的人對其所應用到的密碼學抽籤技術產生了興趣並探索相關的應用。目前,隨着Algorand項目的主網上線,該技術也開始了接受大規模的正式實踐檢驗,咱們拭目以待。算法
目前雖然國內已經有大量文章對VRF技術進行了一些介紹,可是目前看都不夠全面深刻。所以咱們「YOUChainResarch」打算從新梳理,但願能儘量全面地介紹該技術,做爲咱們「Algorand 技術解析系列」系列文章的開篇,與你們分享及交流探討。安全
1.1 簡介微信
VRF全稱爲 Verifiable Random Functions,翻譯爲「可驗證隨機函數」,由Silvio Micali,Michael Rabiny,Salil Vadhan於1999年提出,是一種基於公私鑰的密碼學哈希函數。(關注過Algorand的人一眼就能夠看出來,第一做者正是Algorand創始人Silvio Micali)。只有擁有VRF私鑰才能計算哈希,但任何擁有對應公鑰的人均可以驗證該哈希的正確性。網絡
VRF的一個關鍵應用就是,提供對存儲在基於散列的數據結構中的數據的隱私保護,防止離線枚舉(例如字典攻擊)。在這種應用中,證實人持有VRF私鑰,並使用VRF哈希在輸入數據上構造基於散列的數據結構。因爲VRF的性質,只有證實人才能回答關於數據結構中是否存儲了某些數據的查詢。任何知道VRF公鑰的人均可以驗證證實人正確地回答了查詢。可是,不能對數據結構中存儲的數據進行脫機推斷(即不查詢驗證器的推斷)。數據結構
簡單來講,可驗證隨機函數能夠基於私鑰 對一個輸入,產生一個惟一的固定長度的輸出,以及一個對應的證實。其餘人在知道了公鑰、輸出、證實 以後就必定能驗證這三者的正確性,而且也只有在知道了這三者以後才能驗證其正確性。dom
上面說起的這個過程以及相關的數據,是符合若干安全特性的,接下來會具體描述。分佈式
在VRF論文發出來後,到目前已有不一樣的團隊(我的、組織、機構)作出了不一樣的實現。而IETF(Internet Engineering Task Force)目前正在爲VRF的實現制定標準,目前還處於草案階段,並於 2019-2-8已發佈第四版草案。連接見文後參考部分。函數
1.2 基本算法表述
從一個概要邏輯來講,VRF總共涉及到幾個相關函數,聯合起來完成一個證實和驗證的閉環。
首先簡單定義一下標識符:
SK:VRF的私鑰
PK:VRF的公鑰
alpha: VRF的輸入,將對其進行哈希
beta: VRF哈希輸出
pi: VRF證實
Prover: 持有VRF公私鑰的人就能夠稱爲證實人
Verifier: 只持有VRF公鑰的人,能夠稱爲驗證人
VRF的基本算法,是很簡單清晰的,以下:
1. 前提是有一個,來生成VRF須要用到的公私鑰對;
2. 證實人計算輸入的哈希:; > 注意,VRF_hash算法是肯定性的,對於相同的私鑰及相同的輸入,一定生成一個相同的輸出。
3. 證實人還須要用私鑰及輸入計算一個證實:
4. 驗證人經過對應的公鑰能夠驗證結果的正確性:
實際實現中,上面2和3能夠放在一塊兒,獲得如 這樣的函數。
1.3 所需知足的安全特性
基於上一節的內容,還不能理解VRF的本質。若是不考慮相關的安全特性,那上面的實現是沒有意義的。那麼,VRF須要知足哪些安全特性呢?
總結起來,主要包括3種安全特性:惟1、防碰撞、僞隨機。另外,對於IETF的實現標準,即便在祕鑰對生成不夠可信的狀況下,也能夠保持「不可預測性」。
1.3.1 徹底惟一 和 可信惟一
是指對於任意固定的VRF公鑰以及任意的輸入alpha,都存在惟一的可被證實有效的輸出beta。
(full uniqueness)指在可計算範圍內對手不可能找到一個公鑰pk,一個輸入alpha,以及兩個證實 pi1 和 pi2 使得 VRF_verify(pk,alpha,pi1) 輸出 (VALID,beta1),VRF_verify(pk,alpha,pi2) 輸出 (VALID,beta2),而 beta1不等於beta2。
一個相對弱一點的安全特性叫(trusted uniqueness),對不少應用來講這就夠了。可信惟一隻在VRF公私鑰是以一種值得信任的方式生成的狀況下,才知足惟一性,其餘就和徹底惟一同樣。換句話說,若是祕鑰對生成方式有問題或者使用了很差的隨機數,則惟一性可能沒法保證。
直白來講,就是(1)對於特定的一對公私鑰(sk,pk),任意一個alpha都一對 (beta,pi),不存在說對於某個或某些輸出沒法生成證實的狀況;(2)對於任意特定的 alpha,系統中的任何一對公私鑰(sk,pk),都能生成惟一的與其餘人不相同的 (beta,pi),不存在說對於某些輸入有些私鑰能構造有效證實但有些私鑰卻不能構造有效證實的狀況。 其中
相對弱一點是在於,對於只知足這個特性的系統來講,能夠特地構造某個公鑰 PK(它可能沒有對應的有效的私鑰),對於某個輸入alpha,能夠構造兩個或多個不一樣的證實pi,用該PK都能驗證經過。
嚴格來講,世界上沒有絕對的事,上面的表述都是基於密碼學安全的意義之上的,就是說只要機率足夠小,咱們就認爲它不會發生,好比機率小於 。
由上面表述能夠看到,一個好的祕鑰對生成算法,對VRF實現的惟一特性的保障是很重要的,這在咱們選擇某種VRF實現的時候,應該要加以考量。
1.3.2 徹底防碰撞 和 可信防碰撞
是指,對手要找到具備相同輸出的兩個不一樣的輸入alpha1和alpha2,在計算上是不可能的,即便他知道私鑰也是如此。
相對弱一點的安全特性是 ,這指的是防碰撞特性須要基於一種可信的生成公私鑰的方式。
1.3.3 徹底僞隨機 和 選擇性僞隨機
確保對手在知道輸出beta可是不知道證據pi的狀況下,beta是隨機的,不可能將其跟一個隨機值進行辨別。 更精確地說,假設公私鑰(pk,sk)是以一種可信方式生成的。僞隨機性確保了即便輸入是由對手仔細選擇的,對於計算能力有限的對手,只要他不知道私鑰,那麼輸出beta對他而言也是隨機不可分辨的。甚至在對手有意選擇多個輸入並觀察對應輸出及證實的狀況下,也是如此。 簡單舉個例子就是,分別對一組有規律的輸入 [alpha1,alpha2,...,alphan] 計算其對應的輸出[(beta1,pi1),(beta2,pi2),...,(betan,pin)],你去觀察研究這些輸出,不可能找出某種肯定的規律。
舉個例子,僞隨機特性能夠保證,你想要生成一個小於某個值的哈希(好比按16進制輸出後前面有10個0,0x0000000000...),而後但願能快速推斷出一個輸入x使其知足你的要求,這是作不到的。除了按窮舉法計算VRF哈希以外,別無捷徑。
擁有特性,則容許對手在任意時刻選擇輸入。直白但可能不夠準確地說,就是無論你何時給一個什麼樣的輸入給我,你都沒法知道我對該輸入產生的輸出哈希是大於仍是小於某個值。
是一個弱一點的安全特性,對於不少應用來講這也是足夠的。這時,對手選擇目標輸入須要獨立於VRF公鑰,而且要在他觀察到他選擇的alpha'所對應的beta'和pi'以前。直白但可能不夠準確地說,就是你知道了個人公鑰以及我曾經的一些(alpha,beta,pi)信息,而後你特地構造一個新的輸入,這時你可能能夠知道我對該輸入的VRF輸出將會大於或小於某個值,而不用等我真正告訴你結果。
須要記住,VRF的輸出beta對證實人(或任何知道了私鑰的人)來講,是不隨機的。他們只要將beta和VRF_hash(sk, alpha)的結果進行比較,就能夠輕易地將beta和一個隨機值區分出來。
同時,對於任何知道了對應pi的人,beta看起來也是不隨機的。只要檢查VRF_verify(PK, alpha, pi)是否返回 (VALID, beta),就能夠將beta跟一個隨機值區別開。
還有,若是VRF祕鑰對不是用可信方式生成的(例如,若是VRF祕鑰對使用很差的隨機數生成的),那麼beta也可能看上去不是隨機的。
1.3.4 一個 「類隨機預言機」的不可預測特性
上面提到的僞隨機性,在祕鑰是由對手特地生成的狀況下,是不知足的。例如,若是對手輸出的祕鑰是肯定地生成的(或硬編碼的而且是公開的),那麼任何人都很容易得到VRF的輸出。
然而,在一些VRF應用中,存在一種不一樣類型的不可預測性。這種特性相似於由一種(普通的,不基於祕鑰對的)密碼學哈希函數所提供的不可預測性:若是輸入具備足夠的熵(如:不可能被預測到),那麼正確的輸出也是均勻不可辨別的。
雖然關於此特性在密碼學文獻中既沒有正式的定義,也沒有證實,但在IETF中呈現的VRF實現方案中,只要公鑰是以一種可信任的方式生成的,那麼就能夠相信知足了這個特性。額外地,若是公鑰知足一些特定驗證過程,那麼即便公鑰不是可信方式生成的,ECVRF也知足此特性。
1.4 幾種實現方式概述及選擇考量
VRF都是基於非對稱加密技術來構建的,當前主流的非對稱加密技術,有RSA和橢圓曲線密碼學這兩種。這兩種技術均可以用於構建VRF實現。
具體實現就不作詳細介紹了,感興趣的仍是以參考IETF的標準爲主。
通常而言,一個基於RSA的VRF實現,能知足、
和
特性。不過,RSA方案的一個問題是,要起到足夠的安全性,則RSA的祕鑰長度須要比較長,這在不少應用場景下都不是很理想。
而目前,在非對稱加密領域,橢圓曲線加密是愈來愈被重視、愈來愈成爲主流的非對稱加密技術。所以,對於VRF的實現也應該儘可能選用基於橢圓曲線的實現方案,這種方案可簡稱爲 。
在具體實現時,能夠有不少細分方案,包括選用不一樣的橢圓曲線、選用不一樣的將消息映射到曲線上的點的算法(須要注意,橢圓曲線密碼學是基於有限域的,密碼學中所說的
是離散的、不連續的)、選用不一樣的隨機數生成算法等等。
通常而言,ECVRF能知足、
和
特性,而且,若是在接收到一個VRF公鑰時,作一些額外驗證以驗證公鑰的有效性,那麼ECVRF就能知足、
和、
特性。
1.4.1 額外討論:關於橢圓曲線的選擇
橢圓曲線是由以下形式方程式所定義的曲線:
其中,可用於密碼學用途的橢圓曲線有不少,曾幾什麼時候,最主流的曲線及相關算法都是由NIST(美國國家標準與技術研究院)選定和推薦的,稱爲NIST-P系列,好比普遍使用的 P-256 曲線。這種狀況持續到了2013年,那一年,一個叫「愛德華·斯諾登」(Edward Snowden)的牛人曝光了NSA的棱鏡計劃,其中曝光了NIST標準中一個基於橢圓雙曲線的隨機數生成器,叫 Dual_EC_DRBG,包含後門,這可使掌握該後門的NSA只根據生成器過去所產生的隨機數樣本,就能夠預測後續的隨機數輸出,這樣的隨機數,對咱們來講是僞隨機的,對NSA來講是可預測的。這個事件引發了人們對NIST的信任危機,雖然這個Dual_EC_DRBG跟NIST-P的加密算法沒有直接聯繫,人們可使用其餘的僞隨機數生成算法,可是人們發現NIST-P曲線中都存在一些來歷不明的沒有任何說明的隨機數種子,好比下面的常數(參見:Nothing-up-my-sleeve_number):
這時,一個新的曲線就閃亮登場了:Curve25519。Curve25519/Ed25519/X25519 是著名密碼學家 Daniel J.Bernstein 在 2006 年獨立設計的橢圓曲線加密/簽名/密鑰交換算法,和現有的任何橢圓曲線算法都徹底獨立。這些算法在開始的時候乏人問津,但在2013年以後一會兒變得煊赫一時,成爲絕對的主流已經是大勢所趨了。
這一方面是由於這套算法徹底開放設計,沒有任何祕密,沒有任何可疑的參數;同時,這套算法確實足夠優秀,足夠安全。此外,還有點題外話,這位Bernstein以前還曾由於將本身設計的加密算法Snuffle發佈到網上而遭到美國政府起訴,他抗爭了6年,最後仍是美國政府撤銷了指控(跟全球大環境變化也有關係),但以後他還反訴政府,直到2003年末法院駁回他的訴訟,要他在政府製造了「具體威脅」以後再來。
關於算法的安全性,Bernstein進行了全面的考察,結果見下面截圖,具體參見這裏:
目前Curve25519/Ed25519已獲得普遍應用,人們正在全面拋棄NIST,擁抱Curve25519,應用狀況可參見:ianix.com/pub/curve25… 和 ianix.com/pub/ed25519… 。
1.5 VRF與數字簽名算法方案的區別 對於剛接觸VRF的人來講,可能很容易產生一個疑問:非對稱數字簽名算法,跟VRF有什麼區別?或者說,非對稱數字簽名算法起不到VRF的做用嗎?
在非對稱加密領域,存在數字簽名算法,對於一對祕鑰 (pk,sk)來講,能夠計算消息 m 的簽名 s = SIG(sk,m),而後知道公鑰的人能夠驗證 s 是否確實是簽名者用私鑰對m的簽名:Verify(pk,m,s)。另外,經過密碼學哈希算法,也能獲得消息m的哈希值。
所以,這就跟VRF比較像了:
一、 私鑰擁有者能夠聲明本身的簽名結果s,其餘人經過公開信息(pk,m,s)能夠驗證該聲明;
二、s是不可預測的,這具備密碼學上的安全性;能夠再經過對s進行密碼學哈希,獲得一個不可預測的哈希值。
那麼爲何還須要VRF呢,直接用數字簽名的方案不行嗎? 關於此問題,主要緣由是,VRF相比於數字簽名方案,具備前面所描述的更多安全特性。對於數字簽名方案,有如下主要缺陷:
一、 簽名結果s不是惟一的!對於不少數字簽名方案,同一個私鑰對同一個消息,能夠給出不一樣的簽名。好比對於EdDSA,若是 s = SIG(sk,m),那麼 s+\ells+ℓ 也會是一個有效的簽名,其中\ellℓ 是對應橢圓曲線基點(即生成元)的階。
二、s是不可預測的,可是s不必定是僞隨機的。也就是說,s在取值範圍內的分佈可能不是均勻的。
對於上面第1點,固然存在一些特定的數字簽名實現,好比將[GMR88]中的數字簽名方案中的隨機數,使用[GMR89]中的GGM僞隨機預言機代替以後,數字簽名能夠是惟一的。可是人們沒辦法確認簽名者是否採用了這麼一種方案,所以也就是說惟一性是沒法保證的。
沒法保證惟一性的數字簽名方案,能夠認爲是一種「可驗證不可預測函數」,但不是「可驗證(僞)隨機函數」。
2.1.1 抽籤原理
基於VRF的密碼學抽籤算法用於根據每一個用戶的權重,隨機選出用戶的一個子集。整個抽籤過程當中,須要保證:
一、不存在上帝角色操縱整個抽籤;
二、每一個參與者獨立作本身的抽籤,在主動公佈本身的抽籤結果以前,其餘任何人都不可能知道該抽籤結果;
三、參與者公佈本身的抽籤結果後,系統中的其餘參與者均可以驗證該結果,參與者不須要泄漏本身的私鑰;
四、在一輪抽籤開始以前,任何參與者都不能預先計算本身的抽籤結果;
五、抽籤對全部參與者都是公平公正的;
六、防女巫攻擊。
具體作法就是,假設參與者 的權重是
,全部參與者的權重總和
,對於具體的抽籤目的,咱們設置一個指望值
,表示在全部的權重當中,但願抽出
份權重。這樣,咱們基於「伯努利試驗」的抽籤方式,按
的機率,讓每一個參與者
依據本身的權重
,作
次抽籤,這樣全部參與者就總共作了
次抽籤,抽籤結果將是
的。
接下來,須要作的就是構造這個「伯努利試驗」,這就用到了VRF。首先,要求每一個參與者都擁有一對公私鑰,而後,爲了知足前面提到的要求,還須要定義一個種子seed,以及標識抽籤階段的一些數據,好比round。其中,須要儘量讓參與者在開始某一輪抽籤的時候,才知道所用到的seed,這個根據具體的應用場景來定。
這時,就能夠基於VRF構建咱們的「伯努利試驗」了。
設 是由seed、round等組成的抽籤參數,則參與者先計算 x 的VRF哈希及證實:
這時獲得的哈希的長度是固定的,好比32字節,由VRF的安全特性,咱們知道hash是在區間
內均勻分佈的,將該哈希值變爲一個小數,即
,這時
就在區間
之間均勻分佈。
另外,已知以機率 p 作 n 次伯努利試驗,實際成功次數爲 k 次的機率,計算公式以下:
將 k=0...j 所對應的機率加起來,假設用 Sum(j) 表示,咱們找到一個j值,使其知足式子這時
就是參與者的抽籤結果了。
時表示沒抽中,
時表示抽中了
份權重。
因爲用戶的權重越大,即w越大,其抽籤次數就越多,從而基於相同的機率p,獲得 的機率也就會越大,所以,用戶被選中的機率是跟他們的權重是成比例的。另外,當
,咱們能夠想象成用戶有
個子用戶被抽中了,若是是投票,就能夠投
票。這樣一來,w個權重爲1的用戶,有j個被抽中的機率,跟1個權重爲w的用戶,有j個子用戶被抽中的機率,是同樣的。也就是說,這種抽籤是防女巫攻擊的。
2.1.2 抽籤算法
對應前面的描述,抽籤算法以下:
其中,爲用戶私鑰,
參數和
參數用於區分共識過程當中的角色與階段,一個閾值 t 用於肯定本次抽籤所指望選中的用戶數。
分別爲VRF哈希值及證實。
3.2 抽籤驗證算法
驗證過程算法描述以下:
驗證過程先驗證 是否合法有效,而後依據與抽籤相似的過程得到用戶被選中的
數(0表示根本沒被抽中),從而與用戶隨消息廣播出來的j值作比較以驗證其正確性。
根據前面的描述,咱們知道整個VRF密碼學抽籤算法,是機率性的,機率符合二項分佈。也就是說,給按期望值 t ,實際結果 k 是不固定的。在這種狀況下,密碼學抽籤怎麼應用與具體的場景,那就得具體狀況具體分析了。
在這裏,咱們先看一下如何計算抽籤結果的機率分佈。 若是總權重 W 是比較小的,從而機率 p 是比較大的,那這時直接用二項分佈公式進行計算就能夠了。
但若是 W 很大,那就要考慮別的方式了。 首先,再列一下二項分佈機率公式(爲了和Algorand保持一致,下面用 U 代替 W):
將其展開得以下式子:
因爲K是個比較小的值,當U很大時,下面的等式是能夠接受的;或者換個方式說,當U大到咱們能夠接受以下式子的時候,U就足夠大了:
另外,U足夠大時,咱們確定還能接受以下等式。其中分子轉換成常數的指數,這是根據指數函數的定義來的。
綜合起來就獲得當U很大,且指望爲t時,實際抽籤結果爲K的機率爲:
Algorand項目開創了密碼學抽籤算法在區塊鏈中的應用,主要用在兩種場景下:(1)經過抽籤得到區塊提議者;(2)經過抽籤得到區塊驗證委員會。
對於第一種場景,指望值 t 應該是比較小的,主要須要考慮的是,實際抽籤結果 k 應該以很高的機率大於0,同時k又不該該很大。Algorand給出了一個值 t = 26,這時k在1到70之間的機率爲:
對於第二種場景,就比較複雜了。除了單純抽籤機率上的考慮,還要考慮網絡中或者說
的影響,以及投票經過的閾值。
根據Algorand的分析,假設網絡中誠實用戶所佔的權重比例爲 h,委員會指望權重爲 t ,由上面的公式(1),能夠獲得最終誠實權重爲k的機率爲:
在一個存在的投票委員會中,設投票經過的閾值(比例)爲 r(也就是說票數超過 t * r 就經過),則要保證系統的
即能完成投票,須要知足下面的條件1:
條件1:#good > t * r
#good表示誠實票數
經過上面的機率公式,這個條件不知足的機率是能夠計算出來的,不知足的機率爲:
另外,考慮在,要保證系統的安全性,假設 #bad 表示不誠實的票數,那麼要保證安全性就要知足下面的條件:
條件2:
對於條件2,抽取 #good = K 而且 #bad = L 的機率以下:
條件2不知足的機率是不大好算的,實際評估時,咱們能夠先計算條件2知足的機率,公式爲:
用 1.0 減去計算結果,可獲得條件2被違背的機率。 > 固然,先計算機率大的狀況時,計算精度會下降。
上面兩個條件均不知足的機率須要極小極小,才能夠認爲不會影響系統的活性和安全性。舉個淺顯的例子就是:假設定下來 t = 100, r = 0.7, h = 0.8。那麼投票閾值就是70,可是因爲抽籤結果的機率性,那麼若是抽籤結果不足70,那就完不成投票了,若是抽籤結果大於140,那在網絡很差的狀況下是否是可能出現分歧(分叉)呢?另外,因爲整體誠實比例只有0.8,那也有可能抽籤結果中不誠實數直接就超過70,那也可能搞亂整個投票,這時,確切地說就是條件2的狀況。
綜上,理論上來講,活性和安全性都是沒法絕對保障的,可是能夠考慮一個很小的機率 F(如),當兩個條件被違背的機率均小於F時,咱們能夠認爲這樣的事件基本不會發生。
這個 F 跟 t,r,h都有必定的負相關關係,就是t,r,h中任意兩個值不變的狀況下,第三個值越大,F就越小。例如,r,h不變時,t越大,F越小。
還有一個問題,t也不是越大越好的。t很大時,雖然可使F很小,可是在一個分佈式網絡中,t越大則完成投票所須要的通訊量也就越大,因此這須要權衡考慮。
以上,就是本文分享的全部內容了。至於Algorand項目中是如何權衡相關問題的,敬請關注後續分享。
5.[GMR88] Shafi Goldwasser, Silvio Micali, and Ronald L. Rivest. A digital signature scheme secure against adaptive chosen-message attacks. SIAM Journal on Computing, 17(2):281–308, April 1988.
6.[GMR89] Shafi Goldwasser, Silvio Micali, and Charles Rack- off. The knowledge complexity of interactive proof systems. SIAM Journal on Computing, 18(1):186– 208, February 1989.
16.Algorand- Scaling Byzantine Agreements for Cryptocurrencies
受限於筆者的學識和能力,文章內容不免有紕漏之處。技術探討,請添加加微信 備註「YOUChain 技術交流」,進羣交流。
歡迎添加「有令」公衆號,瞭解項目最新進展和技術分享。