发现一篇目前水平看很不错的文章,暂且收录
前言
关于随机数测试,有两份比较常用的标准,一份是国密局的随机数检测规范,一份是NIST的测试标准
国密局标准参看GB/T 32915,NIST标准可以参看 https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-22r1a.pdf
两者大体上一致,存在几个用例的区别,另外NIST除了统计P值总数,还统计P值的分布
NIST还提供了一个测试程序,可以从这里获取 https://csrc.nist.gov/projects/random-bit-generation/documentation-and-software
关于随机数
随机数特性
随机性
一个理想的随机二进制比特流,可由一个完全"公正无偏"的通过抛掷正反面得到,其中正面记为0,反面记为1。每一掷得到0和1的概率都是确切的1/2。而且每一次的结果之间都相互独立,即先前的结果不会对未来的结果产生影响
使用像“公正硬币”这样的理想随机数发生器是不实际的,但是这样一个理想的发生器产生的输出可以作为我们测试评估其他随机数发生器的基准。
不可预测性
加密应用的随机数需要不可预测。对于伪随机数发生器,在不知道种子的情况下,就算知道先前的随机数序列也应该无法预测接下来输出,也即前向不可预测性。同时后向不可预测性也是要求的,即无法通过已知的产生的值,得出种子。
由于伪随机数算法往往已知,确保前向不可预测性,在得到种子的方法上需要注意,种子本身要不可预测。
产生方法
RNG(随机数发生器)
使用熵源和熵蒸馏函数。其中熵蒸馏函数用来克服熵源的任何非随机性缺陷。熵源一般基于物理现象由硬件产生,得到真随机数。特别地,像我们即将评估的量子随机数发生器,就是利用了半导体的量子效应。
RNG产生的结果可以直接作为随机数使用,但前提是已经满足了严格的随机性标准。也可以将得到的结果再喂给PRNG,或者将几个PNRG的结果进行结合,以提高随机数的随机性。
PRNG(伪随机数发生器)
提供输入的种子,通过数值运算,得到伪随机数。伪随机数发生器的输出是种子的一个确定性结果,即喂给相同的种子的情况下输出永远一样。这也是为什么称之为“伪随机数”的原因。所以输入的种子本身需要满足随机性和不可预测性。
伪随机发生器便于重现,产生速度快,有其自身的优点。
测试
随机数的测试,基于随机性假设设计测试用例进行统计性的验证。每一