admin 管理员组文章数量: 1087582
熵和随机数
2019独角兽企业重金招聘Python工程师标准>>>
在信息论层面上,熵,是不确定程度的度量,可以用比特作其单位。1比特的等概率随机二进制数,例如一次投币,就含有1比特的熵,这也是1比特数据含有的熵的最大值。一个安全的随机数意味着它含有足够的熵。随机数熵的来源只能是物理世界的独立随机事件。
Linux 内核采用熵来描述数据的随机性,熵是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
内核中随机数发生器 PRNG 为一个字符设备 random,代码实现drivers/char/random.c,该设备实现了一系列接口函数用于获取系统环境的噪声数据,并加入熵池。系统环境的噪声数据包括设备两次中断间的间隔,输入设备的操作时间间隔,连续磁盘操作的时间间隔等。
random 设备了提供了 2 个字符设备供用户态进程使用——/dev/random和/dev/urandom:
(1)dev/random 适用于对随机数质量要求比较高的请求,在熵池中数据不足时,读取 dev/random 设备时会返回小于熵池噪声总数的随机字节。/dev/random 可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random 的读操作将会被阻塞,直到收集到了足够的环境噪声为止。这样的设计使得/dev/random 是真正的随机数发生器,提供了最大可能的随机数据熵;
(2)/dev/urandom,非阻塞的随机数发生器,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom 的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random 的。它可以作为生成较低强度密码的伪随机数生成器,对大多数应用来说,随机性是可以接受的。
转载于:
本文标签: 熵和随机数
版权声明:本文标题:熵和随机数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1700299396a386168.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论