GitHub上的随机性检测工具sp800_22_tests介绍:(1)在Windows下的使用

本文介绍了一款由DavidJohnston开发的SP800-22随机性测试工具,并提供了该工具在Python3环境下的运行指南。此工具包含15种随机性测试方法,用于验证随机数集合的质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特别说明:本文写于 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_test
    frequency_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 顺序来处理


    该测试程序适用于Python 2.7,在 Python 2.6 和 Python 3下运行都有问题。为了能在一台安装Windows 7操作系统、Python 3.6.5的计算机上运行测试程序,需要做以下特别处理:
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 这一项测试因为输入的随机数数量太少、不满足测试要求以外,其他项测试都通过了,测试结果截图如下:



### NIST SP 800-22 测试在 Python 中的实现与使用方法 NIST SP 800-22 是一套用于评估随机数生成器(RNG)或伪随机数生成器(PRNG)随机性质量的统计测试套件。以下是关于该测试在 Python 中的实现与使用方法的详细说明。 #### 1. 环境准备 确保已安装 Python 环境,可以通过以下命令检查版本: ```bash python --version ``` 如果尚未安装 Python,请先完成安装[^1]。 #### 2. 获取项目代码 可以从 GitHub 或其他镜像站点克隆相关项目代码。例如,`sp800_22_tests` 是一个常用的实现项目,支持 NIST SP 800-22 的测试功能。克隆命令如下: ```bash git clone https://github.com/dj-on-github/sp800_22_tests.git ``` 进入项目目录后,可以运行测试脚本以验证环境配置是否正确: ```bash cd sp800_22_tests python sp800_22_tests.py ``` 上述步骤能够快速启动项目并进行初步测试[^1]。 #### 3. 安装依赖项 部分项目可能需要额外的依赖库。例如,`randomness_testsuite` 提供了另一种实现方式,并要求安装必要的 Python 包[^3]。通常,可以通过以下命令安装依赖项: ```bash pip install -r requirements.txt ``` #### 4. 测试数据生成 为了执行 NIST SP 800-22 测试,需要准备一组随机数序列作为输入。可以通过以下方式生成测试数据: - 使用 Python 内置的 `random` 模块生成伪随机数。 - 调用外部硬件随机数生成器(HRNG)。 - 从文件中读取预定义的随机数序列。 例如,生成一个包含 100 万个比特的随机序列: ```python import random def generate_random_sequence(length): return ''.join(str(random.randint(0, 1)) for _ in range(length)) sequence = generate_random_sequence(1_000_000) print(sequence[:100]) # 打印前 100 位 ``` 此函数生成的序列可直接用于测试输入。 #### 5. 运行测试 将生成的随机序列传递给测试脚本。例如,在 `sp800_22_tests` 项目中,可以通过以下方式运行测试: ```bash python sp800_22_tests.py < input_sequence.txt ``` 其中,`input_sequence.txt` 是包含随机序列的文件。测试结果会显示每个子测试的通过情况及统计值[^2]。 #### 6. 结果分析 NIST SP 800-22 测试包括多个子测试,如单比特频率测试、块内频率测试、游程测试等。每个测试都会返回一个 p 值,用于判断序列是否符合随机性标准。通常,p 值应大于 0.01 才能认为序列通过测试[^4]。 --- ### 示例代码:运行 NIST SP 800-22 测试 以下是一个简单的示例代码,展示如何调用 `sp800_22_tests` 项目中的测试函数: ```python from sp800_22_tests import monobit_test, frequency_within_block_test # 生成随机序列 sequence = '10101010101010101010' # 单比特频率测试 monobit_result = monobit_test(sequence) print(f"Monobit Test: {monobit_result}") # 块内频率测试 block_size = 10 frequency_result = frequency_within_block_test(sequence, block_size) print(f"Frequency Within Block Test: {frequency_result}") ``` ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值