perlab-uc3m/randlab
GitHub: perlab-uc3m/randlab
集成多种随机数生成器质量测试套件的CLI工具。
Stars: 0 | Forks: 0
# randlab
### 安装
安装程序在存在时重用管理的源缓存,或者从官方GitHub仓库克隆。它运行 `configure` 和 `make`,然后构建 `.randlab/tools/testu01/testu01_file_runner`,这是一个小的C程序,它静态链接到构建的TestU01库,并调用官方的文件电池函数,而不修改上游源。
### 数据大小要求
TestU01文件电池需要一个二进制文件和一定数量的位来测试。对于每个测试,TestU01将文件重置并从开头开始;如果请求的位数超过文件大小,TestU01将使用可用的位。包装器从活动配置文件中选择一个固定的位数:
| 配置文件 | 测试位数 | 最小输入 |
|---------|-------------|---------------|
| `quick` | 2^20 bits | 131,072 bytes |
| `nist-minimum` | 2^25 bits | 4,194,304 bytes |
| `paper` | 2^30 bits | 134,217,728 bytes |
`Rabbit` 是广泛的二进制位流电池。`Alphabit` 特别针对硬件随机位发生器,并测试重叠的位模式。`BlockAlphabit` 在位块重新排序后重复 Alphabit,因此是三者中最慢的。
### 输出和指标
适配器抑制了TestU01的每个测试的详细输出,并解析最终的总结报告。它记录电池名称、测试位数、统计数量以及TestU01报告的每个p值,这些p值在它的怀疑区间 `[0.001, 0.9990]` 之外。如果出现任何可疑的p值,则标记套件为 `failed`,如果总结报告说所有测试都通过,则标记为 `passed`。
### 运行
```
# 快速烟雾测试(2^20位 / 128 KiB 输入)
randlab run --input sample.bin --format raw --suite testu01-rabbit --profile quick --out results/testu01-smoke
# 更大的二进制文件电池
randlab run --input sample.bin --format raw --profile paper \
--suite testu01-rabbit --suite testu01-alphabit --suite testu01-block-alphabit \
--out results/testu01-001
# 使用一条命令运行所有注册的套件;跳过缺失的可选工具。
randlab run --input sample.bin --format raw --suite all --profile paper --out results/full-001
```
## gjrand testunif/mcp
[gjrand](https://gjrand.sourceforge.net/) 包含一个名为 `testunif/mcp` 的均匀位统计套件。3.4.4存档被保存在共享顶级 `dependencies/` 目录下,因为它是请求的SourceForge包,但其README明确说明测试套件被省略在该回溯版本中。因此,包装器从 gjrand 4.3.0 构建了 `testunif/mcp` 套件,这是包含这些程序的最新存档。
### 安装
gjrand 是默认安装集的一部分:
```
randlab deps install
```
如果需要,安装程序从 SourceForge 下载 `gjrand.4.3.0.tar.bz2`,将其提取到管理的源缓存中,使用包的 POSIX shell 编译脚本构建 gjrand 库和 `testunif` 二进制文件,并将可运行的套件安装到 `.randlab/tools/gjrand/testunif/`。
### 数据大小要求
`mcp` 从 stdin 读取原始二进制字节,并在子测试之间重置 stdin,因此包装器直接将输入文件作为可寻址的 stdin 处理打开。配置文件选择 mcp 大小参数:
| 配置文件 | mcp 大小 | 最小输入 |
|---------|----------|---------------|
| `quick` | `10M` (`--tiny`) | 10,485,760 bytes |
| `nist-minimum` | `100M` (`--small`) | 104,857,600 bytes |
| `paper` | `1G` (`--standard`) | 1,073,741,824 bytes |
低于所选配置文件最小值的输入仍然通过常见的警告路径传递,但如果子测试无法读取它期望的字节,`mcp` 本身会报告问题。
### 输出和指标
`mcp` 运行 13 个均匀位子测试,并打印单侧 P 值,其中较小的数字更差。适配器记录每个子测试 P 值以及最终总结行中的 `overall_p_value`:
```
Overall summary one sided P-value (smaller numbers bad)
P = 0.948 : ok
```
如果最终 P 值在或低于 `1e-6`,则标记套件为 `failed`;如果它在或低于 `0.1`,则仅发出警告;否则,标记为 `passed`。如果单个子测试 P 值在或低于 `0.1`,则作为警告发出,但不会使套件失败,除非最终 P 值超过失败阈值。
### 运行
```
# 快速烟雾测试(10 MB 输入)
randlab run --input sample.bin --format raw --suite gjrand-mcp --profile quick --out results/gjrand-smoke
# 论文配置文件(1 GiB 输入要求)
randlab run --input sample.bin --format raw --suite gjrand-mcp --profile paper --out results/gjrand-001
```
## PractRand
[PractRand](https://pracrand.sourceforge.net/) 是一个读取 stdin 中的原始字节并评估它们在可配置的上限(`tlmax`)内增加的数据大小的 C++ 统计测试电池。
与 NIST SP 800-22 不同,它不需要预先分割成位流,并且可以使用大量更少的数据检测到弱生成器。
### 安装
PractRand 是默认安装集的一部分。不需要额外的标志:
```
randlab deps install # downloads, extracts, and compiles PractRand automatically
```
首次运行时,安装程序:
1. 从 SourceForge 下载 `PractRand_0.96.zip` 到管理的源缓存。
2. 在该缓存中提取源树。
3. 使用 `g++` 编译静态库和 `RNG_test` 二进制文件。
4. 将二进制文件放置在 `.randlab/tools/practrand/RNG_test`。
后续调用如果源已存在,则跳过下载和提取。
先决条件:PATH 上的 `g++` (`sudo apt-get install g++` 或 `randlab deps install --install-system`)。
### 数据大小要求
包装器通过 stdin 管道将原始字节喂给 `RNG_test stdin`,并通过 `-tlmax` 传递以限制消耗的总字节数。配置文件确定 `tlmax`:
| 配置文件 | `tlmax` | 报告的检查点 |
|---------|---------|---------------------|
| `quick` | 1 MB (1,048,576 bytes) | 256 KB, 512 KB, 1 MB |
| `nist-minimum` | 64 MB (67,108,864 bytes) | 8 MB, 16 MB, 32 MB, 64 MB |
| `paper` | 256 MB (268,435,456 bytes) | 32 MB, 64 MB, 128 MB, 256 MB |
`-tlmin` 设置为 `max(256 KB, tlmax / 8)`,以确保至少有两个中间检查点。
输入文件必须包含 **至少** `tlmax` 字节;`RNG_test` 读取这么多字节后才会生成其最终报告。
### 输出和指标
PractRand 在消耗数据量加倍后打印检查点行和异常行(如果有):
```
length= 256 megabytes (2^28 bytes), time= 4.1 seconds
no anomalies in 1520 test result(s)
```
适配器将每行异常解析为 `Metric`:
| 字段 | 内容 |
|-------|---------|
| `name` | PractRand 测试 ID,例如 `!BirthdaySpacings`,`BCFN(2+2,13-1,T)` |
| `value` | 报告的 p 值 |
| `passed` | 对于 `mildly suspicious`/`suspicious` 为 `True`;对于 `FAIL` 为 `False` |
| `details` | `{"assessment": "...", "checkpoint": "256 megabytes"}` |
总是附加一个 `total_tests_at_final_checkpoint` 摘要指标。如果找到任何 `FAIL` 级别的异常,则整体套件状态为 `failed`;`suspicious` 和 `very suspicious` 异常产生警告,但不会使套件失败。
### 运行
```
# 论文配置文件(256 MB 输入要求)
randlab run --input sample.bin --format raw --suite practrand --profile paper --out results/practrand-001
# 快速烟雾测试(1 MB 输入)
randlab run --input sample.bin --format raw --suite practrand --profile quick --out results/practrand-smoke
# 与其他套件结合运行
randlab run --input sample.bin --format raw --profile paper \
--suite practrand --suite nist-sts --suite entropy-iid \
--out results/combined-001
```
标签:AIS 20/31, API安全, CSV输出, Cutter, C程序, Dieharder, GM/T 0005-2021, JSON输出, NIST标准, pocsuite3, PractRand, p值分析, SP 800-90B, TestU01, 事件追踪, 二进制文件, 代码库管理, 安全测试, 性能测试, 攻击性安全, 数据质量, 文件测试, 测试失败, 测试套件, 测试工具, 测试结果, 测试统计, 测试输出, 测试通过, 测试配置, 硬件随机数发生器, 软件测试, 逆向工具, 随机数生成, 静态链接