Algorand 系列一:VRF 密码学抽签原理及其在 Algorand 中的应用

YOUChain Research

YOUChain 研究团队,成员毕业于国内外顶级名校,有长期的工业界经验。我们持续跟踪的区块链学界和业界的前沿发展,致力于深入区块链本质,推动学术和技术发展。团队诚邀加密、算法、区块链、工程人才加入!

本文来自 Darlzan@YOUChainResarch

1 VRF介绍

随着Algorand项目的发起,原来越多的人对其所应用到的密码学抽签技术产生了兴趣并探索相关的应用。目前,随着Algorand项目的主网上线,该技术也开始了接受大规模的正式实践检验,我们拭目以待。

目前虽然国内已经有大量文章对VRF技术进行了一些介绍,但是目前看都不够全面深入。因此我们「YOUChainResarch」打算重新梳理,希望能尽可能全面地介绍该技术,作为我们「Algorand 技术解析系列」系列文章的开篇,与大家分享及交流探讨。

1.1 简介

VRF全称为 Verifiable Random Functions,翻译为“可验证随机函数”,由Silvio Micali,Michael Rabiny,Salil Vadhan于1999年提出,是一种基于公私钥的密码学哈希函数。(关注过Algorand的人一眼就可以看出来,第一作者正是Algorand创始人Silvio Micali)。只有拥有VRF私钥才能计算哈希,但任何拥有对应公钥的人都可以验证该哈希的正确性。

VRF的一个关键应用就是,提供对存储在基于散列的数据结构中的数据的隐私保护,防止离线枚举(例如字典攻击)。在这种应用中,证明人持有VRF私钥,并使用VRF哈希在输入数据上构造基于散列的数据结构。由于VRF的性质,只有证明人才能回答关于数据结构中是否存储了某些数据的查询。任何知道VRF公钥的人都可以验证证明人正确地回答了查询。但是,不能对数据结构中存储的数据进行脱机推断(即不查询验证器的推断)。

简单来说,可验证随机函数可以基于私钥 对一个输入,产生一个唯一的固定长度的输出,以及一个对应的证明。其他人在知道了公钥输出证明 之后就一定能验证这三者的正确性,并且也只有在知道了这三者之后才能验证其正确性。

上面提及的这个过程以及相关的数据,是符合若干安全特性的,接下来会具体描述。

在VRF论文发出来后,到目前已有不同的团队(个人、组织、机构)做出了不同的实现。而IETF(Internet Engineering Task Force)目前正在为VRF的实现制定标准,目前还处于草案阶段,并于 2019-2-8已发布第四版草案。链接见文后参考部分。

1.2 基本算法表述

从一个概要逻辑来说,VRF总共涉及到几个相关函数,联合起来完成一个证明和验证的闭环。

首先简单定义一下标识符:

  • SK:VRF的私钥
  • PK:VRF的公钥
  • alpha: VRF的输入,将对其进行哈希
  • beta: VRF哈希输出
  • pi: VRF证明
  • Prover: 持有VRF公私钥的人就可以称为证明人
  • Verifier: 只持有VRF公钥的人,可以称为验证人

VRF的基本算法,是很简单清晰的,如下:

  1. 前提是有一个秘钥对生成算法,来生成VRF需要用到的公私钥对;
  2. 证明人计算输入的哈希:beta = VRF_hash(SK,alpha);

注意,VRF_hash算法是确定性的,对于相同的私钥及相同的输入,必定生成一个相同的输出。

  1. 证明人还需要用私钥及输入计算一个证明: pi = VRF_prove(SK, alpha)
  2. 验证人通过对应的公钥可以验证结果的正确性:VRF_verify(PK, alpha, pi)

实际实现中,上面2和3可以放在一起,得到如 beta,pi = VRF(SK,alpha) 这样的函数。

1.3 所需满足的安全特性

基于上一节的内容,还不能理解VRF的本质。如果不考虑相关的安全特性,那上面的实现是没有意义的。那么,VRF需要满足哪些安全特性呢?

总结起来,主要包括3种安全特性:唯一、防碰撞、伪随机。另外,对于IETF的实现标准,即使在秘钥对生成不够可信的情况下,也可以保持“不可预测性”。

1.3.1 完全唯一 和 可信唯一

唯一是指对于任意固定的VRF公钥以及任意的输入alpha,都存在唯一的可被证明有效的输出beta。

完全唯一full uniqueness)指在可计算范围内对手不可能找到一个公钥pk,一个输入alpha,以及两个证明 pi1 和 pi2 使得 VRF_verify(pk,alpha,pi1) 输出 (VALID,beta1),VRF_verify(pk,alpha,pi2) 输出 (VALID,beta2),而 beta1不等于beta2。

一个相对弱一点的安全特性叫可信唯一trusted uniqueness),对很多应用来说这就够了。可信唯一只在VRF公私钥是以一种值得信任的方式生成的情况下,才满足唯一性,其他就和完全唯一一样。换句话说,如果秘钥对生成方式有问题或者使用了不好的随机数,则唯一性可能无法保证。

直白来说,就是(1)对于特定的一对公私钥(sk,pk),任意一个alpha都有并且只有一对 (beta,pi),不存在说对于某个或某些输出无法生成证明的情况;(2)对于任意特定的 alpha,系统中的任何一对公私钥(sk,pk),都能生成唯一的与其他人不相同的 (beta,pi),不存在说对于某些输入有些私钥能构造有效证明但有些私钥却不能构造有效证明的情况。
其中可信唯一相对弱一点是在于,对于只满足这个特性的系统来说,可以特意构造某个公钥 PK(它可能没有对应的有效的私钥),对于某个输入alpha,可以构造两个或多个不同的证明pi,用该PK都能验证通过。

严格来说,世界上没有绝对的事,上面的表述都是基于密码学安全的意义之上的,就是说只要概率足够小,我们就认为它不会发生,比如概率小于 2 − 256 2^{-256} 2256

由上面表述可以看到,一个好的秘钥对生成算法,对VRF实现的唯一特性的保障是很重要的,这在我们选择某种VRF实现的时候,应该要加以考量。

1.3.2 完全防碰撞 和 可信防碰撞

完全防碰撞是指,对手要找到具有相同输出的两个不同的输入alpha1和alpha2,在计算上是不可能的,即使他知道私钥也是如此。

相对弱一点的安全特性是 可信防碰撞,这指的是防碰撞特性需要基于一种可信的生成公私钥的方式。

1.3.3 完全伪随机 和 选择性伪随机

伪随机性确保对手在知道输出beta但是不知道证据pi的情况下,beta是随机的,不可能将其跟一个随机值进行辨别。

更精确地说,假设公私钥(pk,sk)是以一种可信方式生成的。伪随机性确保了即使输入是由对手仔细选择的,对于计算能力有限的对手,只要他不知道私钥,那么输出beta对他而言也是随机不可分辨的。甚至在对手有意选择多个输入并观察对应输出及证明的情况下,也是如此。
简单举个例子就是,分别对一组有规律的输入 [alpha1,alpha2,…,alphan] 计算其对应的输出[(beta1,pi1),(beta2,pi2),…,(betan,pin)],你去观察研究这些输出,不可能找出某种确定的规律。

举个例子,伪随机特性可以保证,你想要生成一个小于某个值的哈希(比如按16进制输出后前面有10个0,0x0000000000…),然后希望能快速推断出一个输入x使其满足你的要求,这是做不到的。除了按穷举法计算VRF哈希之外,别无捷径。

拥有完全伪随机特性,则允许对手在任意时刻选择输入。直白但可能不够准确地说,就是不管你什么时候给一个什么样的输入给我,你都无法知道我对该输入产生的输出哈希是大于还是小于某个值。

选择性伪随机是一个弱一点的安全特性,对于很多应用来说这也是足够的。这时,对手选择目标输入需要独立于VRF公钥,并且要在他观察到他选择的alpha’所对应的beta’和pi’之前。直白但可能不够准确地说,就是你知道了我的公钥以及我曾经的一些(alpha,beta,pi)信息,然后你特意构造一个新的输入,这时你可能可以知道我对该输入的VRF输出将会大于或小于某个值,而不用等我真正告诉你结果。

需要记住,VRF的输出beta对证明人(或任何知道了私钥的人)来说,是不随机的。他们只要将beta和VRF_hash(sk, alpha)的结果进行比较,就可以轻易地将beta和一个随机值区分出来。

同时,对于任何知道了对应pi的人,beta看起来也是不随机的。只要检查VRF_verify(PK, alpha, pi)是否返回 (VALID, beta),就可以将beta跟一个随机值区别开。

还有,如果VRF秘钥对不是用可信方式生成的(例如,如果VRF秘钥对使用不好的随机数生成的),那么beta也可能看上去不是随机的。

1.3.4 一个 “类随机预言机”的不可预测特性

上面提到的伪随机性,在秘钥是由对手特意生成的情况下,是不满足的。例如,如果对手输出的秘钥是确定地生成的(或硬编码的并且是公开的),那么任何人都很容易获得VRF的输出。

