在使用randomness前,请务必悉知 《randomness 免责声明》!
- 致谢 zhebinhu/randomnessTests 项目。
- 致谢 Sun Yimin 对本项目关键性建设。
该工具库实现了《GM/T 0005-2021 随机性检测规范》中描述的15种随机性检测方法。
- [ 1] 单比特频数检测 MonoBitFrequencyTest
- [ 2] 块内频数检测 FrequencyWithinBlockTest
- [ 3] 扑克检测 PokerTest
- [ 4] 重叠子序列检测 OverlappingTemplateMatchingTest
- [ 5] 游程总数检测 RunsTest
- [ 6] 游程分布检测 RunsDistributionTest
- [ 7] 块内最大游程检测 LongestRunOfOnesInABlockTest
- [ 8] 二元推导检测 BinaryDerivativeTest
- [ 9] 自相关检测 AutocorrelationTest
- [10] 矩阵秩检测 MatrixRankTest
- [11] 累加和检测 CumulativeTest
- [12] 近似熵检测 ApproximateEntropyTest
- [13] 线型复杂度检测 LinearComplexityTest
- [14] Maurer通用统计检测 MaurerUniversalTest
- [15] 离散傅里叶检测 DiscreteFourierTransformTest
若您需要使用相关测试工具需要可以 从Release中下载编译版本 或 手动编译程序,详见文档:
rddetector
检测工具只是randomness
的一种应用方式,randomness
提供丰富的API接口,您可以在根据需要定制化的使用。
安装randomness
:
go get -u github.com/Trisia/randomness
下面是10^6比特数据规模的扑克检测的例子:
package main
import (
"crypto/rand"
"fmt"
"github.com/Trisia/randomness"
)
func main() {
// 产生随机数序列
n := 1000_000
buf := make([]byte, n/8)
_, _ = rand.Read(buf)
// 转换为字节数组
bits := randomness.B2bitArr(buf)
// 运行测试组
p, _ := randomness.PokerTest(bits)
fmt.Printf("扑克检测 n: 1000000, P-value: %f\n", p)
}
更多API使用方法见:randomness API 文档
randomness
实现了 《GM/T 0025-2014 SSL VPN 网关产品规范》 5.4.4.3
随机数发生器 4个不同应用阶段的随机数检测:
- 出厂检测 detect.FactoryDetect
- 上电检测 detect.PowerOnDetect
- 周期检测 detect.PeriodDetect
- 单次检测 detect.SingleDetect
使用方法见 测试用例 detect_test.go
如果您的主机处理器含有多个核心,那么可以使用Fast系列的API来加速检测,见 测试用例 detect_fast_test.go
注意:离散傅里叶检测 10^8 bit 规模数据检测为了加速计算单次检测需要消耗1024MB以上内存,请注意主机并发数量防止发生内存溢出(OOM)。
检测规范:
- 《GM/T 0005-2012 随机性检测规范》 已废止
- 《GB/T 32915-2016 信息安全技术 二元序列随机性检测方法》
- 《GM/T 0005-2021 随机性检测规范》
在 GM/T 0005-2021 中在 样本通过率判定 的基础上,增加了 样本均匀性判定 作为检测通过判定依据,详见 GM/T 0005-2021 6.3。
目前 randomness 已经升级至《GM/T 0005-2021 随机性检测规范》。