可验证随机函数(Verifiable Random Function,VRF)是一种将输入映射为可验证的伪随机输出的加密方案。首先,VRF所得是一个随机数,其次由于包含生成者的私钥签名,验证者可以通过公钥确定随机数的合法性。VRF具有三大特性:可验证性、唯一性和随机性。
一、VRF算法主要流程
- VRF哈希:相同的输入和
s
k
sk
sk,输出相同
-
b
e
t
a
=
V
R
F
−
h
a
s
h
(
s
k
,
a
l
p
h
a
)
beta = VRF-hash(sk, alpha)
beta=VRF−hash(sk,alpha)
+VRF证明生成 - p i = V R F − p r o v e ( s k , a l p h a ) pi = VRF-prove(sk, alpha) pi=VRF−prove(sk,alpha)
-
b
e
t
a
=
V
R
F
−
h
a
s
h
(
s
k
,
a
l
p
h
a
)
beta = VRF-hash(sk, alpha)
beta=VRF−hash(sk,alpha)
- VRF证明转哈希
- b e t a = V R F − p r o o f 2 H a s h ( p i ) beta = VRF-proof_2Hash(pi) beta=VRF−proof2Hash(pi)
- 即 V R F − h a s h ( s k , a l p h a ) = = V R F − p r o o f 2 H a s h ( p i ) VRF-hash(sk, alpha) == VRF-proof_2Hash(pi) VRF−hash(sk,alpha)==VRF−proof2Hash(pi)
- VRF随机数验证
- V R F — v e r i f y ( P K , a l p h a , p i ) VRF—verify(PK, alpha, pi) VRF—verify(PK,alpha,pi)
二、基于椭圆曲线的VRF实现
2.1 公私钥生成算法
- 选择一条椭圆曲线 E p ( a , b ) E_{p}(a,b) Ep(a,b) 和基点 G G G;
- 选择私钥 d A d_{A} dA( d A < n d_{A}<n dA<n, n n n为该 G G G的阶),利用基点 G G G计算公钥 Q A = d A ⋅ G Q_{A}=d_{A} · G QA=dA⋅G;
- q q q为基点G的大素数阶
2.2 VRF证明生成算法
- 输入:公钥 Q A Q_A QA;私钥 d A d_A dA;输入 a l p h a alpha alpha
- 输出: V R F VRF VRF证明
- 步骤:
- 将输入 a l p h a alpha alpha转化为16进制数h
- 计算 g a m m a = h ∗ d A gamma=h*d_A gamma=h∗dA
- 选取随机数 k ∈ [ 0 , q − 1 ] k\in[0,q-1] k∈[0,q−1]
- 计算 c = h a s h ( G , h , Q A , g a m m a , G ∗ k , h ∗ k ) c=hash(G,h,Q_A,gamma, G*k, h*k) c=hash(G,h,QA,gamma,G∗k,h∗k)
- s = k − c ∗ s k s=k-c*sk s=k−c∗sk
- p i = { g a m m a , c , s } pi=\{gamma, c,s\} pi={gamma,c,s}
2.3 VRF随机数验证算法
- 输入:公钥 Q A Q_A QA;VRF证明 p i pi pi;VRF输入 a l p h a alpha alpha
- 输出: 1 1 1 或 0 0 0
- 步骤
- 解码 p i = { g a m m a , c , s } pi=\{gamma, c,s\} pi={gamma,c,s}
- u = Q A ∗ c + G ∗ s = d A ∗ G ∗ c + G ∗ s = s k ∗ c ∗ G + G ∗ ( k − d A ∗ c ) = k ∗ G u=Q_A *c + G * s= d_A * G * c + G * s = sk * c * G + G * (k-d_A*c) = k * G u=QA∗c+G∗s=dA∗G∗c+G∗s=sk∗c∗G+G∗(k−dA∗c)=k∗G
- h = h a s h ( Q A , a l p h a ) h=hash(Q_A, alpha) h=hash(QA,alpha)
- v = g m m a ∗ c + h ∗ s = h ∗ d A ∗ c + h ∗ ( k − d A ∗ c ) = h ∗ k v=gmma*c+h*s = h*d_A * c + h * (k-d_A*c)=h*k v=gmma∗c+h∗s=h∗dA∗c+h∗(k−dA∗c)=h∗k
- c ′ = h a s h ( G , h , Q A , g a m m a , u , v ) c'=hash(G,h,Q_A,gamma, u, v) c′=hash(G,h,QA,gamma,u,v)
- 判断等式 c ′ = c c'=c c′=c是否成立,成立输出1否则0。