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)