可验证随机数VRF的一种实现

本文简单分析一下ietf-vrf方案的实现原理。
所谓VRF就是指给定一个消息和一个私钥,可以计算出一个唯一确定的值,这个值唯一确定且不可预测,且可以验证。
传统的签名算法不具有唯一确定的特性,私钥持有者可以计算出多个合法解。

前置技能树:需了解椭圆曲线的基本运算法则。

1. 简单的多项式:

t = ( r − s ∗ k )   m o d   p t = (r - s * k) \bmod p t=(rsk)modp
这个等式就是普通的整数运算,r,t,s,k,n均为大整数,p为常量。
k为私钥,r为随机数,二者不可泄露。

2. 椭圆曲线上的多项式

把上面的等式和椭圆曲线的基点 G G G相乘,可以得到下面的等式:
T = t ∗ G = ( r − s ∗ k ) ∗ G = r ∗ G − s ∗ k ∗ G = R − s ∗ K \begin{aligned} T &= t*G \\ &= (r - s * k)*G \\ &= r*G - s*k*G \\ &= R-s*K \end{aligned} T=tG=(rsk)G=rGskG=RsK

小写字母为整数,对应的大写字母为该整数映射到曲线上的点

当选取不同的基点 G x G_x Gx时, 等式也依然成立:
T x = t ∗ G x = ( r − s ∗ k ) ∗ G x = r ∗ G x − s ∗ k ∗ G x = R x − s ∗ K x \begin{aligned} T_x &= t*G_x \\ &= (r-s*k)*G_x \\ &= r*G_x - s*k*G_x \\ &= R_x - s*K_x \end{aligned} Tx=tGx=(rsk)Gx=rGxskGx=RxsKx

3. 多项式的实例化

随机选取两个不同的基点 G 1 G_1 G1, G 2 G_2 G2,则:

T 1 = R 1 − s ∗ K 1 T 2 = R 2 − s ∗ K 2 T_1 = R_1 - s*K_1 \\ T_2 = R_2 - s*K_2 T1=R1sK1T2=R2sK2

回到起始的多项式 t = ( r − s ∗ k )   m o d   p t = (r - s * k) \bmod p t=(rsk)modpk为私钥,r为随机数, 则只需确定s,就可以计算出t

定义哈希函数 H 2 H_2 H2,用于计算s:
s = H 2 ( G 1 , G 2 , K 1 , K 2 , R 1 , R 2 ) s=H_2(G_1,G_2,K_1,K_2,R_1,R_2) s=H2(G1,G2,K1,K2,R1,R2)
现在t的值确定了,我们构造出了一组数字,它们满足上述的多项式,而且系数之间有着苛刻的约束。

公开除了k,r之外的所有参数,则任何人都可以验证这组数字的有效性,并且其他的人几乎无法给出其他的有效解。

公开t,s, G 1 G_1 G1, G 2 G_2 G2, K 1 K_1 K1, K 2 K_2 K2即可,其余参数均可推导出。

4. 应用到VRF

回到基点 G x G_x Gx的选择,令:
G 1 = G G 2 = H 1 ( M ) G_1=G \\ G_2=H_1(M) G1=GG2=H1(M)
其中 G G G为约定好的基点,M为任意消息, H 1 H_1 H1为哈希函数,负责将M编码成曲线上的点。

对于任意消息M和私钥k,总能计算出一组数字,满足上述的多项式。
当选择不同的r时,t,s是不同的,但其余的值是固定的,比如 K 2 K_2 K2,而且 K 2 K_2 K2的值只由k,M决定,因此 K 2 K_2 K2就是VRF输出的"确定的不可预测的可验证的随机数"。

相关链接:

  • google的实现
  • Spectrum的实现
  • IETF草案

你可能感兴趣的:(区块链,椭圆曲线)