randomness

package module
v1.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 26, 2023 License: MIT Imports: 9 Imported by: 0

README

Randomness 二元序列随机性检测方法

Documentation GitHub go.mod Go version GitHub tag (latest SemVer)

在使用randomness前,请务必悉知 《randomness 免责声明》

项目概述

该工具库实现了《GM/T 0005-2021 随机性检测规范》中描述的15种随机性检测方法。

rundesp.png

检测工具

若您需要使用相关测试工具需要可以 从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_test.go

如果您的主机处理器含有多个核心,那么可以使用Fast系列的API来加速检测,见 测试用例 detect_fast_test.go

注意:离散傅里叶检测 10^8 bit 规模数据检测为了加速计算单次检测需要消耗1024MB以上内存,请注意主机并发数量防止发生内存溢出(OOM)。

发展

检测规范:

在 GM/T 0005-2021 中在 样本通过率判定 的基础上,增加了 样本均匀性判定 作为检测通过判定依据,详见 GM/T 0005-2021 6.3。

目前 randomness 已经升级至《GM/T 0005-2021 随机性检测规范》。

Documentation

Index

Constants

View Source
const (
	MAXLOG float64 = 7.09782712893383996732224e2 // log(MAXNUM)

	MACHEP float64 = 1.11022302462515654042e-16
)
View Source
const Alpha = 0.01

Alpha 显著性水平α

View Source
const AlphaT float64 = 0.0001

AlphaT 分布均匀性的显著性水平

Variables

View Source
var TestMethodArr = []TestItem{
	{"单比特频数检测", MonoBitFrequency},
	{"块内频数检测", FrequencyWithinBlock},
	{"扑克检测", Poker},
	{"重叠子序列检测", OverlappingTemplateMatching},
	{"游程总数检测", Runs},
	{"游程分布检测", RunsDistribution},
	{"块内最大“1”游程检测", LongestRunOfOnesInABlock},
	{"二元推导检测", BinaryDerivative},
	{"自相关检测", Autocorrelation},
	{"矩阵秩检测", MatrixRank},
	{"累加和检测", Cumulative},
	{"近似熵检测", ApproximateEntropy},
	{"线型复杂度检测", LinearComplexity},
	{"通用统计检测", MaurerUniversal},
	{"离散傅里叶检测", DiscreteFourierTransform},
}

TestMethodArr 测试方法序列

Functions

func ApproximateEntropyProto

func ApproximateEntropyProto(bits []bool, m int) (float64, float64)

ApproximateEntropyProto 近似熵检测, The purpose of the test is to compare the frequency of overlapping blocks of two consecutive/adjacent lengths (m and m+1) against the expected result for a random sequence. 这个实现参考自NIST的参考实现。 Reference:

https://csrc.nist.gov/CSRC/media/Projects/Random-Bit-Generation/documents/sts-2_1_2.zip
https://github.com/arcetri/sts/blob/master/src/tests/approximateEntropy.c

bits: 待检测序列 m: m长度

func ApproximateEntropyTest

func ApproximateEntropyTest(bits []bool) (float64, float64)

ApproximateEntropyTest 近似熵检测,m=5

func ApproximateEntropyTestBytes

func ApproximateEntropyTestBytes(data []byte, m int) (float64, float64)

ApproximateEntropyTestBytes 近似熵检测

func AutocorrelationProto

func AutocorrelationProto(bits []bool, d int) (float64, float64)

AutocorrelationProto 自相关检测 bits: 待检测序列 d: d=1,2,8,16

func AutocorrelationTest

func AutocorrelationTest(bits []bool, d int) (float64, float64)

AutocorrelationTest 自相关检测,d=16

func AutocorrelationTestBytes

func AutocorrelationTestBytes(data []byte, d int) (float64, float64)

AutocorrelationTestBytes 自相关检测 data: 待检测序列 d: d=1,2,8,16

func B2Byte

func B2Byte(arr []bool) byte

B2Byte bool数组 转换为 字节

func B2bit

func B2bit(b byte) []bool

B2bit 字节 转换为 bool数组

func B2bitArr

func B2bitArr(src []byte) []bool

B2bitArr 转换字节数组为比特序列

func BinaryDerivativeProto

func BinaryDerivativeProto(bits []bool, k int) (float64, float64)

BinaryDerivativeProto 二元推导检测 bits: 待检测序列 k: 重复次数,k=3,7

func BinaryDerivativeTest

func BinaryDerivativeTest(bits []bool, k int) (float64, float64)

BinaryDerivativeTest 二元推导检测, k=7

func BinaryDerivativeTestBytes

