randomness

package module
v1.3.3 Latest Latest
Warning

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

Go to latest
Published: Nov 11, 2022 License: MIT Imports: 9 Imported by: 0

README

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

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

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

快速入门

您可以通过下面命令安装randomness

go get -u github.com/Trisia/randomness

如何检测?

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)
}

randomness 实现了 《GM/T 0025-2014 SSL VPN 网关产品规范》 5.4.4.3 随机数发生器 4个不同应用阶段的随机数检测:

使用方法见 测试用例

如果您的处理含有多个核心你可以使用Fast系列的API来加速检测,见 测试用例

概述

检测规范:

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

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

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

检测参数说明:

  • 样本长度:10^6比特
  • 显著水平:α = 0.01
  • 样本均匀性分布检测的显著性水平: ατ = 0.0001
  • 子区间数量: k = 10

各算法检测参数如下:

序号 检测项目 参数
1 单比特频数检测 -
2 块内频数检测 m = 10000
3 扑克检测 m = 4,8
4 重叠子序列检测 m = 3,5
5 游程总数检测 -
6 游程分布检测 -
7 块内最大游程检测 m = 10000
8 二元推导检测 k = 3,7
9 自相关检测 d = 1,2,8,16
10 矩阵秩检测 -
11 累加和检测 -
12 近似熵检测 m = 2,5
13 线型复杂度检测 m = 500,1000
14 Maurer通用统计检测 L=7,Q=1280
15 离散傅里叶检测 -

工具

若您需要使用相关测试工具需要您手动编译程序,详见相应工具说明文档:

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 近似熵检测 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 累加和检测

func CumulativeTestBytes

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

CumulativeTestBytes 累加和检测

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