乍一看,电子游戏、赌博、密码学似乎彼此之间毫无关系,但实际上,它们都使用“随机数”,没有随机数就无法建立现代人的生活。本文将解释计算机如何生成这样的随机数。
生成随机数比你想象的要难得多!
例如,如果你想在编程中使用随机数,Ruby中使用诸如“rand”或Python 中使用“random()” 之类的方法。此时生成的是通过计算获得的伪随机数,而不是完全随机数。
首先,计算机是“输入数据并输出数据”的逻辑机器,为了使计算机生成随机数,它需要数据作为随机数的来源。这个随机数的来源是什么数据取决于随机数生成器,随机数生成器主要有两种类型。
一种称为“伪随机数生成器(PRNG)”。要使用此 PRNG 生成数字,您需要两个特定的数字,即“种子值”和“随机数生成算法”。用于PRNG的随机数生成算法包括'平方提取法','线性同余法','线性反馈移位寄存器'和'Mersenne Twister'。
PRNG不能生成完美的随机数,但它可以快速且廉价地生成看似随机数。此外,如果制备特定的种子值,可以获得再现性,因此测试操作也是一个很大的问题。这就是为什么PRNG经常用于游戏和编程语言中的随机方法。
但是,由于 PRNG 生成的数字的随机性取决于种子值,因此还存在一个漏洞,即如果种子值泄露,可以预测数字的生成。实际上,卡巴斯基实验室(一种安全软件)中有一个密码管理器示例,它在获取种子值时遇到问题,并使随机生成的密码可预测。
另一种就是“固有随机数生成器(TRNG)”随机生成作为随机数源的数据。TRNG的特征是使用熵而不是种子值,种子值是一个特定的数字,可以生成更接近完美的随机数。因此,TRNG用于数字赌博领域,如骰子,洗牌和轮盘赌。
问题是如何使用熵作为随机数源的数据,这要求构成计算机的部分是随机的。TRNG通过使用诸如存储器波动性和光电效应等量子现象,将物理噪声转换为数字1和0来产生高度随机的数字。
另一方面,TRNG的缺点是生成数字需要时间。此外,作为随机数源的数据需要熵,因此空闲或新服务器无法创建与活动服务器一样随机的数据。
由于PRNG和TRNG各有其弱点,因此可以在视频游戏或赌博中毫无问题地使用,但不能用于密码学领域,这需要很高的安全性,同时也需要速度。
因此设计了“加密伪随机”数字生成器(CSPRNG),它实现了PRNG的速度和TRNG的安全性。
CSPRNG是一个生成器,它从“高质量的熵源创建种子值,并将其输入到算法中以生成高度安全的随机数”。简而言之,CSPRNG是一种“使用TRNG生成PRNG种子值”的机制。/ Dev / random 在类Unix操作系统中使用,Linux使用这个CSPRNG。
下次,当你玩视频游戏,随机播放音乐或在编程中拨打随机号码时,也许你可以想一想计算机中发生了什么。