随机性检测的五项基本检测方法

192 篇文章 58 订阅
83 篇文章 47 订阅

五项基本检测包括

  • 频数检验(F-检验)
  • 序偶检验(S-检验)
  • 扑克检验(P-检验)
  • 游程检验(R-检验)
  • 自相关检验(A-检验)

1. 频数检验(F-检验)

目的:F-检验用来保证"0""1"的个数大致相同

输入n比特序列样本Z,显著性水平α

输出:检验通过或检验失败

步骤:(参见文[1]的5.4.4节)

1. 在此序列截断中统计比特“0”和“1”的个数,分别记为n_0n_1

2. 计算检验统计量

V=\frac{(n_0-n_1)^2}{n}

(该检验统计量服从自由度为1的开方分布)

3. 计算P-value=igamc(1/2,V/2)。如果P-value\geq \alpha,则认为待检序列通过本检验。

注1:步骤3和也可改为比较验统计量V与其对应的临界值B(显著性水平α与临界值B的部分取值如下表),即,如果V\leq B,则认为待检序列通过本检验。

表1 F-检验的显著性水平与临界值B的部分取值

显著性水平α

临界值B

0.05

3.841

0.01

6.635

0.001

10.828

0.0001

15.137

2. 序偶检验(S-检验)

目的:F-检验用来保证合理的转移概率:连续码彼此相同或相异的概率大致相

等,即每个比特都独立于它前面的比特。

输入n比特序列样本Z,显著性水平α

输出:检验通过或检验失败

步骤:(参见文[1]的5.4.4节)

1. 在此序列截断中统计比特串“00”、“01”、“10”、“11”的个数,分别记为n00,n01,n10,n11;统计比特“0”和“1”的个数,分别记为n0,n1

2. 计算检验统计量

(该检验统计量近似服从自由度为2的开方分布)

3. 计算P-value=igamc(1,V/2)。如果P-value\geq \alpha,则认为待检序列通过本检验。

注1:步骤3和也可改为比较验统计量V与其对应的临界值B(显著性水平α、临界值B的部分取值如下表),即,如果V\leq B,则认为待检序列通过本检验。

表2 S-检验的显著性水平α与临界值B的部分取值

显著性水平α

临界值B

0.05

5.991

0.01

9.210

0.001

13.816

0.0001

18.421

3. 扑克检验(P-检验)

同GM/T 0005-2012《随机性检测规范》的扑克检测。

算法描述略。

表3 S-检验的显著性水平α与临界值B的部分取值

显著性水平α

临界值B

(m=4)

临界值B

(m=8)

0.05

24.996

293.248

0.01

30.578

310.457

0.001

37.697

330.520

0.0001

44.263

347.654

4. 游程检验(R-检验)

同GM/T 0005-2012《随机性检测规范》的扑克检测。

算法描述略。

表4 R-检验的显著性水平α与临界值B的部分取值

显著性水平

临界值B

0.05

1.96

0.01

2.58

0.001

3.29

0.0001

3.89

5. 自相关检验(A-检验)

同GM/T 0005-2012《随机性检测规范》的扑克检测。

算法描述略。自相关的统计量服从正态分布,表略。

参考文献

  1. A. Menezes, P. van Oorschot, S. Vanstone. Handbook of Applied Cryptography[M]. CRC Press, 1996.
  2. GM/T 0005-2012 随机性检测规范.

  • 5
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是五项基本检测方法的 Matlab 程序: 1. 频数检测 ```matlab function [p_value] = frequency_test(bits) n = length(bits); count = sum(bits); p_value = 2*min(count, n-count)/n; end ``` 2. 块频数检测 ```matlab function [p_value] = block_frequency_test(bits, block_size) n = length(bits); num_blocks = floor(n/block_size); counts = zeros(num_blocks, 1); for i = 1:num_blocks block = bits((i-1)*block_size+1:i*block_size); counts(i) = sum(block); end chi2 = ((counts - block_size/2).^2) / (block_size/2); p_value = 1 - gammainc(num_blocks/2, chi2/2); end ``` 3. 游程总数检测 ```matlab function [p_value] = runs_test(bits) n = length(bits); runs = 1; for i = 2:n if bits(i) ~= bits(i-1) runs = runs + 1; end end pi = runs / n; tau = 2 / sqrt(n); if abs(pi - 0.5) >= tau p_value = 0; else vobs = 1; for i = 2:n if bits(i) ~= bits(i-1) vobs = vobs + 1; else break; end end for i = n:-1:2 if bits(i) ~= bits(i-1) vobs = vobs + 1; else break; end end mu = (2*n - 1) / 3; sigma2 = (16*n - 29) / 90; sigma = sqrt(sigma2); z = (vobs - mu) / sigma; p_value = erfc(abs(z) / sqrt(2)); end end ``` 4. 乱数排列检测 ```matlab function [p_value] = permutation_test(bits) n = length(bits); pi = sum(bits) / n; if abs(pi - 0.5) >= 2/sqrt(n) p_value = 0; else k = 0; for i = 2:n if bits(i) ~= bits(i-1) k = k + 1; end end k = k + 1; tau = 2 / sqrt(n); if abs(k - 2*n*pi*(1-pi)) >= tau p_value = 0; else p_value = gammainc((n-1)/2, (abs(k - 2*n*pi*(1-pi))/2)^2); end end end ``` 5. 矩阵秩检测 ```matlab function [p_value] = matrix_rank_test(bits, matrix_size) n = length(bits); num_matrices = floor(n/matrix_size); counts = zeros(num_matrices, 1); for i = 1:num_matrices matrix = reshape(bits((i-1)*matrix_size+1:i*matrix_size), sqrt(matrix_size), sqrt(matrix_size)); counts(i) = rank(matrix); end mu = matrix_size*(1/2 + 1/18); sigma2 = matrix_size*(13/18 - 7/180)^2 + matrix_size*(1/6 - 1/180); sigma = sqrt(sigma2); chi2 = ((counts - mu).^2) / sigma2; p_value = 1 - gammainc(num_matrices/2, chi2/2); end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值