0

我被问到:

使用您的树莓派,编写一个 python 脚本来确定 /dev/random 和 /dev/urandom 的随机性。读取字节和直方图结果。在 matplotlib 中绘图。对于您的答案,请包括 python 脚本。

我目前迷失在“确定随机性”的措辞上。

我可以从 urandom 和随机读取:

#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 更快并且拥有更大的池。但是,如果我尝试阅读超过 15 的任何内容,阅读时间似乎会成倍增加。

所以我现在不知道如何比较“随机性”。如果我将 urandom 和 random 都读取到各自的文件中,我该如何比较它们?

4

2 回答 2

3

您的体验可能正是他们想要的。从 urandom(4) 的手册页:

读取时,/dev/random 设备将仅返回熵池中估计的噪声位数内的随机字节。/dev/random 应该适合需要非常高质量随机性的用途,例如一次性填充或密钥生成。当熵池为空时,来自 /dev/random 的读取将被阻塞,直到收集到额外的环境噪声。

从 /dev/urandom 设备读取不会阻塞等待更多熵。

注意关于阻塞的一点。urandom 不会,随机会。特别是在嵌入式环境中,可能很难获得额外的熵,这会导致您看到的阻塞。

于 2013-02-06T21:11:43.997 回答
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

IE。要求 256 个字节不会返回 256 个唯一值。因此,您可以根据唯一计数绘制增加的样本量,直到达到 256 个饱和点。

于 2013-02-06T21:22:37.783 回答