简要介绍:真随机数和伪随机数
流量次数: 作者:小编 发布时间:2023-10-16 14:33:15
简要介绍:真随机数和伪随机数
真随机数是指完全无法预测的数值序列,其生成过程依赖于一些不可预测的物理过程。例如,可以使用这些物理过程中的量子现象来生成真随机数。真随机数的特点是每个数值都是独立且不相关的,且无法通过任何算法或计算方法来推测后续的数值。
伪随机数则是通过算法或计算机程序生成的数值序列,其表现上类似于随机数,但实际上是可重现和可预测的。伪随机数的生成过程依赖于一个称为“随机数种子”的初始值,通过对种子进行特定的计算和操作,可以生成一系列看似随机的数值。
伪随机数广泛应用于计算机科学领域,例如在模拟实验、密码学、游戏和随机算法中。在应用伪随机数时,需要确保种子的安全性和随机性,以免导致预测或破解。
比特币用户对于诸如“非对称加密”、“椭圆曲线”、“量子计算机”等高深难懂的话题热衷于探讨,然后以一种令人困惑的方式导致比特币丢失,比如“随机”操作。
历史上发生过多起不同品牌的钱包用户遭遇丢币事件,原因均在于随机函数存在漏洞。
随机性非常重要,特别是对于比特币这种密码学电子货币而言。可惜社区内对于随机性的讨论并不充分,导致很多人对其缺乏正确的认识。因此,今天我们要和大家谈一谈随机性。提到随机性,有两个必须要搞清楚的概念:“真随机数生成器”(TRNG)和伪随机数生成器(PRNG)。
大多数计算机程序和语言中的随机函数实际上是伪随机数生成器,它们通过使用确定的算法和一个“种子”(例如“时间”),来产生表面上看起来是随机的结果。
没有任何疑问,只要人们知道算法、种子或之前生成的随机数,就有可能获得下一个随机数序列的信息。由于这些随机数是可预测的,在密码学中是不安全的,因此被称为“伪随机”。这种随机数可以用于游戏中的小角色移动等简单任务,但如果用于生成比特币私钥,那就非常不安全了。
让我们再来讨论一下真正的随机数生成器。在中文维基中,将“硬件随机数生成器”(HRNG)与真随机数生成器等同起来,其实并不完全准确。严格来说,真正的随机数可能只存在于量子力学领域中,而我们目前所需要的(或者能够实现的),并不是这种完全随机的方式。
我们希望获得一种无法预测的、在统计上具有密码学安全性的随机数。只要一种随机数生成器能够满足这个要求,我们就可以称之为真随机数生成器。这种真随机数并不一定非要是特殊设计的硬件。在Linux操作系统内核中,有一个随机数生成器(/dev/random)维护着一个熵池。该熵池会收集硬件噪声,例如键盘、鼠标操作和网络信号强度变化等,从而能够提供最大可能的随机数据熵。因此,它也是一种高质量的真随机数生成器。不过,/dev/random是阻塞的,也就是说,如果熵池为空,对于/dev/random的读操作会被暂停,直到收集到足够的环境噪声为止。
因此,在进行程序开发时,我们应当使用/dev/urandom作为/dev/random的备选选项,它不会阻塞程序运行,但其产生的随机性可能相对较低于/dev/random。
在我们开发比特币应用时,应该选择哪种随机数生成器来生成私钥?在说了这么多之后,我想分享一下正确的做法。
答案很明显:只需使用urandom。永远只使用urandom。
请不要采用任何第三方的随机数解决方案,尽管它们可能声称提供了“极高安全性”的随机函数。这些解决方案均属于用户层的密码学随机数生成器,而urandom则是内核层的随机数生成器。由于内核具有访问裸设备熵的权限,它可以确保应用程序之间不会共享相同的状态。因此,请使用urandom来获取随机数。
在历史上,曾经发生过无数次随机数生成失败的案例,其中大部分发生在用户态的随机数生成器上。而且,用户态的随机数生成器几乎总是依赖于内核态的随机数生成器(如果不依赖的话,风险会更大)。除了希望能简化某些开发工作之外,并没有看到任何额外的好处,相反却增加了引入第三方代码可能导致的潜在安全风险。
所以,当开发者需要使用密码学安全的随机数时,应该使用urandom函数。
最后,有一个小朋友问道,BITHD硬件钱包生成的随机数是真正的随机数吗?
我来回答一下:当然呀~BITHD的芯片内置硬件随机数发生器,它会利用物理噪声源产生真正的随机数,无法被预测和探测到,是真正的随机来源。