文章来源区块链技术公众号“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代码:

  def mgf1(mgf_seed, mask_len, hash_type="SHA256"):        '''        Mask Generation Function based on a hash function as defined in Section B.2.1 of [RFC8017]        @Input:            mgs_seed - seed from which mask is generated, an octet string            mask_len - intended length in octets of the mask, at most 2^32 hLen            hash_type - the digest hash function to use, default is SHA1        Outout:            mask: an octet string of length mask_len        '''        hash_class = hashlib.new(hash_type)        # get hash length given hash function        h_len = hash_class.digest_size

        # If maskLen > 2^32 hLen, output "mask too long" and stop.        if mask_len > 0x10000:            raise ValueError('mask too long')

        # Let T be the empty octet string.        T = b''        hash_class.update(mgf_seed.encode(encoding='UTF-8'))

        # For counter i from 0 to \ceil (mask_len / h_len) - 1        for i in range(0, integer_ceil(mask_len, h_len)):            # Convert counter to an octet string C of length 4 octets            C = RSA_FDH_VRF.i2osp(i, 4)

            # Concatenate the hash of the seed mgfSeed and C to the octet string T            # 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()])

        # Output the leading maskLen octets of T as the octet string mask.        return T[:mask_len]

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

证明生成过程

方法: RSAFDHVRF_prove(K, alpha_string)
参数:
K - RSA 私钥 alpha_string - 原始消息 返回值: pi_string - 长度为k的证明字符串

执行主要过程:

  1. one_string = 0x01 = I2OSP(1, 1)

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

  3. m = OS2IP(EM)

  4. s = RSASP1(K, m)

  5. pi_string = I2OSP(s, k)

  6. 返回 pi_string

证明验证过程

方法: RSAFDHVRF_verify((n, e), alpha_string, pi_string)
参数:
(n, e) - RSA 公钥
alpha_string - 原始消息
pi_string - 证明字符串 输出:
合法如果验证通过

执行主要过程:

  1. s = OS2IP(pi_string)

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

  3. EM = I2OSP(m, k - 1)

  4. one_string = 0x01 = I2OSP(1, 1)

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

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

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

小结

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

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

最近(其实一直都有)有朋友说我数学不好,看起来困难,所以不能坚持看下去,对此我只能说:
春种秋收,播种和收获不在同一个季节

我们很小的时候,什么都不会,各方面都不好,现在不也会了很多吗? 靠的就是不断的学习,或者说,能否保持持续的学习状态,是一个人后天发展程度一个重要因素。
想要怯懦退缩,理由有千万个,想要前进,方法却少的可怜,可能只有一两个, 这是严重不对称的!

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

欢迎关注&在看, 疑问请留言!
欢迎关注公众号blocksight

相关阅读:

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

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

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

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

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

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

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

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

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

  1. secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案

    本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性. ## 写在前面 上一节说了[从凭证角度详细说明了Miller Rabin算法思路和实现](https://learnblockchain. ...

  2. 初中数学四十二个几何模型_【初中数学】一题贯穿初中几何

    一题贯穿初中几何 重要说明 本题是常州于新华(于特)供题,中国数学教育名师讲堂众大师巧解,扬州段广猛老师整理. 典例 (第二十五届"五羊杯"卷第19题)如图,△ABC中,∠C=90 ...

  3. 区块链中的数学 - EdDSA签名机制

    Ed25519 使用了扭曲爱德华曲线,签名过程和之前介绍过的 Schnorr,secp256k1, sm2 都不一样,最大的区别在于没有使用随机数,这样产生的签名结果是确定性的,即每次对同一消息签名结 ...

  4. secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理

    本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理 ## 写在前面 上一节讲了[Schnorr离散对数签名及素数阶群构造(Schnorr群)](https://learnblo ...

  5. 初中数学四十二个几何模型_模型 | 一文搞定初中数学9大重要几何模型(优选)...

    文章来源:王通博初中数学,ID:wtbmaths近日小初QQ群更新的部分内容如下2020年中考数学真题分类汇编版本1(58讲Word)2020年中考数学真题分类汇编版本2(21讲Word)2020年全 ...

  6. 初中数学四十二个几何模型_小学的行程问题和几何模型,如何为初中数学打基础...

    酬勤使命:唤醒孩子对数学的热爱 酬勤数学:专注数学 12 年! 小升初虽然开始摇号了但思维数学的思想和内容仍会贯穿孩子从小学到高中的整个学习生涯.其中行程问题和几何模型又是其中的重点和难点.如果能够熟 ...

  7. C语言KDF密钥源代码,区块链中的数学-SM2算法与KDF密钥导出函数

    本节讲了SM2算法的KDF函数,从一般用途到SM2特定实现 ## 写在前面 上一节说了[sm2概述和加密过程](https://learnblockchain.cn/article/1516)实现, ...

  8. 初中数学四十二个几何模型_陪伴成长的初中数学几何模型大全

    陪伴成长的初中数学几何模型大全 几何是初中数学中非常重要的内容,一般会在压轴题中进行考察,而掌握几何模型能够为考试节省不少时间,作者整理了常用的各大模型,孩子们一定要认真掌握哦!从教快20年了,多年的 ...

  9. 初中数学四十二个几何模型_初中数学常用几何模型及构造方法大全

    授人以鱼 不如授人以渔 几何是初中数学中非常重要的内容,一般会在压轴题中进行考察,而掌握几何模型能够为解题提供更多思路和方向. 全等变换 平移:平行等线段(平行四边形) 对称:角平分线或垂直或半角 旋 ...

最新文章

  1. Windows客户端C/C++编程规范“建议”——风格
  2. mockjs针对value生成随机数值(随机字符串,数值,日期,url,图片地址,email,ip等)
  3. 002——php字符串中的处理函数(一)
  4. python scrapy框架基如何实现多线程_Python多线程爬图Scrapy框架爬图
  5. Spring配置补充
  6. mysql中的函数与存储过程
  7. 关于华为pad(鸿蒙系统)连接wedo 2.0 集线器问题
  8. 团队管理8--管理工作框架及技能图谱
  9. mac环境下搭建frida环境并连接网易mumu模拟器
  10. Java动态导出word文档内容及图片
  11. tcp 粘包 丢包 解决方案
  12. iOS-图片轮播-SDCycleSCrollView的使用
  13. js可以打开mat文件吗_企业微信最大可以传多大文件?企业微信发送文件有限制吗?...
  14. VsCode Rainbow fart 蔡徐坤语音包使用教程(超详细)
  15. 六、cocos2dx-效果(Effect)
  16. 麦子学院自动化测试-selenium视频教程
  17. 旅行:拉萨“艳遇墙”:最容易发生艳遇的地方!
  18. 头脑风暴会的10项原则
  19. 招投标的具体流程是什么?
  20. 兄弟Brother MFC-8520DN 驱动

热门文章

  1. 电动儿童游乐设施的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. Excel获取文件夹所有文件或图片名称 快速搞定你的数据源
  3. 使用界面配置静态路由(保姆级教程)
  4. 华为OJ(密码强度等级)
  5. 华为OJ训练之0034-170112-密码强度等级
  6. css border-style 浏览器显示问题
  7. 微信小程序的本地存储、页面跳转、以及请求封装
  8. (转)非全屏Activity实现,以及触摸消息的处理
  9. java jqgrid_jqgrid 前后端交互实例
  10. Abaqus超单元法(子结构法)在多学科优化中的应用