func BinaryDerivativeTestBytes(data []byte, k int) (float64, float64)

BinaryDerivativeTestBytes 二元推导检测 bits: 待检测序列 k: 重复次数,k=3,7

func CumulativeTest

func CumulativeTest(bits []bool, forward bool) (float64, float64)

CumulativeTest 累加和检测 forward: true 前向, false 后向

func CumulativeTestBytes

func CumulativeTestBytes(data []byte, forward bool) (float64, float64)

CumulativeTestBytes 累加和检测 forward: true 前向, false 后向

func DiscreteFourierTransformTest

func DiscreteFourierTransformTest(bits []bool) (float64, float64)

DiscreteFourierTransformTest 离散傅里叶检测

func DiscreteFourierTransformTestBytes

func DiscreteFourierTransformTestBytes(data []byte) (float64, float64)

DiscreteFourierTransformTestBytes 离散傅里叶检测

func FrequencyWithinBlockProto

func FrequencyWithinBlockProto(bits []bool, m int) (float64, float64)

FrequencyWithinBlockProto 块内频数检测

func FrequencyWithinBlockTest

func FrequencyWithinBlockTest(bits []bool) (float64, float64)

FrequencyWithinBlockTest 块内频数检测, m = 10000 for bits = 1000_000

func FrequencyWithinBlockTestBytes

func FrequencyWithinBlockTestBytes(data []byte, m int) (float64, float64)

FrequencyWithinBlockTestBytes 块内频数检测

func GroupBit

func GroupBit() []bool

GroupBit 生成一组 10^6 比特的检测序列

func GroupSecBit

func GroupSecBit() []bool

GroupSecBit 生成一组测试数据 长度为 10^6 比特

func Igamc

func Igamc(a, x float64) float64

func LinearComplexityProto

func LinearComplexityProto(bits []bool, m int) (float64, float64)

LinearComplexityProto 线型复杂度检测 bits: 待检测序列 m: m长度

func LinearComplexityTest

func LinearComplexityTest(bits []bool) (float64, float64)

LinearComplexityTest 线型复杂度检测,m=500

func LinearComplexityTestBytes

func LinearComplexityTestBytes(data []byte, m int) (float64, float64)

LinearComplexityTestBytes 线型复杂度检测 data: 待检测序列 m: m长度

func LongestRunOfOnesInABlockProto

func LongestRunOfOnesInABlockProto(bits []bool, checkOne bool) (float64, float64)

LongestRunOfOnesInABlockProto 块内最大游程检测 bits: 待检测序列 m: m长度, m = 10000, k=6 for bits = 1000_000

func LongestRunOfOnesInABlockTest

func LongestRunOfOnesInABlockTest(bits []bool, checkOne bool) (float64, float64)

LongestRunOfOnesInABlockTest 块内最大游程检测,m=10000 for bits = 1000_000

func LongestRunOfOnesInABlockTestBytes

func LongestRunOfOnesInABlockTestBytes(data []byte, checkOne bool) (float64, float64)

LongestRunOfOnesInABlockTestBytes 块内最大游程检测

func MatrixRankProto

func MatrixRankProto(bits []bool, M, Q int) (float64, float64)

MatrixRankProto 矩阵秩检测 bits: 待检测序列 M: 矩阵行数 Q: 矩阵列隶属

func MatrixRankTest

func MatrixRankTest(bits []bool) (float64, float64)

MatrixRankTest 矩阵秩检测,M=Q=32

func MatrixRankTestBytes

func MatrixRankTestBytes(data []byte, M, Q int) (float64, float64)

MatrixRankTestBytes 矩阵秩检测

func MaurerUniversalTest

func MaurerUniversalTest(bits []bool) (float64, float64)

MaurerUniversalTest Maurer通用统计检测方法

func MaurerUniversalTestBytes

func MaurerUniversalTestBytes(data []byte) (float64, float64)

MaurerUniversalTestBytes Maurer通用统计检测方法

func MonoBitFrequencyTest

func MonoBitFrequencyTest(bits []bool) (float64, float64)

MonoBitFrequencyTest 单比特频数检测

func MonoBitFrequencyTestBytes

func MonoBitFrequencyTestBytes(data []byte) (float64, float64)

MonoBitFrequencyTestBytes 单比特频数检测 这里直接对字节直接处理,避免字节切片到位切片的转换,同时提高效率。

func OverlappingTemplateMatchingProto

func OverlappingTemplateMatchingProto(bits []bool, m int) (p1 float64, p2 float64, q1 float64, q2 float64)

OverlappingTemplateMatchingProto 重叠子序列检测方法 bits: 检测序列 m: m长度,m=3,5 return:

