本文主要介绍了VRF基于ECC公钥体制的证明生成过程, 其中涉及多个辅助方法,这些方法只是做了简要的介绍,因为详细说明每个方法会有很多内容,先搞清楚主要过程,后续有时间再细说。
上一节说了基于RSA的VRF实现,继承了RSA算法的简洁性。
本文讲基于椭圆曲线秘钥体制的VRF实现,关于椭圆曲线算法的知识如果不熟悉,可先参考文末“相关阅读”部分。
基于椭圆曲线实现的VRF记为ECVRF,满足可信唯一性,可信抗碰撞性和全伪随机性(trusted uniqueness", "trusted collision resistance", "full pseudorandomness"),关于些安全性要求,在VRF概述章节中均有所介绍。
F - 有限域
2n - 域元素字节长度,向上取整
E - F上的椭圆曲线
ptLen - 椭圆曲线点编码成字符串长度
G - E上大素数子群
q - 群G的素数阶
qLen - q的字节长度
cofactor - E曲线点数除q 即谐因子
B - G生成元
suite_string - 标识 ECVRF套件(ciphersuite),包含上述选项参数
SK - VRF私钥
x - VRF秘密整数标量(根据不同的曲线类型,有可能等于SK,也有可能从SK派生)
Y = x*B - VRF 公钥
方法1: ECVRF_prove(SK, alpha_string)
参数: SK - VRF 私钥 alpha_string - 原始消息
返回值: pi_string - 长度为k的证明字符串
执行主要过程:
使用 SK 派生出 VRF 密钥x, 计算VRF公钥 Y = x * B(依赖具体曲线实例或有不同)
计算H = ECVRF_hash_to_curve(suite_string, Y, alpha_string)
将H转化为string,g = point_to_string(H)
令Gamma = x * H
计算k = ECVRF_nonce_generation(SK, h_string)
计算c = ECVRF_hash_points(H, Gamma, kB, kH)
计算s = (k + c*x) mod q
拼接证明:pi_string = point_to_string(Gamma) || int_to_string(c, n) || int_to_string(s, qLen)
返回 pi_string
方法2: ECVRF_proof_to_hash(pi_string)
参数: pi_string -- VRF 证明结果
返回值: beta_string - VRF Proof 哈希值
执行主要过程:
还原proof结构,D = ECVRF_decode_proof(pi_string)
验证D正确性,若非法则停止
解构D: (Gamma, c, s) = D
令 three_string = 0x03 = int_to_string(3, 1)
计算哈希:beta_string = Hash(suite_string || three_string || point_to_string(cofactor * Gamma))
返回结果 beta_string
可以看到,其实核心步骤是5,来计算最终hash
下面重点说下,证明生成过程中用到的辅助方法。
ECVRF_hash_to_curve 该方法将传入的原始信息结合曲线suite参数计算哈希,并将结果哈希映射到曲线上的点, 不同的椭圆曲线有不同的实现方法。
ECVRF_nonce_generation 从SK和其他输入中派生出一个伪随机数
ECVRF_hash_points 对传入的椭圆曲线的若干点做哈希运算
point_to_string 椭圆曲线的点转成字符串,与之对应的还有下面方法。
string_to_point 字符串转成椭圆曲线的点
本文主要介绍了VRF基于ECC公钥体制的证明生成过程, 其中涉及多个辅助方法,这些方法只是做了简要的介绍,因为详细说明每个方法会有很多内容,先搞清楚主要过程,后续有时间再细说。
好了,证明有了,如何验证是否合法呢? 下一篇继续说基于椭圆曲线公钥体制的VRF证明验证过程!
欢迎关注公众号:blocksight
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!