随机数与urandom比较
我被问到:
使用你的树莓派,写一个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这个饱和点。