200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 区块链中的数学(四十二)---基于RSA的VRF(随机可验证函数)

区块链中的数学(四十二)---基于RSA的VRF(随机可验证函数)

时间:2019-08-15 21:20:21

相关推荐

区块链中的数学(四十二)---基于RSA的VRF(随机可验证函数)

文章来源区块链技术公众号“blocksight”,原文欢迎关注!

写在前面

上一节说了VRF(随机可验证函数)概述,由于VRF是与公钥密码学相结合的,自然少不了最常见的公钥密码学体制RSA和椭圆曲线EC。

本文开始讲基于RSA的VRF实现,关于RSA算法的知识如果不熟悉,可先参考文末“相关阅读”部分。

RSA-FDH-VRF

基于RSA实现的VRF记为RSA-FDH-VRF,满足可信唯一性,可信抗碰撞性和全伪随机性(trusted uniqueness", "trusted collision resistance", "full pseudorandomness"),关于些安全性要求,上一节均有所介绍。

VRF使用RSA签名,在输入alpha上计算证明P。RSA签名验证用于验证证明的正确性。VRF哈希输出R,只需使用所选哈希算法对证明P进行散列即可得到。

符号约定

(n, e) - RSA 公钥

K - RSA 私钥

k - RSA 模 n字节长度 (k < 2^32)

I2OSP - 非负整数转成字符串

OS2IP - 字符串转化为非负整数

RSASP1 - RSA 签名算法

RSAVP1 - RSA 验证签名算法

MGF1 - 掩码生成函数

这里着重说一下掩码生成函数的逻辑。

MGF1是基于散列函数的掩码生成函数,在RSA最优非对称加密填充一文中,提到的公共单向函数G其实就是掩码生成函数。这里详细讲一下其过程。

方法: MGF1 (mgfSeed, maskLen)

参数:

mgfSeed 掩码生成操作的目标字符串

maskLen 生成掩码长度,最多

可选参数:

Hash 哈希方法

输出: maskLen长度的掩码

执行过程比较清晰,参照如下Python代码:

defmgf1(mgf_seed,mask_len,hash_type="SHA256"):

'''

MaskGenerationFunctionbasedonahashfunctionasdefinedinSectionB.2.1of[RFC8017]

@Input:

mgs_seed-seedfromwhichmaskisgenerated,anoctetstring

mask_len-intendedlengthinoctetsofthemask,atmost2^32hLen

hash_type-thedigesthashfunctiontouse,defaultisSHA1

Outout:

mask:anoctetstringoflengthmask_len

'''

hash_class=hashlib.new(hash_type)

#gethashlengthgivenhashfunction

h_len=hash_class.digest_size

#IfmaskLen>2^32hLen,output"masktoolong"andstop.

ifmask_len>0x10000:

raiseValueError('masktoolong')

#LetTbetheemptyoctetstring.

T=b''

hash_class.update(mgf_seed.encode(encoding='UTF-8'))

#Forcounterifrom0to\ceil(mask_len/h_len)-1

foriinrange(0,integer_ceil(mask_len,h_len)):

#ConvertcountertoanoctetstringCoflength4octets

C=RSA_FDH_VRF.i2osp(i,4)

#ConcatenatethehashoftheseedmgfSeedandCtotheoctetstringT

#T=T||Hash(mgfSeed||C)

#temp=(mgf_seed+C.decode(encoding='UTF-8')).encode(encoding='UTF-8')

#temp=b"".join([mgf_seed.encode(encoding='UTF-8'),C])

hash_class.update(C)

#T=T+hash_class.digest()

T=b"".join([T,hash_class.digest()])

#OutputtheleadingmaskLenoctetsofTastheoctetstringmask.

returnT[:mask_len]

其中i2osp方法参考符号约定说明,不再赘述。

证明生成过程

方法: RSAFDHVRF_prove(K, alpha_string)

参数:

K - RSA 私钥 alpha_string - 原始消息 返回值: pi_string - 长度为k的证明字符串

执行主要过程:

one_string = 0x01 = I2OSP(1, 1)

EM = MGF1(one_string || I2OSP(k, 4) || I2OSP(n, k) || alpha_string, k - 1)

m = OS2IP(EM)

s = RSASP1(K, m)

pi_string = I2OSP(s, k)

返回 pi_string

证明验证过程

方法: RSAFDHVRF_verify((n, e), alpha_string, pi_string)

参数:

(n, e) - RSA 公钥

alpha_string - 原始消息

pi_string - 证明字符串 输出:

合法如果验证通过

执行主要过程:

s = OS2IP(pi_string)

m = RSAVP1((n, e), s)

EM = I2OSP(m, k - 1)

one_string = 0x01 = I2OSP(1, 1)

EM' = MGF1(one_string || I2OSP(k, 4) || I2OSP(n, k) || alpha_string, k - 1)

如果EM == EM' 则是合法证明,否则返回非法。

所用到的方法,符号约定中有所说明,具体实现各编程语言略有不同。

小结

本文主要介绍了VRF基于RSA公钥体制的实现,如果对RSA原理比较熟悉,那么就比较容易理解了。其中掩码生成函数在密码学中应用较多,后续还有可能提到。

完整的具体实现代码可参照:/DreamWuGit/RSA-VRF

最近(其实一直都有)有朋友说我数学不好,看起来困难,所以不能坚持看下去,对此我只能说:

春种秋收,播种和收获不在同一个季节

我们很小的时候,什么都不会,各方面都不好,现在不也会了很多吗? 靠的就是不断的学习,或者说,能否保持持续的学习状态,是一个人后天发展程度一个重要因素。

想要怯懦退缩,理由有千万个,想要前进,方法却少的可怜,可能只有一两个, 这是严重不对称的!

好了, 之前说了有两种VRF与公钥体制实现的方式,下一篇继续说另一种基于椭圆曲线公钥体制的VRF算法!

欢迎关注&在看, 疑问请留言!

欢迎关注公众号blocksight

相关阅读:

区块链中的数学(十六) RSA签名过程!

区块链中的数学(十二) RSA加解密原理

区块链中的数学(四十一) VRF(随机可验证函数)概述

区块链中的数学(四十) 目录整理,快速发现你感兴趣的内容!

区块链中的数学(三十九) Uniwap核心算法解析-完结篇

区块链中的数学(三十八) Uniwap核心算法解析(下)

区块链中的数学(三十七) Uniwap核心算法解析(中)

区块链中的数学(三十六) Uniwap自动化做市商核心算法解析(上)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。