NIST数字测试套件使用说明
NIST 測試套件是由15個測試組成的統計軟件包,這些是為了測試隨機(任意長度)由基于硬件或軟件的密碼隨機或偽隨機數生成器產生的二進制序列。測試關注于各種不同類型的已存在的非隨機序列。有些測試可以分成各種子測試。
15個測試主要是(屬于密碼算法安全測試方法):
??? ? ?? 10、線性復雜度測試
???????? 11、系列(Serial)測試
???????? 12、近似熵測試
???????? 13、累積和測試
???????? 14、隨機游程(Random Excursions)測試
???????? 15、隨機游程變量(Random Excursions Variant)測試
這里沒有依賴性(擴散與混亂)---完備性與雪崩效應測試、自相關測試和Lempel-Ziv壓縮測試。
?
?
下載的軟件sts-2.1.2壓縮包中,解壓后源文件中有上述的密碼算法安全測試的源碼,如下
若在windows下,由于該軟件是基于linux環境開發的,里面的源文件由makefile控制,要想在windows下使用,則需要借助另一軟件Cygwin。
Cygwin官網下載地址:http://www.cygwin.com/
安裝使用該軟件參考:http://www.programarts.com/cfree_ch/doc/help/UsingCF/CompilerSupport/Cygwin/Cygwin1.htm
上面有詳細講說,但對于這個隨機數測試包需要注意的主要是一下幾點:
1、下載安裝的時候一定注意要把組件都勾上,特別是gcc一定要勾上,如果不知道怎么選,那就有gcc的地方全勾上吧。因為需要gcc這個編譯器。
2、運行Cygwin,進入該軟件包sts-2.1.1中包含makefile文件的文件夾,輸入:make命令,該軟件就在安裝了,完后之后會發現多了一個文件(assess.exe),那個就是可執行文件了。有了它就安裝成功了。
?
還可以參考一下鏈接:https://wenku.baidu.com/view/dc0ada02eff9aef8941e0644.html
?
由于本機本身裝有虛擬機及ubuntu系統,所以直接在Linux操作系統下安裝。步驟如下:
?
?
下面舉例說明
?
基本測試用matlab寫一個隨機數矩陣(x = randsrc(1,32e3,[0,1]);
)把數據復制到txt文本中,然后把隨機數矩陣的文本array.txt復制到該目錄下,
?
根據生成器提示選擇0輸入文件,輸入array.txt,之后則是選擇測試類型,即上面的15種測試類型。
?
或者測試全部,它有一個提示可以測試上述15種測試,即Enter Choice輸入1
?
How many bitstreams? 輸入流個數;這個流個數和第一步中的文件位長度存在這樣關系:
位長度*bitstreamsnum=文件總位長度。一般隨機數文件在32M以內(2G內存支持),bitstreamsnum默認輸入1,第一步輸入文件總bit長度。如果文件超過32M那么計算過 程中內從不足,因此需要第一步輸入文件總長度的1/8、1/16...,然后在此處輸入8、16,等價于把源文件劃分為等長的幾條流,來做隨機性檢查。
Bitstreams輸入默認1后,下面會問輸入文件的形式是ASCII類型的數據構成的序列(ASCII 中的0和1)還是8位的二進制數據。
最后完成后的結果在該目錄下的experiments/AlgorithmTesting下的某種測試目錄下
每種算法目錄下都有stats.txt 文件中描述的是P-value值,在ALPHA = 0.0100條件下(默認值),貌似這個值大于0.01就表示差不多隨機,越大越好。
?
注意:使用所有測試時,參數設置如下,但是可能數據長度并不適合某些測試,所以最后只有13種統計測試完成。
?
?
?
測試方法參看:https://wenku.baidu.com/view/020b8df47c1cfad6195fa7e0.html
偽隨機性是密碼算法安全性的重要指標,用于評估密碼算法的偽隨機性,其原理一般是假設檢驗,一般要求接收水平Pv>0.01
比如看動向(Run)測試結果不符合統計量標準PI=0.280969
單比特動向測試是檢測算法f的輸出在0和1之間擺動的次數,其測試方法如下:
測試數據文件,有幾個示例在下面這個文件夾中
1M二進制比特位數據
這個地方輸入表示的是15個測試中哪些測試是需要應用在該序列中,1表示應用,0表示不應用,這里就是表示重疊字匹配測試(Overlapping Template Matchings)
我們照著樣例文件寫數據,按照示例測試data.pi數據:
Data.pi數據中的二進制數我們可以先復制到test.txt文件中,再用matlab讀取數據
clc;clear;
res = textread('test.txt','%s');
?
%res為待轉換的cell
for n=1:length(res)
????? x{n}=str2num(res{n});
end
for m=1:length(x)
????? y(m)=x{m}(1);
end
% format longG
得到data.pi中的數據總共有1004932個二進制數
The file finalAnalysisReport.txt contains the results of these two forms of analysis.
這里在sts目錄下的experiments/AlgorithmTesting的finalAnalysisReport.txt文件中可以看到所有測試的結果。注意這里data.pi輸入數據是100000的值,那么./assess 100000就得寫10萬,不然會報數據不夠的錯誤。
列C1-10代表相對應的p值的頻率,列ProPortion代表二進制序列通過的比率。if 1000 binary sequences were tested (i.e., m= 1000), α= 0.01 (the significance level), and 996 binary sequences had P-values ≥.01, then the proportion is 996/1000 = 0.9960.
二進制序列長度就改how many bitstreams的位置。(只是需要注意./assess 長度*bitstreams長度要小于原數據總的數據長度)
?
./assess 長度,這里的長度是一組的長度,所以要注意序列的位數一定要足夠,不然測試會報數據不夠的錯誤。
./assess 10000(數據長度改小測試一下),結果如下
上述結果是bitstreams=100時的結果,bitstreams是測試樣例中有多少組數據,proportion表示比特流中的比率
nistspecialpublication800-22r1a說明文檔中,91頁寫到一般建議和規范,告訴我們為什么數據集沒有通過統計測試:
通常需要考慮的參數有:序列長度,樣本大小,塊大小和模板(template)。
樣本大小:The issue of sample size is tied to the choice of the significance level. NIST recommends that, for these tests, the user should fix the significance level to be at least 0.001, but no larger than 0.01.
If a sample of only 100 sequences is selected, it would be rare to observe a rejection.
Thus, the sample should be on the order of the inverse of the significance level (α-1). That is, for a level of 0.001, a sample should have at least 1000 sequences.
塊大小:Block sizes are dependent on the individual statistical test. In the case of Maurer's Universal Statistical test, block sizes range from 1 to 16.
一般情況下,NIST建議選擇的塊大小不大于log2 n,n是序列長度。
自己寫個數據測試一下:
Matlab:
pop=round(rand(1000,25));
xlswrite('b',cellstr(reshape(sprintf(['''' repmat('%d',1,size(pop,2))],pop.'),[],size(pop,1))'))
???????? 寫到xls表格中,然后拷貝到txt文件中
???????? 然后在ubuntu系統下按照上面的步驟測試該txt文本中的ASCII碼表,最后測試完成后會出現錯誤:Segmentation fault (core dumped)
?????? Segmentation fault (core dumped)多為內存不當操作造成。空指針、野指針的讀寫操作,數組越界訪問,破壞常量等。如最近的勢能圖代碼中的鏈表操作,對鏈表的新增和釋放包括賦值等等,如出現不當操作都有可能造成程序崩潰。對每個指針聲明后進行初始化為NULL是避免這個問題的好辦法。排除此問題的最好辦法則是調試。
ulimit為shell內建指令,可用來控制shell執行程序的資源 ?-a顯示目前資源限制的設定。
Stack size這里是8192kbytes最大上限2G
參 數:
?? -a 顯示目前資源限制的設定。?
?? -c <core文件上限> 設定core文件的最大值,單位為區塊。?
?? -d <數據節區大小> 程序數據節區的最大值,單位為KB。?
?? -f <文件大小> shell所能建立的最大文件,單位為區塊。?
?? -H 設定資源的硬性限制,也就是管理員所設下的限制。?
?? -m <內存大小> 指定可使用內存的上限,單位為KB。?
?? -n <文件數目> 指定同一時間最多可開啟的文件數。?
?? -p <緩沖區大小> 指定管道緩沖區的大小,單位512字節。?
?? -s <堆疊大小> 指定堆疊的上限,單位為KB。?
?? -S 設定資源的彈性限制。?
?? -t <CPU時間> 指定CPU使用時間的上限,單位為秒。?
?? -u <程序數目> 用戶最多可開啟的程序數目。?
?? -v <虛擬內存大小> 指定可使用的虛擬內存上限,單位為KB。
可以參看https://blog.csdn.net/zqtsx/article/details/24383755這篇文章,利用gdb等命令查看進程。
這里出現Segmentation fault大概是因為數據格式不對。
?
Igamc:underflow錯誤,網上說是因為數據量太少。在bitstreams那輸入1,即只有一個比特流數據,那么通常也沒辦法看到沒有通過的序列(假設序列是隨機生成的),即proportion=1/1,因為這一組數據要么通過測試要么沒通過測試。Bitstreams輸入1就不會報underflow錯誤,或者把數據弄長些。
Bitstreams輸入1的話就不會報溢出異常或者段錯誤。
但是bitstreams為1時沒辦法得到正確的結果。
自己隨機寫了一個32*10的隨機序列,./assess 32和bitstreams=10得到結果
對于每個統計測試除了隨機變量測試外,最小通過率接近0.8,其實結果不準確,bitstreams為1也是不準確,也沒辦法得到p值,按照官方說明文檔要求bitstreams應該在(100,1000)的范圍內。
?
?
NIST測試軟件里面有偽隨機數生成器,
Linear Congruential Generator (LCG),參看幫助文檔115頁
Quadratic Congruential Generator I (QCG-I)
Quadratic Congruential Generator II (QCG-II)
Cubic Congruential Generator II (CCG) ,參看幫助文檔116頁
Exclusive OR Generator (XORG)
Modular Exponentiation Generator (MODEXPG)
Secure Hash Generator (G-SHA1) ,參看幫助文檔117頁
Blum-Blum-Shub (BBSG)
Micali-Schnorr Generator (MSG) ,參看幫助文檔118頁
例如第一個線性同余生成器是通過算法生成偽隨機序列,關系式是
生成的偽隨機數直接進入測試,操作如下,
這里15個測試只選擇了Frequency測試,得到結果在LCG文件夾下看,15個子文件夾代表15種測試方法的結果,里面有兩個子文件
假設bitstreams=120
Results.txt包含了120次的P值的結果
stats.txt包含了120次比特流的詳細結果,報錯參數以及是否通過該項測試結果
?
這里stats.txt是每次頻率測試時的計算信息
./assess 數據長度 ,其中數據長度L=100000
特別注意:這里bitstreams*L必須小于等于文件中的數據長度,否則會報數據不夠的錯誤。
The nth partial sum是100000個0和1序列轉化為-1和1之后的和,如下面描述
拿第一組數據來檢驗,利用matlab的erf函數來檢驗
Sn=34;
n=100000;
Sobs=abs(Sn)/sqrt(n);
erfc=1-erf(Sobs/sqrt(2))
得到結果是0.9144與結果一致。
匯總的結果如下,在finalAnalysisReport.txt文件中
由上可知用自帶的隨機數生成的隨機序列用來統計測試的結果和預想的是一致的,下面用自己寫入的數據來進行測試看是否與設想完全一致。
這里面指示測試選0時雖然后面全部寫000…但是仍然需要數據,如果數據不夠就會報錯。
下面看結果
16個p值如下,
部分詳細狀態
原數據如下,
按10分數據長度,總共16組數據,后面多的數據沒有讀了。
第一個1010110100,總和為0,按下面計算方式p值為1
第二個1011110000,總和仍為0
第三個0101001111,總和為2,按下面計算p值為0.5271和stats.txt的結果一致
Freq.txt文件記錄著0和1出現的頻數
最終分析結果文件如下,16組數據全部通過頻率統計測試(P值>0.01)
說明文檔解釋C1-C10是代表p值的頻率(其實不太明白)。Proportion是指16組數據中通過統計測試的比率。
?
注:這里只是完整的驗證了頻率測試,如果需要進行其他驗證測試只需要修改下面這個位置,
特別注意:rank測試中是測試源序列中固定長度子鏈間的線性依賴關系,且子鏈必須是32*32的矩陣類型,eg./assess 1024
Random Excursions 和 Random Excursions Variant 測試要求輸入的比特數最小是1,000,000bits。
必須滿足其基本要求才不會報錯:Test Not Applicable.There are an insufficient number of cycle.
比如動向測試編號是04,那么在
12345678911111
???????? 012345
下面輸入
000100000000000即可
總結
以上是生活随笔為你收集整理的NIST数字测试套件使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大众集团「换舵手」,软件战略从「自研优先
- 下一篇: 基于STM32的OV7725摄像头拍照实