VRF(Verifiable Random Functions)算法是MIT教授Micali于1999年提出的一个可验证的随机函数。针对的主要问题是,在传统的随机函数中,如果要验证就需要暴露随机函数的种子,举个简单的例子就是,一个带seed的hash函数。如果种子暴露了,那么别人就可以计算所有点上的值,而不只是你想给别人看的那一个点x
。VRF就是提供了这样一个功能,在不暴露种子的情况下,提供一个可验证的随机函数。可以理解为,一个hash函数,不告诉我的种子,但是别人可以验证我的输出确实是输入x
的hash。
在接下来的内容中,简单的分析,如何通过RSA来构建一个VRF的。但是不会涉及任何安全证明,只有构建过程。 [ 原文地址]
Proposition 1 (from VUF to VRF)
If there is a VUF with input length a(k) a ( k ) , output length b(k) b ( k ) , and security s(k) s ( k ) , then, for any a′(k)≤a(k) a ′ ( k ) ≤ a ( k ) , there is a VRF with input length a′(k) a ′ ( k ) , output length b(k)=1 b ( k ) = 1 , and security s′(k)=s(k)1/3=(poly(k)×2a′(k)) s ′ ( k ) = s ( k ) 1 / 3 = ( p o l y ( k ) × 2 a ′ ( k ) ) .
假设 f(.) f ( . ) 是一个VUF,我们可以从 f(.) f ( . ) 中构建出VRF f′(.)=<f(.),r> f ′ ( . ) =< f ( . ) , r > 。这里面, r r 是一个均匀选择并被放在公钥中的随机数。 f′(x)=δ f ′ ( x ) = δ 中包含两个值,一个是一个 v v ,使得 δ=<v,r> δ =< v , r > ,另一个是关于 f(x)=v f ( x ) = v 的证明。
如何证明他是随机的,并且安全参数的界再说。
Proposition 2 (increasing the input length)
If there is a VRF with input length a(k) a ( k ) , output length 1, and security s(k) s ( k ) , then there is a VRF with unrestricted input length, output length b(k)=1 b ( k ) = 1 , and security at least mins(k)1/5,2a(k)/5/poly(k) m i n s ( k ) 1 / 5 , 2 a ( k ) / 5 / p o l y ( k ) .
这一步将将在2.1中的固定输入转化为任意输入。
其中,在2.1中定义的 f′(x) f ′ ( x ) 接受一个 a′ a ′ 长度的输入,输出一个 a′−1 a ′ − 1 的值。
对于任意长的输入 x=(x1,x2,...,xn) x = ( x 1 , x 2 , . . . , x n ) ,有 (y0,y1,...,yn),y0=0a′1−1 ( y 0 , y 1 , . . . , y n ) , y 0 = 0 a ′ 1 − 1 ,其中有 yi=f′(yi−1xi) y i = f ′ ( y i − 1 x i ) 。最后的输出为 yn y n 。这里面有个问题,如果一个输入x是另一个输入y的前缀的话,那么你知道了y的情况,你就知道x的了。为了避免这种事,使用了prefix-free encodingof strings。这个东西的好处就是任何两个不同的string不会互为前缀。
Proposition 3 (RSA-based VUFs)
Let a(k)≤poly(k) a ( k ) ≤ p o l y ( k ) and s(k) s ( k ) be any functions (both computable in time poly(k) p o l y ( k ) ). Under the RSA0′s(k)−HardnessAssumption R S A 0 ′ s ( k ) − H a r d n e s s A s s u m p t i o n , there is a VUF with input length a(k) a ( k ) , output length b(k)=1 b ( k ) = 1 , and security s′(k)=s(k)/2a(k)×poly(k) s ′ ( k ) = s ( k ) / 2 a ( k ) × p o l y ( k ) .
这里面用[CMS99]
中的方法。这里面有个概率函数 Q Q ,其作用是将 {0,1}a×{1,...,2k2} { 0 , 1 } a × { 1 , . . . , 2 k 2 } 的输入映射到一个固定长度为(k+1)-bit的随机数上。然后 px p x 就是 Q(x;1),Q(x;2),...,Q(x;2k2) Q ( x ; 1 ) , Q ( x ; 2 ) , . . . , Q ( x ; 2 k 2 ) 中的第一个素数。这里面我们还需要一个概率函数来确定是否一个素数。这里用的是[SS77].
输入一个公私钥对和输入信息 x∈{0,1}a x ∈ { 0 , 1 } a ,先由x产生 px p x ,然后计算 v=r1/Px(mod m) v = r 1 / P x ( m o d m ) ,
输入一个公钥,一个点 x x ,一个加密后的值 v v ,先由x计算出 px p x ,然后 px p x 需要比 m m 大并且是一个素数。之后检查 v∈Z∗m v ∈ Z m ∗ 。都通过了,就是正确的。