臨沂做網(wǎng)站的公司哪里有武漢網(wǎng)絡(luò)推廣網(wǎng)絡(luò)營銷
??本篇主要介紹可驗證隨機函數(shù)的定義及其在區(qū)塊鏈上的作用。
1 可驗證隨機函數(shù)
1.1 定義
??可驗證隨機函數(shù)(Verifiable Random Function,VRF)本質(zhì)上還是一類具有驗證功能的偽隨機函數(shù)。對于一個特定的輸入 m m m以及輸入者的私鑰 S K SK SK,VRF會輸出一個隨機數(shù) r e s u l t result result以及一個證明 p r o o f proof proof,驗證者可以通過輸出的隨機數(shù)、證明和輸入這三部分驗證出隨機數(shù)是否由該輸入產(chǎn)生。在這個過程中,不必暴露輸入者的私鑰。其原理如下圖(出自參考資料1):
1.2 VRF在區(qū)塊鏈中的作用
??區(qū)塊鏈中,VRF主要應(yīng)用在共識機制的設(shè)計中。在共識算法中,利用VRF產(chǎn)生的不可預(yù)測的隨機性輸出來的選擇出塊節(jié)點,可以防止惡意節(jié)點或攻擊者預(yù)測下一次的結(jié)果,提高區(qū)塊鏈系統(tǒng)的安全性和抗攻擊性。
2 具體實現(xiàn)
2.1 一般實現(xiàn)
??可驗證隨機函數(shù)算法的一個簡單實現(xiàn)方式是使用RSA數(shù)字簽名算法和哈希函數(shù)來保證算法的可驗證性和唯一性。VRF算法過程如下:
- 用戶計算 r e s u l t = result= result=VRF_Hash ( S K , m ) (SK,m) (SK,m),得到隨機數(shù) r e s u l t result result;
- 用戶計算 p r o o f = proof= proof=VRF_Proof ( S K , m ) (SK,m) (SK,m),得到證明 p r o o f proof proof;
- 用戶將計算得到的隨機數(shù) r e s u l t result result、證明 p r o o f proof proof、公鑰 P K PK PK、消息 m m m發(fā)送給驗證者;
- 驗證者計算 r e s = res= res=VRF_P2H ( p r o o f ) (proof) (proof),對比 r e s res res和 r e s u l t result result是否一致。若一致,則進(jìn)行下一步,否則返回給用戶 f a l s e false false;
- 驗證者使用公鑰執(zhí)行VRF_Verify ( P K , m , p r o o f ) (PK,m,proof) (PK,m,proof)函數(shù),檢驗證明是否基于原始消息產(chǎn)生,結(jié)果為 t r u e true true或 f a l s e false false;
2.2 RSA算法實現(xiàn)
??一般地,可以使用RSA來實現(xiàn)VRF。首先使用RSA數(shù)字簽名算法對消息進(jìn)行簽名,然后使用哈希函數(shù)計算數(shù)字簽名哈希值。這樣通過RSA保證對于不同的消息可以得到不同的數(shù)字簽名,進(jìn)而得到不同的隨機數(shù),另外RSA驗證算法可以對簽名進(jìn)行校驗,進(jìn)而判斷隨機數(shù)的合法性。具體實現(xiàn)代碼如下:
import hashlib
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256def key_generate():# 生成RSA密鑰對key = RSA.generate(2048)private_key = key.export_key()public_key = key.publickey().export_key()return private_key,public_keydef VRF_proof(m,private_key):#生成簽名private_key = RSA.import_key(private_key)signer = PKCS1_v1_5.new(private_key)signature = signer.sign(SHA256.new(m)) #證明#生成隨機數(shù)hash_value=hashlib.sha256(signature).digest() value=int.from_bytes(hash_value,byteorder='big') #隨機數(shù)return signature,hash_value,valuedef VRF_Verify(hash_value,signature,public_key,m):public_key = RSA.import_key(public_key)verifier = PKCS1_v1_5.new(public_key)verified = verifier.verify(SHA256.new(m), signature)label=(hash_value==hashlib.sha256(signature).digest())if label and verified:return Trueelse:return Falseif __name__=="__main__":message="hello,world".encode('utf-8')SK,PK=key_generate()#生成證明和隨機數(shù)signature,hash_value,value=VRF_proof(message,SK)#驗證過程result=VRF_Verify(hash_value,signature,PK,message)if result:print("驗證通過")print("生成的隨機數(shù)為:{}".format(value))
其結(jié)果如下:
驗證通過
生成的隨機數(shù)為:77876531940376032378317377175633191069877154593624050739618917512592264308996
參考資料
- 《基于可驗證隨機函數(shù)的Hyperledger Fabric共識機制優(yōu)化方案》