一、简介
美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)发布了一篇名为“A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications”的文章,对用于检验加密应用的随机数发生器的质量的NIST SP 800-22随机数测试集进行了全面的介绍。
该文章可通过链接添加链接描述获取。
https://developers.goodix.com/zh/bbs/blog_detail/76c7e154cbfb4b18b8a00c67debc5eb6
1.1随机数测试集
NIST SP
800-22随机数测试集包含15个测试项,用于测试由基于硬件或软件的加密随机数或伪随机数生成器生成的(任意长)二进制序列的随机性。这些测试侧重于序列中可能存在的各种不同类型的非随机性,其中的一些测试可分解为各种子测试。
The Frequency (Monobit) Test(频率测试)该测试的重点是整个序列中0和1的比例。此测试的目的是确定序列中1和0的数量是否与真正随机序列的预期数量大致相同。该测试评估1的分数与1/2的接近程度,即序列中1和0的数量应该大致相同。所有后续测试都取决于此测试的通过。
Frequency Test within a Block(块内频率测试)该测试的重点是M位内1的比例。该测试的目的是确定M位中1的频率是否大约为M/2,正如在随机性假设下所预期的那样。对于块大小M=1,此测试退化为测试1,即频率(单比特)测试。
The Runs Test(运行测试)该测试的重点是序列中的运行总数,其中运行是相同位的不间断序列。长度为k的运行由k个完全相同的位组成,并且在前后以相反值的位为界。运行测试的目的是确定运行时各种长度的1和0是否符合随机序列的预期,即该测试确定这些0和1之间的振荡是太快还是太慢。
Tests for the Longest-Run-of-Ones in a Block该测试的重点是M位中最长的1。该测试的目的是确定测试序列中最长1的长度是否与随机序列中预期的最长1的长度一致。
The Binary Matrix Rank Test(二元矩阵秩检验)该测试的重点是整个序列的不相交子矩阵的等级。此测试的目的是检查原始序列的固定长度子串之间的线性相关性。
The Discrete Fourier Transform (Spectral) Test(离散傅里叶变换测试)该测试的重点是序列的离散傅里叶变换中的峰值高度。该测试的目的是检测测试序列中的周期性特征(即彼此靠近的重复模式),这些特征表明与随机性假设的偏差。目的是检测超过95
%阈值的峰数是否与5 %显着不同。The Non-overlapping Template Matching Test(非重叠模板匹配测试)该测试的重点是预先指定的目标字符串的出现次数。此测试的目的是检测产生过多出现给定非周期性(非周期性)模式的生成器。
The Overlapping Template Matching Test(重叠模板匹配测试)重叠模板匹配测试的重点是预先指定的目标字符串的出现次数。
Maurer’s “Universal Statistical” Test该测试的重点是匹配模式之间的位数(与压缩序列长度相关的度量)。测试的目的是检测是否可以在不丢失信息的情况下显着压缩序列,一个显着可压缩的序列被认为是非随机的。
The Linear Complexity Test(线性复杂度测试)该测试的重点是线性反馈移位寄存器(LFSR)的长度。此测试的目的是确定序列是否足够复杂以被认为是随机的。随机序列的特点是较长的LFSR,太短的LFSR意味着非随机性。
The Serial Test(串行测试)该测试的重点是整个序列中所有可能的重叠m位模式的频率。该测试的目的是确定2m位重叠模式的出现次数是否与随机序列的预期值大致相同。随机序列具有一致性,也就是说每个m位模式与其他每个m位模式出现的机会相同。
The Approximate Entropy Test(近似熵检验)与串行测试一样,该测试的重点是整个序列中所有可能的重叠m位模式的频率。
The Cumulative Sums (Cusums) Test(累积和测试)该测试的重点是随机游程的最大偏移(从零开始),由序列中调整后的(-1,+1)数字的累积和定义。测试的目的是确定测试序列中出现的部分序列的累积和相对于随机序列的累积和的预期行为是太大还是太小。这个累积和可以被认为是随机游程。对于随机序列,随机游程的偏移应该接近于零。对于某些类型的非随机序列,这种随机游程从零开始的偏移会很大。
The Random Excursions Test(随机偏移测试)该测试的重点是在累积和随机游程中恰好有K次访问的周期数。累积和随机游程是从(0,1)序列转移到适当的(-1,+1)序列后的部分和得出的。随机游程的循环由一系列随机采取的单位长度的步骤组成,这些步骤从原点开始并返回原点。此测试的目的是确定在一个周期内访问特定状态的次数是否偏离了人们对随机序列的预期。
The Random Excursions Variant Test(随机偏移变化测试)该测试的重点是在累积和随机游程中访问(即发生)特定状态的总次数。此测试的目的是检测随机游程中对各种状态的预期访问次数的偏差。
1.2 P-value值说明
检验统计量用于计算总结针对零假设的证据强度的P-value值。对于这些测试,在给定测试评估的非随机性类型的情况下,每个P-value值是完美随机数发生器生成的序列随机性小于被测序列的概率。如果确定测试的P-value值等于1,则序列似乎具有完全随机性。若P-value值为零表示该序列似乎是完全非随机的。
1.3 TRNG(真随机数发生器)
TRNG模块支持伪随机数生成和真随机数生成。伪随机数由线性反馈移位寄存器(LFSR)生成。真随机数是通过使用前馈环形振荡器(FRO)作为熵源来生成的。
TRNG模块详细的资料和介绍可以在GR551X系列芯片的Datasheet中获取
二、测试举例
在sts-2.1.2工具包根目录下,输入./assess.exe并回车,可以看到如何设置数据段长度。
NIST测试集是按数据段来进行检验的,无论原始数据文件有多大,都可以通过设置数据段长度,将数据文件分成小端。数据段的长度不应过小,因为有些测试项所需的数据流至少要大于特定值才能进行检验。数据段的长度最好满足32的倍数。本文推荐的数据段长度为1024000位,该长度可以满足所有测试项的数据流要求。
在sts-2.1.2工具包根目录下,输入./assess.exe 1024000并回车。
3.2.4 设置测试参数
根据菜单指引,需要设置相应的测试参数才能开启测试。测试参数的设置十分重要,因为不同的参数将会带来不同的测试结果,合理的参数设置才能获取到正确的测试报告。
输入数字[1,2,3,4,5,6]可以设置对应的测试参数,输入0将会结束参数的设置。
3.2.4.1 Block Frequency Test - block length(M)
这项测试建议每个要测试的序列至少包含100位(即n ≥ 100)。 请注意,n ≥ MN。 应选择块大小M,使得M ≥ 20,M >
.01n和N < 100。其中M为每个块的长度,n为序列的位数,N为将输入序列划分为 n/M 的非重叠块。由于本文推荐的数据段长度为1024000位,这项参数推荐设置为20480。
3.2.4.2 NonOverlapping Template Test - block length(m)
这项测试已编写的测试代码提供m = 2、3、…、10的模板。建议指定m = 9或m = 10以获得有意义的结果。
尽管在测试代码中已指定N = 8,但代码可以更改为其他大小。应使N ≤ 100以确保P-value值有效。此外,确保M > 0.01 ∙
n且N = n/M。
3.2.4.3 Overlapping Template Test - block length(m)
这项测试的m可以选择各种值,但目前NIST建议m = 9或m = 10。如果需要其他值,需要满足以下条件:
n ≥ MN
应选择N以使 N∙( min(π_i) )>5
计算λ=(M-m+1)/2^m≈2
应满足 m≈log2_M
自由度数K应满足K≈2λ,注意除5以外的K值,需要重新计算 π_i 的值
3.2.4.4 Approximate Entropy Test - block length(m)
这项测试使每个块的长度m和序列的位数n满足m<[ log2_n ]-5。
3.2.4.5 Serial Test - block length(m)
这项测试使每个块的长度m和序列的位数n满足m<[ log2_n ]-2。
3.2.4.6 Linear Complexity Test - block length(M)
这项测试需要满足序列的位数n ≥ 10^6,每个块的长度M必须在500 ≤ M ≤ 5000的范围内,并且 N = n/M ≥
200才能使结果 χ^2 有效。
https://developers.goodix.com/zh/bbs/blog_detail/76c7e154cbfb4b18b8a00c67debc5eb6