什么是随机数,随机数真的是随机的吗?

 2023-09-26 09:05:11发布

随机数并不是一个具体的数,而是在通过随机数生成器产生的一个或一组数的序列。这个序列所能出现的元素来自确定的集合,每次选出的元素不可预期,但元素出现的概率恒定的(一般是等概率的)。比如扔一枚六面均匀的骰子,结果不可预期,但每个面的概率都是相等的,每次掷出的结果就可以作为一个随机数生成的方法。

随机数真的是随机的吗

首先,我们要定义什么是随机数列,要实现随机数列,就必须满足以下条件:

  1. 不可预测——提前无法得知结果。
  2. 公正——每个结果出现的概率都必须相同。
  3. 可验证——结果必须可以独立验证。
  4. 防篡改——创建随机数的流程无法被任何一方操纵。
  5. 无法复现——创建随机数的流程无法复现,除非原始数列保留。

计算机是可预测的环境,由预设的电路、元件以及预定义的代码和算法组成,因此在特定条件下是有可能预测出计算机创建的随机数或随机数列的。

计算机永远都能基于一个输入生成特定输出,这就好像你在计算器里输入2+2,结果永远都是4。因此,计算机无法生成真正的随机数。

为了解决这一问题,随机数生成器(RNG)通常会采用seed作为计算的初始值(输入),并用来生成计算结果。这个seed可以基于任何难以复现的信息创建,比如照片中捕捉的数据、一天中的时间点、用户鼠标移动轨迹或熔岩灯的运动轨迹。

然而,即使我们说随机数生成过程很难复现,也不意味着技术上完全没办法复现。如果使用多个难以复现的seed作为初始值来生成随机数,那么最终结果会相对更可靠,但仍有理由相信这些seed最终还是可能被破解。即使使用同样的算法来生成不同seed,结果仍然无法完全保障随机性。

随机数生成器的分类

随机数都是由随机数生成器生成的,分为伪随机数生成器(PRNG)和真随机数生成器(TRNG)两种。

伪随机数生成器(PRNG)

PRNG底层是一组算法,应用数学共识创建随机数列,来模拟真正的随机数。由于计算机是独特的系统,因此这些数字对人来说确实看上去像是随机数,但实际上它们可能存在某些不易察觉的规律,而通过大量统计分析就可能发现这些规律。

真随机数生成器(TRNG)

TRNG采用不可预测的物理数据,比如宇宙噪音、同位素放射性衰变以及无线电波中的静电,基于自然现象生成随机数。TRNG从物理现象中“提取”随机数,因此这种随机数生成方案被认为比计算机更加稳健且不可预测。

但即使如此,TRNG使用的数据仍然有可能具有确定性。如果有人监测TRNG扫描的物理环境,那么他们也可以捕捉到同样的信号,并破解随机数列。TRNG生成的随机数被破解的概率相对较小,但这种方案的成本也相对较高,因此无法大规模应用。

PRNG相比TRNG还有一个优势,那就是可以复现。观察者如果知道数列的起始点,就可以复现同一个随机数列,因此就可以验证随机数的生成过程。

随机数在区块链中的应用

私钥

私钥的生成都需要依赖随机数,能否保证随机数的不可预测和破解,关系着加密资产的安全。

比特币私钥使用的是SHA-256生成的256位随机数,这个随机数的取值范围是0~2²⁵⁶-1。2的256次方近似于10的77次方,这是一个取值范围非常大的数,以现有的计算能力,想要暴力破解,几乎不可能。

不能暴力破解,但是如果生成随机数的随机数生成器可以被操控,生成的随机数可以被预测,那你的私钥就有可能被解密,加密资产的安全就得不到保障了。

竞猜类应用

在竞猜应用里,需要使用随机数,来保证结果的随机性,避免人为干预,影响结果的公平性。

在中心化环境下,参与竞猜的用户需要向系统提交竞猜订单,系统根据规则收集用户的信息,然后生成竞猜结果。

整个过程中,客户端不会参与竞猜结果的计算,竞猜结果本质上是由系统生成的一串随机数。当出现巨大利益诱惑时,系统可能会作弊,让自己从中得利。

在去中心化环境下,没有唯一的中心,可以让所有节点共同参与随机数的生成,

可以有效的保证随机数的公平性。但是在去中心化环境中,黑客可以更方便的对随机数发起攻击,从中获得利益。

权益证明(PoS)共识机制

区块链是一种去中心化的分布式记账技术,在去中心化的环境里,要实现正确的记账,随机的选出记账人,是非常关键的。因为只有在随机的条件下,才能保证公平的分配记账权,合理分配挖矿奖励。

采用工作量证明(PoW)的共识机制,是通过算力竞争,计算一个非常有难度的哈希值,来随机确定由谁来记账,而采用PoS的共识机制,则需要通过随机数,随机选举出一个节点来进行记账。

大多数PoS协议都会根据持有者的代币数量,选出一组矿工和验证者,共同完成对链上交易的验证和出块。为了能够随机的选出矿工和验证者,保证公平分配奖励,算法必须融入一些公平、无偏倚的随机数源。

随机数对区块链的意义

安全的随机数是区块链加密技术的基础,加密哈希函数是加密货币钱包创建私钥的关键要素,保障任何人都无法破解钱包的私钥。

据估计,比特币协议使用的哈希函数SHA-256中可能的私钥组合接近可观测宇宙中的原子数量。

分布式共识在底层受到了吞吐量和延迟的限制。吞吐量指一段时间内可以发送的消息数量;延迟指网络发送一条消息所需要的时间。一条公链上有几千个分布式的节点共同达成共识,要每个节点都向所有其他节点发送消息是不现实的。

为了尽量减少达成共识所需的消息数量,比特币采用了工作量证明(PoW)作为随机数来源,决定哪个节点可以向区块链添加新区块。

矿工需要解开高难度的计算题,才能成功向区块链添加新区块,因此多个节点在同一时间解出计算题的概率非常低,这样将降低网络达成共识所需发送的消息数量。

在权益证明(PoS)系统中,如果恶意攻击者可以操纵筛选流程中使用的随机数,那么就可以提高自己被选中的几率,并因此威胁整个网络的安全性。

由于区块链是公开透明的,所有参与者都可以看到所有输入和输出,因此也可能预测出随机生成的数列。比如,一些生成链上随机数的方案,例如基于区块哈希生成随机数存在明显的安全漏洞。

如果矿工或验证节点想要操纵随机数,就可以选择不发布对他不利的区块,从而影响随机数生成。这样做基本上等于不断重新掷色子,直到最终结果对自己有利为止。

而另一方面,链下RNG解决方案缺乏透明性,用户只能相信中心化的数据提供商不会操纵结果,而且无法判断随机数的真伪。随着RNG解决方案保障的价值越来越高,这两种方案都越来越令人担忧。

随机数的生成机制

随机数是密码学和区块链的重要部分。不良的随机数方案会通过停止区块链协议或导致中心化的方式破坏区块链的安全性。

因此,在理解区块链的安全性时,探究随机性在该区块链协议中的角色乃是重中之重,以下是常见的随机数生成机制。

VRF(可验证随机函数)

VRF(Verifiable Random Function)是一种可验证的随机数生成方式。目前主要是基于POS共识算法的区块链项目在使用,包括Algorand、Cardano。

在Algorand、Cardano中,VRF是产生随机数的关键。VRF可以根据任意的一个输入,输出一个随机数。在VRF中特别设计了一个非交互的零知识证明过程,可以用来验证随机数的正确性,以及某随机数是由某节点生成的。

VRF中主要包含四个环节:

  1. 生成公私钥对
  2. 生成随机数输出
  3. 计算零知识证明
  4. 验证随机数输出

生成随机数的节点将自己的私钥,作为生成随机数的输入的一部分,然后在本地输出随机数和零知识证明。其他节点可以利用生成随机数的节点的公钥、输入、输出,验证随机数和生成者身份的真假。

得到随机数之后,就需要用生成的随机数来挑选参与出块的节点,最简单的方式是在全网设置一个公认的临界值M,假设某个节点生成的随机数R大于临界值M,系统就允许节点参与下一步的出块任务。

但是这种方案没有办法防止女巫攻击,所以现在大部分VRF抽签方案都会基于权益进行票数分配,然后设计抽签算法,完成后续的共识过程。

Randao

Randao基于区块链技术,提供开源、去中心化、可证公平的随机数生成服务。Randao的目标是满足随机数生成不可控制和不可预测的基本特性的同时,使个体可以参与随机数的生成,保证随机数具备可参与性,利用区块链透明和不可逆的特点,保证结果的可证公平性。

Randao主要采用了Commit Reveal和BLS。 Commit Reveal其缺点主要是生成随机数的速度较慢。在以太坊中,从接到随机数生成请求,到生成随机数,至少需要 10 个块以上的时间,目前耗时在 3 分钟以上。

因为需要参与者多次发送交易提交数据,其生产和使用成本较高。但该方案的优势在于,其参与门槛基本为零,任何人都可以随时加入一个随机数的生成过程,在防止串谋和可证公平方面拥有一定优势。

BLS 签名方案是对Commit Reveal的一种补充,因为生成过程在链外组织,响应速度快,通常只需要一个区块的时间就能生成随机数。

消费者发起随机数生成请求,生产者在下一个块写入随机数,只需要发送两次交易就可以完成随机数的生成和调用,生产和使用成本都很低,适合用于高频,同时对防串谋要求不高的场景。

阈值签名机制(Threshold Signature Scheme)

Dfinity是一个公链项目,目标是成为“互联网电脑”,实现软件和服务在其公有云的运转。在Dfinity中,随机数是整个共识机制正常运转的核心,其采用的阈值签名机制结合了VRF和BLS签名机制,是生成随机数的一种有效方式。

阈值签名机制主要由三部分组成:输入、输出、阈值机制。输入是一组成员的私钥,输出是一个随机数。阈值机制能够保证的是,只要接收来自成员的输入数量超过设定值,就可以得到一个确定的随机数,但是在得到小于设定值的输入数量前,没有人能够预测输出的随机数是多少。

输出随机数的过程中使用了VRF,阈值机制中使用了BLS签名机制。

阈值签名机制结合了VRF和BLS,VRF使其生成的随机数具备了可验证性,BLS签名机制使签名过程中,没有节点可以提前预知签名结果,实现了随机数的不可操控性,并且很难串谋,是一种不错的随机数生成机制。

Thunderella

在哈希函数实例化的随机数预言机方案中,提议者将依据以下公式来确定:H_nonce(pk,q)

如果攻击者提议了一个区块,她可以操控为下一轮哈希函数生成熵的 nonce 值,从而影响下一个区块的提议者的人选。

然而,为了降低随机数方案的可篡改性,在哈希函数中相同的 nonce值不仅仅用于选择下一轮的提议者,也会用于选择接下来 r 个轮次的提议者。这使得攻击者在计算上很难通过强制改变 nonce 值来让自己连续成为接下来 r 个轮次的提议者。

虽然这种策略仅损失了多项式安全性,但它具有可预测性的弊端(后面也会讨论到),该方案仅能够应对慢速自适应的攻击者。当重复使用相同的 nonce 值给哈希函数喂送种子时,就会导致攻击者能够提前预测到谁是提议者。

由于在一时期中相同的 nonce 值被重复用作熵,从而导致随机种子在新一轮开始之前被泄露,使得攻击者可以对提议者进行腐化或者实施 DoS 攻击。

NULSRNG

NULSRNG是全球开源社区项目NULS,根据其POC(Proof of Credit)共识算法,专门为Dapp设计的随机数种子生成机制。

NULSRNG的实现方式是基于POC共识的两段式随机种子提交生成机制。即每个节点在出块的同时生成一个随机种子,并对该随机种子进行加密处理,将生成的密文包含在区块头中,同时获取该节点上次出块时生成的256位随机种子明文。

结合区块头中的明文和密文,就可以对节点生成的随机数种子进行验证,确保不可篡改。

NULSRNG基于底层共识实现,由全部共识节点参与,这样的方式增加了节点串谋的难度,采用种子密文和明文两段式提交的方式,能够实现种子可验证和不可篡改。

在NULS上开发的Dapp,可以直接利用底层提供的接口,获取随机种子,然后采用自己的随机算法,生成需要的随机数数列,不仅可以提高随机数的安全性,同时使用上也可以做到灵活方便。

推荐阅读