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