随机数与urandom比较

0 投票
2 回答
695 浏览
提问于 2025-04-17 15:01

我被问到:

使用你的树莓派,写一个Python脚本来判断/dev/random和/dev/urandom的随机性。读取一些字节并制作结果的直方图。用matplotlib绘图。你的回答中要包含这个Python脚本。

我现在对“判断随机性”这个说法感到迷茫。

我可以通过以下方式从urandom和random读取数据:

#rb - reading as binary
devrndm = open("/dev/random", 'rb')
#read to a file instead of mem?
rndmdata = devrndm.read(25) #read 25bytes

或者

with open("/dev/random", 'rb') as f:
    print repr(f.read(10))

我觉得这个练习的目的是想让我们知道urandom比random快,而且urandom的可用数据池更大。不过,如果我尝试读取超过大约15个字节,读取的时间似乎会呈指数级增加。

所以我现在不知道该如何比较“随机性”。如果我把urandom和random的数据分别读取到文件中,我该怎么比较它们呢?

2 个回答

3

你的经验可能正是他们所需要的。下面是关于urandom(4)的手册内容:

当你从/dev/random这个设备读取数据时,它只会返回在熵池中估计的噪声位数范围内的随机字节。/dev/random适合那些需要非常高质量随机性的用途,比如一次性密码或密钥生成。当熵池空了的时候,从/dev/random读取数据会被阻塞,直到收集到更多的环境噪声。

而从/dev/urandom这个设备读取数据时,不会因为等待更多的熵而被阻塞。

注意这里提到的“阻塞”问题。urandom不会阻塞,而random会。在嵌入式环境中,额外的熵可能很难获得,这就会导致你看到的阻塞现象。

2

这可能简单得很:

In [664]: f = open("/dev/random", "rb")
In [665]: len(set(f.read(256)))
Out[665]: 169


In [666]: ff = open("/dev/urandom", "rb")
In [667]: len(set(ff.read(256)))
Out[667]: 167


In [669]: len(set(f.read(512)))
Out[669]: 218

In [670]: len(set(ff.read(512)))
Out[670]: 224

也就是说,要求256个字节并不一定会返回256个独特的值。所以你可以把不断增加的样本数量和独特值的数量进行对比,直到达到256这个饱和点。

撰写回答