NIST随机性检测(python)

David Johnston 在 GitHub 上发布了一个名为 sp800_22_tests 的工具,网址是:https://github.com/dj-on-github/sp800_22_tests ,它是一个用 Python 语言写的程序集,能够根据 NIST SP 800-22 文档的要求,检测随机数集合的随机性,包括以下 15 种测试种类:

monobit_test
frequency_within_block_test
runs_test
longest_run_ones_in_a_block_test
binary_matrix_rank_test
dft_test
non_overlapping_template_matching_test
overlapping_template_matching_test
maurers_universal_test
linear_complexity_test
serial_test
approximate_entropy_test
cumulative_sums_test
random_excursion_test
random_excursion_variant_test

重要提示: 由于最开始的整体的代码是通过命令行来做的,所以有人对此进行了一个整合,在下载源代码的基础上,复制下列代码到工程目录,然后运行。下面代码主要就是把单个文件中的方法集中到一个文件,大家可以根据需要更改相关内容

import        sp800_22_monobit_test
import        sp800_22_frequency_within_block_test
import        sp800_22_runs_test
import        sp800_22_longest_run_ones_in_a_block_test
import        sp800_22_binary_matrix_rank_test
import        sp800_22_dft_test
import        sp800_22_non_overlapping_template_matching_test
import        sp800_22_overlapping_template_matching_test
import        sp800_22_maurers_universal_test
import        sp800_22_linear_complexity_test
import        sp800_22_serial_test
import        sp800_22_approximate_entropy_test
import        sp800_22_cumulative_sums_test
import        sp800_22_random_excursion_test
import        sp800_22_random_excursion_variant_test

bits=[1,1,0,1,0,0,1,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,1,1,1,1,
          0,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,
          0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,1,0,
          0,1,1,0,0,0,1,1,1,0,1,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,1,
          0,0,0,1,1,0,1,0,1,1,1,0,0,1,1,1,1,1,0,0,0] 

results = list()
def all():
        
        print('------------------------------------------------------')
        print('monobit_test')
        success,p,plist=sp800_22_monobit_test.monobit_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('monobit_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('frequency_within_block_test')
        (success,p,plist) =sp800_22_frequency_within_block_test.frequency_within_block_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('frequency_within_block_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('runs_test')
        (success,p,plist) =sp800_22_runs_test.runs_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('runs_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('longest_run_ones_in_a_block_test')
        (success,p,plist) =sp800_22_longest_run_ones_in_a_block_test.longest_run_ones_in_a_block_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('longest_run_ones_in_a_block_test',summary_p, summary_result))

        print('------------------------------------------------------')
        print('binary_matrix_rank_test')
        (success,p,plist) =sp800_22_binary_matrix_rank_test.binary_matrix_rank_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('binary_matrix_rank_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('dft_test')
        (success,p,plist) =sp800_22_dft_test.dft_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('dft_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('non_overlapping_template_matching_test')
        (success,p,plist) =sp800_22_non_overlapping_template_matching_test.non_overlapping_template_matching_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('non_overlapping_template_matching_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('overlapping_template_matching_test')
        (success,p,plist) =sp800_22_overlapping_template_matching_test.overlapping_template_matching_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('overlapping_template_matching_test',summary_p, summary_result))



        print('------------------------------------------------------')
        print('maurers_universal_test')
        (success,p,plist) =sp800_22_maurers_universal_test.maurers_universal_test(bits,2,4)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('maurers_universal_test',summary_p, summary_result))



        print('------------------------------------------------------')
        print('linear_complexity_test')
        (success,p,plist) =sp800_22_linear_complexity_test.linear_complexity_test(bits,7)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('linear_complexity_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('serial_test')
        (success,p,plist) =sp800_22_serial_test.serial_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('serial_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('approximate_entropy_test')
        (success,p,plist) =sp800_22_approximate_entropy_test.approximate_entropy_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            summary_p = str(min(plist))
        results.append(('approximate_entropy_test',summary_p, summary_result))

        
        print('------------------------------------------------------')
        print('cumulative_sums_test')
        (success,p,plist) =sp800_22_cumulative_sums_test.cumulative_sums_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            print('p=', str(min(plist)))
            summary_p = str(min(plist))
        results.append(('cumulative_sums_test',summary_p, summary_result))


        print('------------------------------------------------------')
        print('random_excursion_test')
        (success,p,plist) =sp800_22_random_excursion_test.random_excursion_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            print('p=', str(min(plist)))
            summary_p = str(min(plist))
        results.append(('random_excursion_test',summary_p, summary_result))

        print('------------------------------------------------------')
        print('random_excursion_variant_test')
        (success,p,plist) =sp800_22_random_excursion_variant_test.random_excursion_variant_test(bits)
        if success:
            print ("  PASS")
            summary_result = "PASS"
        else:
            print( "  FAIL")
            summary_result = "FAIL"
        
        if p != None:
            print ("  P="+str(p))
            summary_p = str(p)
            
        if plist != None:
            print('p=', str(min(plist)))
            summary_p = str(min(plist))
        results.append(('random_excursion_variant_test',summary_p, summary_result))
        



if __name__ == "__main__":
    all()
    print('**************************************************************************')
    for result in results:
        (summary_name,summary_p, summary_result) = result
        print (summary_name.ljust(40),summary_p.ljust(28),summary_result)
    
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值