LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资讯 > Linux系统如何产生真随机数

Linux系统如何产生真随机数

2021-01-19 通证时代Time 来源:区块链网络

Linux内核实现了一个随机数产生器,从理论上说这个随机数产生器产生的是真随机数。与标准C库中的rand(),srand()产生的伪随机数不同,尽管伪随机数带有一定的随机特征,但这些数字序列并非统计意义上的随机数。也就是说它们是可重现的--只要每次使用相同的seed值,就能得到相同的伪随机数列。通常通过使用time()的返回值来改变seed,以此得到不同的伪随机数序列,但time()返回值的结果并不是不确定的(可预测),也就是这里仍然缺少一个不确定的噪声源。对于需要真随机数的程序,都不能允许使用伪随机数。

为了获得真正意义上的随机数,需要一个外部的噪声源。Linux内核找到了一个完美的噪声源产生者--就是使用计算机的人。我们在使用计算机时敲击键盘的时间间隔,移动鼠标的距离与间隔,特定中断的时间间隔等等,这些对于计算机来讲都是属于非确定的和不可预测的。虽然计算机本身的行为完全由编程所控制,但人对外设硬件的操作具有很大的不确定性,而这些不确定性可以通过驱动程序中注册的中断处理例程(ISR)获取。内核根据这些非确定性的设备事件维护着一个熵池,池中的数据是完全随机的。当有新的设备事件到来,内核会估计新加入的数据的随机性,当我们从熵池中取出数据时,内核会减少熵的估计值。

linux内核就是利用噪声来产生随机数的,它维持3个熵池(一级、二级和三级),而这些噪声课分为4类。如下:

1)I/O中:。内核调用add_interrupt_randomness()函数将设备两次中断的时间间隔作为噪声源将随机数据加入熵池,要使用设备的中断作为系统噪声,必须用SA_SAMPLE_RANDOM标志注册其中断服务程序。这样,每当设备发生中断时,中断系统会自动调用 add_interrupt_randomness()将熵加入熵池。

2)键盘:Add_keyboard_randomness()将按键的扫描码和两次按键之间的时间间隔作为噪声源;

3)鼠标:而add_mouse_randomness()则利用鼠标位置和连续两次鼠标中断时间间隔填充熵池;

4)硬盘:最后 add_disk_randomness()函数则以连续两次磁盘操作之间的间隔产生随机数。

为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。

一些知名区块链项目如UENC公链的共识算法中所用的随机数就来自于其去中心化网络中的硬件节点的linux操作系统。UENC的共识机制是随机选取验证节点,采用linux操作系统内核生成随机数,保证了充分的随机性。

—-

编译者/作者:通证时代Time

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...