VRF--Python實現

VRF00—Python實現 

WX20190319-165339@2x.png

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

整個體系涉及如下7個函數:

1RSAFDHVRF_prove(K,alpha)

2MGF1(mgfSeed,maskLen)

3OS2IP(x)I2OSP(x)

4RSASP1(K,m)

5RSAFDHVRF_proof2hash(pi)

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

7RSAVP1((n, e), s)


  •         RSAFDHVRF_prove(K,alpha)

        可以看到函數的定義 

WX20190319-165425@2x.png


        輸入:密鑰和待簽名的消息。注意,密鑰在代碼中的表現形式通常是類或對象,而不是字符串,那麼該對象中哪些具體的屬性參與計算呢,稍後介紹。 

WX20190319-165525@2x.png


  •         MGF1(mgfSeed,maskLen)

WX20190319-165553@2x.png

 WX20190319-165657@2x.png

Hash默認算法是SHA1


  •         OS2IP(x)I2OSP(x)

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

WX20190319-165745@2x.png

  •         RSASP1(K,m) 


WX20190319-165846@2x.png

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

WX20190319-165922@2x.png


  •         RSAFDHVRF_proof2hash(pi) 

WX20190319-165945@2x.png


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

WX20190319-170019@2x.png


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

        基本和prove就是個逆運算

WX20190319-170104@2x.png


  •         RSAVP1((n, e), s) 

WX20190319-170215@2x.png

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


        以上就是RSAVRF最簡版實現,完整代碼如下:

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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章