然而,在一些VRF应用中,存在一种不同类型的不可预测性。这种特性类似于由一种(普通的,不基于秘钥对的)密码学哈希函数所提供的不可预测性:如果输入具有足够的熵(如:不可能被预测到),那么正确的输出也是均匀不可辨别的。

虽然关于此特性在密码学文献中既没有正式的定义,也没有证明,但在IETF中呈现的VRF实现方案中,只要公钥是以一种可信任的方式生成的,那么就可以相信满足了这个特性。额外地,如果公钥满足一些特定验证过程,那么即使公钥不是可信方式生成的,ECVRF也满足此特性。

1.4 几种实现方式概述及选择考量

VRF都是基于非对称加密技术来构建的,当前主流的非对称加密技术,有RSA和椭圆曲线密码学这两种。这两种技术都可以用于构建VRF实现。

具体实现就不做详细介绍了,感兴趣的还是以参考IETF的标准为主。

一般而言,一个基于RSA的VRF实现,能满足可信唯一可信防碰撞完全伪随机特性。不过,RSA方案的一个问题是,要起到足够的安全性,则RSA的秘钥长度需要比较长,这在很多应用场景下都不是很理想。

而目前,在非对称加密领域,椭圆曲线加密是越来越被重视、越来越成为主流的非对称加密技术。因此,对于VRF的实现也应该尽量选用基于椭圆曲线的实现方案,这种方案可简称为 ECVRF

ECVRF在具体实现时,可以有很多细分方案,包括选用不同的椭圆曲线、选用不同的将消息映射到曲线上的点的算法(需要注意,椭圆曲线密码学是基于有限域的,密码学中所说的椭圆曲线上的点是离散的、不连续的)、选用不同的随机数生成算法等等。

一般而言,ECVRF能满足可信唯一可信防碰撞完全伪随机特性,并且,如果在接收到一个VRF公钥时,做一些额外验证以验证公钥的有效性,那么ECVRF就能满足完全唯一完全防碰撞特性。

1.4.1 额外讨论:关于椭圆曲线的选择

椭圆曲线是由如下形式方程式所定义的曲线:
y 2 = a x 3 + b x 2 + c x + d y^2=ax^3+bx^2+cx+d y2=ax3+bx2+cx+d

其中,可用于密码学用途的椭圆曲线有很多,曾几何时,最主流的曲线及相关算法都是由NIST(美国国家标准与技术研究院)选定和推荐的,称为NIST-P系列,比如广泛使用的 P-256 曲线。这种情况持续到了2013年,那一年,一个叫“爱德华·斯诺登”(Edward Snowden)的牛人曝光了NSA的棱镜计划,其中曝光了NIST标准中一个基于椭圆双曲线的随机数生成器,叫 Dual_EC_DRBG,包含后门,这可以使掌握该后门的NSA只根据生成器过去所产生的随机数样本,就可以预测后续的随机数输出,这样的随机数,对我们来说是伪随机的,对NSA来说是可预测的。这个事件引起了人们对NIST的信任危机,虽然这个Dual_EC_DRBGNIST-P的加密算法没有直接联系,人们可以使用其他的伪随机数生成算法,但是人们发现NIST-P曲线中都存在一些来历不明的没有任何说明的随机数种子,比如下面的常数(参见:Nothing-up-my-sleeve_number):

  • P-224: bd713447 99d5c7fc dc45b59f a3b9ab8f 6a948bc5

  • P-256: c49d3608 86e70493 6a6678e1 139d26b7 819f7e90

  • P-384: a335926a a319a27a 1d00896a 6773a482 7acdac73

这时,一个新的曲线就闪亮登场了:Curve25519。Curve25519/Ed25519/X25519 是著名密码学家 Daniel J.Bernstein 在 2006 年独立设计的椭圆曲线加密/签名/密钥交换算法,和现有的任何椭圆曲线算法都完全独立。这些算法在开始的时候乏人问津,但在2013年之后一下子变得炙手可热,成为绝对的主流已是大势所趋了。

这一方面是因为这套算法完全开放设计,没有任何秘密,没有任何可疑的参数;同时,这套算法确实足够优秀,足够安全。此外,还有点题外话,这位Bernstein之前还曾因为将自己设计的加密算法Snuffle发布到网上而遭到美国政府起诉,他抗争了6年,最后还是美国政府撤销了指控(跟全球大环境变化也有关系),但之后他还反诉政府,直到2003年底法院驳回他的诉讼,要他在政府制造了“具体威胁”之后再来。

关于算法的安全性,Bernstein进行了全面的考察,结果见下面截图,具体参见这里
safecurves