p1: P-value1
p2: P-value2

func OverlappingTemplateMatchingTest

func OverlappingTemplateMatchingTest(bits []bool) (p1 float64, p2 float64, q1 float64, q2 float64)

OverlappingTemplateMatchingTest 重叠子序列检测方法,m=5 bits: 检测序列 return:

p1: P-value1
p2: P-value2

func OverlappingTemplateMatchingTestBytes

func OverlappingTemplateMatchingTestBytes(data []byte, m int) (p1 float64, p2 float64, q1 float64, q2 float64)

OverlappingTemplateMatchingTestBytes 重叠子序列检测方法 data: 检测序列 m: m长度,m=2,5 return:

p1: P-value1
p2: P-value2

func PokerProto

func PokerProto(bits []bool, m int) (float64, float64)

PokerProto 扑克检测 bits: 检测序列 m: m长度,m=4,8

func PokerTest

func PokerTest(bits []bool) (float64, float64)

PokerTest 扑克检测,m=8

func PokerTestBytes

func PokerTestBytes(data []byte, m int) (float64, float64)

PokerTestBytes 扑克检测 这里直接对字节直接处理,避免字节切片到位切片的转换,同时提高效率。

data: 检测序列 m: m长度,m=4,8

func ReadGroup

func ReadGroup(filename string) []bool

ReadGroup 从文件中读取一组二元序列

func ReadGroupInASCIIFormat

func ReadGroupInASCIIFormat(filename string) []bool

ReadGroupInASCIIFormat

func RunsDistributionTest

func RunsDistributionTest(bits []bool) (float64, float64)

RunsDistributionTest 游程分布检测

func RunsDistributionTestBytes

func RunsDistributionTestBytes(data []byte) (float64, float64)

RunsDistributionTestBytes 游程分布检测

func RunsTest

func RunsTest(bits []bool) (float64, float64)

RunsTest 游程总数检测

func RunsTestBytes

func RunsTestBytes(data []byte) (float64, float64)

RunsTestBytes 游程总数检测

Types

type TestFunc

type TestFunc func([]byte) *TestResult

TestFunc 测试方法

type TestItem

type TestItem struct {
	Name string // 检测名称
	// 检测方法
	Runner TestFunc
}

TestItem 测试项目

type TestResult

type TestResult struct {
	Name string  // 检测名称
	P    float64 // 检测结果P_value1
	Q    float64 // 检测结果Q_value1
	P2   float64 // 检测结果P_value2
	Q2   float64 // 检测结果Q_value2
	Pass bool    // 是否大于等于显著水平
}

TestResult 检测结果

func ApproximateEntropy

func ApproximateEntropy(data []byte) *TestResult

ApproximateEntropy 近似熵检测,m=5

func Autocorrelation

func Autocorrelation(data []byte) *TestResult

Autocorrelation 自相关检测,d=16

func BinaryDerivative

func BinaryDerivative(data []byte) *TestResult

BinaryDerivative 二元推导检测, k=7

func Cumulative

func Cumulative(data []byte) *TestResult

Cumulative 累加和检测

func DiscreteFourierTransform

func DiscreteFourierTransform(data []byte) *TestResult

DiscreteFourierTransform 离散傅里叶检测

func FrequencyWithinBlock

func FrequencyWithinBlock(data []byte) *TestResult

FrequencyWithinBlock 块内频数检测, m = 10000 for bits = 1000_000

func LinearComplexity

func LinearComplexity(data []byte) *TestResult

LinearComplexity 线型复杂度检测,m=500

func LongestRunOfOnesInABlock

func LongestRunOfOnesInABlock(data []byte) *TestResult

LongestRunOfOnesInABlock 块内最大游程检测,m=10000, k=6 for bits = 1000_000

func MatrixRank

func MatrixRank(data []byte) *TestResult

MatrixRank 矩阵秩检测,M=Q=32

func MaurerUniversal

func MaurerUniversal(data []byte) *TestResult

MaurerUniversal Maurer通用统计检测方法

func MonoBitFrequency

func MonoBitFrequency(data []byte) *TestResult

MonoBitFrequency 单比特频数检测

func OverlappingTemplateMatching

func OverlappingTemplateMatching(data []byte) *TestResult

OverlappingTemplateMatching 重叠子序列检测方法,m=5

func Poker

func Poker(data []byte) *TestResult

Poker 扑克检测,m=8

func Runs

func Runs(data []byte) *TestResult

Runs 游程总数检测

func RunsDistribution

func RunsDistribution(data []byte) *TestResult

RunsDistribution 游程分布检测

Directories

Path Synopsis
tools

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL