Algorand 中 VRF算法简析

VRF(Verifiable Random Functions)算法是MIT教授Micali于1999年提出的一个可验证的随机函数。针对的主要问题是,在传统的随机函数中,如果要验证就需要暴露随机函数的种子,举个简单的例子就是,一个带seed的hash函数。如果种子暴露了,那么别人就可以计算所有点上的值,而不只是你想给别人看的那一个点x。VRF就是提供了这样一个功能,在不暴露种子的情况下,提供一个可验证的随机函数。可以理解为,一个hash函数,不告诉我的种子,但是别人可以验证我的输出确实是输入x的hash。

在接下来的内容中,简单的分析,如何通过RSA来构建一个VRF的。但是不会涉及任何安全证明,只有构建过程。 [ 原文地址]

1、基本观点

  • 如何从VUF( Verifiable Unpredictable Function)构建VRF
  • 如何构建一个VUF

2、从VUF到VRF

2.1 From Unpredictability to Pseudorandomness

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)=1b(k)=1, and securitys′(k)=s(k)1/3=(poly(k)×2a′(k))s′(k)=s(k)1/3=(poly(k)×2a′(k)).

假设f(.)f(.)是一个VUF,我们可以从f(.)f(.)中构建出VRFf′(.)=<f(.),r>f′(.)=<f(.),r>。这里面,rr是一个均匀选择并被放在公钥中的随机数。f′(x)=δf′(x)=δ 中包含两个值,一个是一个vv,使得δ=<v,r>δ=<v,r>,另一个是关于f(x)=vf(x)=v的证明。 
如何证明他是随机的,并且安全参数的界再说。

2.2 Increasing the input length

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)=1b(k)=1, and security at leastmins(k)1/5,2a(k)/5/poly(k)mins(k)1/5,2a(k)/5/poly(k). 
这一步将将在2.1中的固定输入转化为任意输入。这里写图片描述 
其中,在2.1中定义的f′(x)f′(x)接受一个a′a′长度的输入,输出一个a′−1a′−1的值。 
对于任意长的输入x=(x1,x2,...,xn)x=(x1,x2,...,xn),有(y0,y1,...,yn),y0=0a′1−1(y0,y1,...,yn),y0=0a′1−1,其中有yi=f′(yi−1xi)yi=f′(yi−1xi)。最后的输出为ynyn。这里面有个问题,如果一个输入x是另一个输入y的前缀的话,那么你知道了y的情况,你就知道x的了。为了避免这种事,使用了prefix-free encodingof strings。这个东西的好处就是任何两个不同的string不会互为前缀。

如何构造一个VUF

Proposition 3 (RSA-based VUFs) 
Let a(k)≤poly(k)a(k)≤poly(k) and s(k)s(k) be any functions (both computable in time poly(k)poly(k)). Under the RSA0′s(k)−HardnessAssumptionRSA0′s(k)−HardnessAssumption, there is a VUF with input length a(k)a(k), output length b(k)=1b(k)=1, and security s′(k)=s(k)/2a(k)×poly(k)s′(k)=s(k)/2a(k)×poly(k).

由输入a-bit长的xx产生一个(k+1)(k+1)-bit的素数pxpx。

这里面用[CMS99]

中的方法。这里面有个概率函数QQ,其作用是将{0,1}a×{1,...,2k2}{0,1}a×{1,...,2k2}的输入映射到一个固定长度为(k+1)-bit的随机数上。然后pxpx就是Q(x;1),Q(x;2),...,Q(x;2k2)Q(x;1),Q(x;2),...,Q(x;2k2)中的第一个素数。这里面我们还需要一个概率函数来确定是否一个素数。这里用的是[SS77]. 
这里写图片描述

RSA生成系统

产生RSA需要的公私钥信息。 
这里写图片描述

这里写图片描述

VUF函数使用过程

这里写图片描述 
输入一个公私钥对和输入信息x∈{0,1}ax∈{0,1}a,先由x产生pxpx,然后计算v=r1/Px(mod m)v=r1/Px(mod m),

VUF验证过程

这里写图片描述 
输入一个公钥,一个点xx,一个加密后的值vv,先由x计算出pxpx,然后pxpx需要比mm大并且是一个素数。之后检查v∈Z∗mv∈Zm∗。都通过了,就是正确的。

发布了74 篇原创文章 · 获赞 127 · 访问量 91万+

猜你喜欢

转载自blog.csdn.net/AAA123524457/article/details/103004071