目前Curve25519/Ed25519已得到广泛应用,人们正在全面抛弃NIST,拥抱Curve25519,应用情况可参见:https://ianix.com/pub/curve25519-deployment.htmlhttps://ianix.com/pub/ed25519-deployment.html

1.5 VRF与数字签名算法方案的区别

对于刚接触VRF的人来说,可能很容易产生一个疑问:非对称数字签名算法,跟VRF有什么区别?或者说,非对称数字签名算法起不到VRF的作用吗?

在非对称加密领域,存在数字签名算法,对于一对秘钥 (pk,sk)来说,可以计算消息 m 的签名 s = SIG(sk,m),然后知道公钥的人可以验证 s 是否确实是签名者用私钥对m的签名:Verify(pk,m,s)。另外,通过密码学哈希算法,也能得到消息m的哈希值。

因此,这就跟VRF比较像了:

  1. 私钥拥有者可以声明自己的签名结果s,其他人通过公开信息(pk,m,s)可以验证该声明;

  2. s是不可预测的,这具有密码学上的安全性;可以再通过对s进行密码学哈希,得到一个不可预测的哈希值。

那么为什么还需要VRF呢,直接用数字签名的方案不行吗?
关于此问题,主要原因是,VRF相比于数字签名方案,具有前面所描述的更多安全特性。对于数字签名方案,有以下主要缺陷:

  1. 签名结果s不是唯一的!对于很多数字签名方案,同一个私钥对同一个消息,可以给出不同的签名。比如对于EdDSA,如果 s = SIG(sk,m),那么 s + ℓ s+\ell s+ 也会是一个有效的签名,其中 ℓ \ell 是对应椭圆曲线基点(即生成元)的阶。

  2. s是不可预测的,但是s不一定是伪随机的。也就是说,s在取值范围内的分布可能不是均匀的。

对于上面第1点,当然存在一些特定的数字签名实现,比如将[GMR88]中的数字签名方案中的随机数,使用[GMR89]中的GGM伪随机预言机代替之后,数字签名可以是唯一的。但是人们没办法确认签名者是否采用了这么一种方案,因此也就是说唯一性是无法保证的。

无法保证唯一性的数字签名方案,可以认为是一种“可验证不可预测函数”,但不是“可验证(伪)随机函数”。

2 Algorand VRF密码学抽签算法及应用

2.1 抽签算法原理剖析

2.1.1 抽签原理

基于VRF的密码学抽签算法用于根据每个用户的权重,随机选出用户的一个子集。整个抽签过程中,需要保证:

  1. 不存在上帝角色操纵整个抽签;
  2. 每个参与者独立做自己的抽签,在主动公布自己的抽签结果之前,其他任何人都不可能知道该抽签结果;
  3. 参与者公布自己的抽签结果后,系统中的其他参与者都可以验证该结果,参与者不需要泄漏自己的私钥;
  4. 在一轮抽签开始之前,任何参与者都不能预先计算自己的抽签结果;
  5. 抽签对所有参与者都是公平公正的;
  6. 防女巫攻击。

具体做法就是,假设参与者 i i i 的权重是 w i w_i wi,所有参与者的权重总和 W = ∑ i w i W=\sum_i{w_i} W=iwi,对于具体的抽签目的,我们设置一个期望值 t t t,表示在所有的权重当中,希望抽出 t t t份权重。这样,我们基于“伯努利试验”的抽签方式,按 p = t W p=\frac{t}{W} p=Wt 的概率,让每个参与者 i i i 依据自己的权重 w i w_i wi w i w_i wi次抽签,这样所有参与者就总共做了 W W W次抽签,抽签结果将是符合二项分布的。

接下来,需要做的就是构造这个“伯努利试验”,这就用到了VRF。首先,要求每个参与者都拥有一对公私钥, ( p k i , s k i ) (pk_i,sk_i) (pki,ski),然后,为了满足前面提到的要求,还需要定义一个种子seed,以及标识抽签阶段的一些数据,比如round。其中,需要尽可能让参与者在开始某一轮抽签的时候,才知道所用到的seed,这个根据具体的应用场景来定。

这时,就可以基于VRF构建我们的“伯努利试验”了。
x 是由seed、round等组成的抽签参数,则参与者先计算 x 的VRF哈希及证明: h a s h , p i = V R F s k i ( x ) hash,pi = VRF_{sk_i}(x) hash,pi=VRFski(x) 。这时得到的哈希的长度是固定的,比如32字节,由VRF的安全特性,我们知道hash是在区间 [ 0 , 2 256 ] [0,2^{256}] [0,2256]内均匀分布的,将该哈希值变为一个小数,即 d = h a s h 2 256 d=\frac{hash}{2^{256}} d=2256ha

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值