溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python實現(xiàn)VRF的方法

發(fā)布時間:2020-05-25 10:45:02 來源:億速云 閱讀:251 作者:Leah 欄目:編程語言

今天小編就為大家?guī)硪黄嘘P(guān)Python實現(xiàn)VRF的文章。小編覺得挺實用的,為此分享給大家做個參考。一起跟隨小編過來看看吧。

Python實現(xiàn)VRF的方法

        VRF基于公鑰體系,從目錄可以看出有RSAEC兩個版本,本文帶大家走一遍RSA版本的實現(xiàn),由于算法持續(xù)更新,本文采用最早的00版本進行講解,并以Python實現(xiàn)。

整個體系涉及如下7個函數(shù):

1RSAFDHVRF_prove(K,alpha)

2,MGF1(mgfSeed,maskLen)

3,OS2IP(x),I2OSP(x)

4RSASP1(K,m)

5,RSAFDHVRF_proof2hash(pi)

6,RSAFDHVRF_verify((n,e),alpha,pi)

7RSAVP1((n, e), s)


  •         RSAFDHVRF_prove(K,alpha)

        可以看到函數(shù)的定義 

Python實現(xiàn)VRF的方法


        輸入:密鑰和待簽名的消息。注意,密鑰在代碼中的表現(xiàn)形式通常是類或?qū)ο螅皇亲址?,那么該對象中哪些具體的屬性參與計算呢,稍后介紹。 

Python實現(xiàn)VRF的方法


  •         MGF1(mgfSeed,maskLen)

Python實現(xiàn)VRF的方法

 Python實現(xiàn)VRF的方法

Hash默認算法是SHA1


  •         OS2IP(x),I2OSP(x)

        這兩個函數(shù)就沒必要按照論文中定義的邏輯寫了,每個語言都有類似的系統(tǒng)自帶方法可以簡單實現(xiàn),知道它倆做什么即可。  

Python實現(xiàn)VRF的方法

  •         RSASP1(K,m) 


Python實現(xiàn)VRF的方法

        看似復(fù)雜,其實你會發(fā)現(xiàn)如果是形式a一行代碼就能實現(xiàn)。所以本文開篇提到的RSA密鑰對象,只要存儲(n,d,e)就夠了。所以這個算法需要定義alpha輸入,生成RSA密鑰,定義Hash算法,如圖: 

Python實現(xiàn)VRF的方法


  •         RSAFDHVRF_proof2hash(pi) 

Python實現(xiàn)VRF的方法


這個就比較簡單了,一行代碼足以。 

Python實現(xiàn)VRF的方法


  •         RSAFDHVRF_verify((n,e),alpha,pi)

        基本和prove就是個逆運算

Python實現(xiàn)VRF的方法


  •         RSAVP1((n, e), s) 

Python實現(xiàn)VRF的方法

        也比較簡單,你會發(fā)現(xiàn)和前面的RSAVP1類似,RSA密鑰(n,d,e)的運算都比較直接。


        以上就是RSAVRF最簡版實現(xiàn),完整代碼如下:

import math

import struct

import hashlib

import binascii

from Crypto.PublicKey import RSA



def rsasp1(K, m):

    if not (0 <= m <= K['n']-1):

        raise Exception("message representative out of range")

    return pow(m, K['d'], K['n'])


def rsavp1(K,s):

    if not (0 <= s <= K['n']-1):

        raise Exception("message representative out of range")

    return pow(s, K['e'], K['n'])    


def i2osp(x):

    try:

        return struct.pack('I',x)

    except:

        return binascii.unhexlify( len(hex(x)[2:])%2*'0' + hex(x)[2:])


def os2ip(x):

    return int(binascii.hexlify(x), 16)


def mgf1(mgf_seed, mask_len,Hash=hashlib.sha1):

    T = b''

    for i in range(math.ceil(mask_len/Hash().digest_size)):

        C = i2osp(i)

        T = T + Hash(mgf_seed.encode() + C).digest()

    return T[:mask_len]


def rsafdhvrf_prove(K, alpha):

    EM = mgf1(alpha, k-1)

    m = os2ip(EM)

    s = rsasp1(K, m)

    pi = i2osp(s)

    return pi


def rsafdhvrf_proof2hash(pi, Hash=hashlib.sha1):

    beta = Hash(pi).digest()

    return beta


def rsafdhvrf_verify(K, alpha, pi):

    s = os2ip(pi)

    m = rsavp1(K, s)

    EM = i2osp(m)

    EM_ = mgf1(alpha, k-1)

    if EM == EM_:

        return "VALID"

    else:

        return "INVALID"


alpha = 'YOUCHAIN'

k = hashlib.sha1().digest_size

rsa = RSA.generate(1024)

K = {'e':rsa.e, 'n':rsa.n, 'd':rsa.d}

pi = rsafdhvrf_prove(K, alpha)

beta = rsafdhvrf_proof2hash(pi)

result = rsafdhvrf_verify(K, alpha, pi)

print(result)


看完上述內(nèi)容,你們掌握Python實現(xiàn)VRF的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI