BTC之随机数生成

BTC之随机数生成,第1张

有两个最主要的方法来生成随机数

a) 通过测量某些随机的物理现象,然后补偿测量过程中可能出现的偏差。比如大气噪声、热噪声和其他外部电磁以及量子现象。从自然资源中获取熵的速度取决于被测量的潜在物理现象,因此它们的速率是有限的,往往比较慢。

b) 使用计算算法,可以产生明显随机结果的长序列,实际上由较短的初始值(称为种子)确定。结果是,如果种子的值是已知的,整个看似随机的序列可以被重复产生。这类随机数生成器被称为伪随机数生成器。这类生成器类型是非阻塞的,可以大量产生数据。

/dev/random 可以用作随机数生成器或者伪随机数生成器,取决于不同的实现。

在linux下,随机数生成器有一个容纳噪声数据的熵池,在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的 公钥 或 一次性密码本 。若熵池空了,对/dev/random的读 *** 作将会被 阻塞 ,直到收集到了足够的环境噪声为止。这样的设计使得/dev/random是真正的 随机数发生器 ,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。

/dev/urandom(“unblocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取 *** 作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

FreeBSD *** 作系统实现了256位的Yarrow算法变体,以提供伪随机数流。与Linux的/dev/random不同,FreeBSD的/dev/random不会产生阻塞,与Linux的/dev/urandom相似,提供了密码学安全的伪随机数发生器,而不是基于熵池。而FreeBSD的/dev/urandom则只是简单的链接到了/dev/random。

OpenSSL的提供了RAND_bytes方法生成随机数。在使用之前需要使用RAND_add向PRNG中添加种子及熵值。种子可以通过TSC生成。

CryptoAPI提供了CryptGenRandom方法产生随机数。CryptGenRandom已经被废弃,应该使用新版CNG API:BCryptGenRandom

CPU指令rdrand从芯片的硬件随机数生成器中获取随机数

32位:

64位:

BTC采用了多种方式混合的形式,将OpenSSL随机数生成、OS随机数生成、硬件随机数生成再混淆随机数发生器的状态来生成强随机数。

参考文档:

https://en.wikipedia.org/wiki/Random_number_generation#%22True%22_vs._pseudo-random_numbers

https://zh.wikipedia.org/wiki//dev/random

https://www.openssl.org/docs/man1.0.2/crypto/RAND_seed.html

https://zh.wikipedia.org/zh-hans/RdRand

1. 使用openssl命令

OpenSSL是一个著名的、广泛使用的命令行工具,用于从shell中调用OpenSSL的crypto库的各种加密函数。要生成一个强PSK,请使用它的rand子命令,该命令生成伪随机字节并通过base64编码进行过滤,如下所示。

生成32位密钥:

openssl rand -base64 32

生成64位密钥:

openssl rand -base64 64

2. 使用GPG命令

GPG是使用OpenPGP标准提供数字加密和签名服务的命令行工具。您可以使用它的--gen-random选项来生成一个强PSK,并通过base64编码对其进行过滤,如下所示。

在以下命令中,1或2是质量级别,10、20、40和70是字符数量。

gpg --gen-random 1 10 | base64

gpg --gen-random 2 20 | base64

gpg --gen-random 1 40 | base64

gpg --gen-random 2 70 | base64

3.使用伪随机数生成器

您还可以使用Linux中的任意伪随机数生成器,如/dev/random或/dev/urandom,如下所示。head命令的-c选项有助于生成字符数。

head -c 35 /dev/random | base64

head -c 60 /dev/random | base64

使用伪随机数生成器

5. 使用date和sha245sum命令

可以组合date和sha256sum命令来创建一个强PSK,如下所示。

date | sha256sum | base64 | head -c 45echo

date | sha256sum | base64 | head -c 50echo

date | sha256sum | base64 | head -c 60echo

纠正一下,. 是随机数发生器, *** 作

要运行 RNG,请按以下步骤 *** 作:

如果需要,使能中断(为此,将 RNG_CR 寄存器中的 IE 位置 1)。准备好随机数时或出现错误时生成中断。

通过将 RNG_CR 寄存器中的 RNGEN 位置 1 使能随机数产生。这会激活模拟部分、RNG_LFSR 和错误检测器。

每次中断时,检查确认未出现错误(RNG_SR 寄存器中的 SEIS 和 CEIS 位应为 0),并且随机数已准备就绪(RNG_SR 寄存器中的 DRDY 位为 1)。然后即可读取 RNG_DR寄存器中的内容。

按照 FIPS PUB(联邦信息处理标准出版物)140-2 的要求,将 RNGEN 位置 1 后产生的第一个随机数不应使用,但应保存起来,与产生的下一个随机数进行比较。随后产生的每个随机数都需要与产生的上一个随机数进行比较。如果任何一对进行比较的数字相等,则测试失败(连续随机数发生器测试


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8949822.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存