G2EX

关于随机数质量测试

“It’s a good day, isn’t it?”

我们先从天气说起。

天气是不是随机的呢?如果让我们猜明天会不会下雨,我们十有八九能猜对,因为现有的科技可以做到精准预测,因此可以说明天的天气不是随机的。

如果让我们猜100年后的这一天会不会下雨,那就不好猜了,科技还无法做到,但这也不能认为100年后这一天的天气是随机的,因为不排除未来的科技能够预测。

在经典物理中,是不存在真随机的,因为经典物理量是可以测量和预测的。那在量子力学中呢?因为科技所限,也不能确定量子力学中是否存在真正的真随机。

也就是说,真正的真随机存在性还不确定。我们通常说的真随机数是指另外一个意思,满足统计意义上的随机,一般是由硬件的随机数产生器生成的。在能够提供随机数的智能卡中,一般会有一个硬件的随机数发生器。在计算机中,操作系统可以根据非确定的设备事件来生成真随机数,比如时钟、IO请求的响应时间、特定硬件中断的时间间隔、键盘敲击速度、鼠标位置变化等等。

这样一来,我们可以说自己使用的随机数发生器(硬件或软件)是真随机的,那怎么让别人信服呢?因此需要一个判定随机数是否满足真随机条件的标准。比如应用较广的随机序列统计测试方法——NIST(National Institute of Standards and Technology:美国国家标准与技术研究所)Special Publication(800 Series),简称 NSP800。

NSP800测试程序是一个统计学包,可以到NIST官网下载,该工具包括15种测试手段。这些测试手段可测试由用作保密随机或者伪随机数发生器的硬件和软件产生的任意长的二进制序列的随机性。每个测试项都是针对被测序列的某一特性进行检测的,其中一些测试又可以分解成多种子测验。
这15种测试手段及其对应的检测目的如下:

  1. 频率测试:检测整个序列中的0、1是否趋于等概率,如果是,则序列是随机的。
  2. 块内频率测试:检测每个子序列中的0、1是否趋于等概率,如果是,则序列是随机的。
  3. 累积和测试:检测序列的正向、反向累加和以反映0、1在序列中的分布是否均匀,太大或太小都是非随机的。
  4. 游程测试:检测序列中游程(一个没有间断的相同数序列,或者是“1111…”或者“0000…”)的数目是否如真随机序列期望的那样,接近序列长度的一半,如果是,则序列是随机的。
  5. 块内最长游程测试:检测子序列中最大长“1”游程的长度是否与真随机序列中的长度近似一致,如果是,则序列是随机的。
  6. 二元矩阵秩测试:检测序列中固定长度子序列的线性相关性,如果线性相关性较小,则序列是随机的。
  7. 离散傅立叶变换测试:检测序列进行离散傅立叶变换后的频谱是否趋于均匀分布;做法是观察超过95%阈值的峰值数目与低于5%峰值的数目是否有显著不同,如果接近,则序列是随机的。
  8. 非重叠模块匹配测试:检测序列中的子序列是否与太多的非周期模板相匹配,太多就意味着序列是非随机的。
  9. 重叠模块匹配测试:检测序列中重叠模块(特定长度的连续“1”)出现的次数,是否与真随机序列的情况偏离太大,太大则是非随机的。
  10. 通用统计测试:检测序列是否能在信息不丢失的条件下明显压缩,一个不可被明显压缩的序列是随机的。
  11. 近似熵测试:检测序列中相邻长度(m和m+1)的重叠子块的频数,是否与随机情况下预期的频数相近似。
  12. 随机游动测试:统计各个游程中某个特定状态出现的次数,检测其是否远远超过真随机序列中的情况,如果是,则序列是非随机的。
  13. 随机游动状态频数测试:检测序列中,某一特定状态在一个随机游程中出现的次数与真随机序列的偏离程度,如果偏离程度较大,则序列是非随机的。
  14. 序列测试:检测指定长度的所有子序列出现的次数是否趋于等概率,如果是,则序列是随机的。
  15. 线性复杂度测试:检测每个子序列的线性复杂度是否达到可视为是随机序列的程度。

李璞根据NIST官方网站的说明书编译了中文的《NIST随机数测试》,详细介绍了每种测试手段的数学原理,有兴趣的朋友可以去了解一下。

NSP800随机数测试套件需要在Linux中使用make编译,生成access可执行文件后使用,测试完成后会在experiments目录中生成测试报告。该套件的使用方法请见本文附件。

有意思的现象是,由同一个随机数生成器产生的不同批次的随机数测试结果有可能不同。第一组随机数有2项未通过,第二组有可能15项全部通过,这是因为随机数是不可预测的啊!

因此在实际操作中,同一个随机数生成器会产生三组随机数,只要有两组通过了测试,那就可以判断这个随机数生成器是满足条件的。

附上曾经整理的 NSP800 套件的使用文档
https://github.com/gymgle/gnotes/blob/master/attachments/NSP800-Guide.pdf