GitHub上的随机性检测工具sp800_22_tests介绍:(1)在Windows下的使用
特别说明:本文写于 2018 年 5 月,当时 David Johnston 发布的 sp800_22_tests 工具还不能在 Python 3 环境下运行,所以本文介绍了如何修改源程序,以便让该工具能在 Python 3 下运行。在 2018 年 6 月,David Johnston 在 GitHub 上发布了新的程序,新版程序能够在 Python 3 环境下直接运行,因此只需添加必要的第三方支持库,不再需要按照本文中介绍的办法修改源码了。
David Johnston 在 GitHub 上发布了一个名为 sp800_22_tests 的工具,网址是:https://github.com/dj-on-github/sp800_22_tests ,它是一个用 Python 语言写的程序集,能够根据 NIST SP 800-22 文档的要求,检测随机数集合的随机性,包括以下 15 种测试种类:
monobit_testfrequency_within_block_test
runs_test
longest_run_ones_in_a_block_test
binary_matrix_rank_test
dft_test
non_overlapping_template_matching_test
overlapping_template_matching_test
maurers_universal_test
linear_complexity_test
serial_test
approximate_entropy_test
cumulative_sums_test
random_excursion_test
random_excursion_variant_test
测试程序的运行方法是执行以下指令:
python sp800_22_tests.py 二进制随机数文件名
还可以加上以下参数:
--list_tests 显示所有的测试选项,可以这样执行命令:python sp800_22_tests.py --list_tests
-t 选择要执行的测试项,测试项可以用上一个参数 --list_tests 获取,例如对测试文件 data.sha1 做 monobit 测试的命令是:python sp800_22_tests.py data.sha1 -t monobit_test
--be 在待测试二进制数据中,将每个字节中的比特按照 Big-endian 顺序来处理,不加该参数时将字节中的比特当作 Little-endian 顺序来处理
1)安装必要的第三方库;该测试程序需要用到 argparse 和 NumPy,在 Windows 的命令提示符界面下,执行以下命令进行安装:
easy_install argparse
pip install numpy
2)为了符合 Python 3 的语法规则要求,修改 python 源程序,做以下修改:
a) 将所有 Python 源程序中出现的 print 改为 print( ) 函数形式;
b) 将所有 Python 源程序中出现的 xrange 改为 range;
c) 修改 sp800_22_dft_test.py 文件,将 37 行:mags = abs(fs)[:n/2] # Compute magnitudes of first half of sequence
改为:mags = abs(fs)[:n//2]
d)修改 sp800_22_tests.py 文件,将 36 行:byte = ord(bytech)
改为:byte = bytech
按照以上步骤修改过以后,测试程序就可以在 Python 3.6.5 下运行了。在网页 https://csrc.nist.gov/projects/random-bit-generation/documentation-and-software 上提供了一个随机性测试工具的下载链接:https://csrc.nist.gov/CSRC/media/Projects/Random-Bit-Generation/documents/sts-2_1_2.zip ,接下来使用这个 zip 文件中 /sts-2.1.2/data 路径下包含的随机数集合样例文件 data.sha1 来做测试,执行命令:
python sp800_22_tests.py data.sha1
除了 overlapping_template_matching_test 这一项测试因为输入的随机数数量太少、不满足测试要求以外,其他项测试都通过了,测试结果截图如下: