日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NIST数字测试套件使用说明

發布時間:2024/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NIST数字测试套件使用说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

NIST 測試套件是由15個測試組成的統計軟件包,這些是為了測試隨機(任意長度)由基于硬件或軟件的密碼隨機或偽隨機數生成器產生的二進制序列。測試關注于各種不同類型的已存在的非隨機序列。有些測試可以分成各種子測試。

15個測試主要是(屬于密碼算法安全測試方法):

  • 頻率(單比特)測試
  • 塊內頻數測試(Frequency Test within a Block)
  • 動向(Run)測試
  • 最大游程檢測
  • 二進制矩陣秩(Binary Matrix Rand)測試
  • 頻譜測試
  • 非重疊字匹配測試
  • 重疊字匹配測試
  • Maurer通用統計檢測
  • ??? ? ?? 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操作系統下安裝。步驟如下:

  • 打開已經安裝好的ubuntu系統,在管理員權限進入系統,把已經下好的數字測試套件包拷貝到Home目錄下
  • 對包進行解壓縮,解壓在該目錄下。
  • 進入到解壓縮的該目錄下(輸入命令cd 文件名)
  • 輸入make進行編譯makefile文件,得到assess文件(編譯成功后該目錄下會有assess文件)
  • 在該目錄下輸入./assess <datalength>,datalength為測試的數據長度。
  • ?

    ?

    下面舉例說明

    ?

  • 進入軟件界面后,有基本操作指示(生成器選項)
  • 基本測試用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頁寫到一般建議和規范,告訴我們為什么數據集沒有通過統計測試:

  • An incorrectly programmed statistical test除了特殊情況,我們認為統計測試是為了解決某類特殊問題而量身定做的。但是部分統計測試受限于人工上限,比如隨機偏移測試不能大于max{1000,n/128}次循環,依據實驗條件,參數可能需要增加。
  • An underdeveloped (immature) statistical test:很多統計測試都是以漸進近似為基礎的
  • An improper implementation of a random number generator:有可能由于硬件上設計的瑕疵或者編碼實現錯誤導致硬件RNG或者軟件RNG失敗。
  • Improperly written codes to harness test input data:一般測試數據在統計測試之前由RNG生成。比如,可能處理包括由RNG分割成合適大小的塊的輸出流,以及0轉換成負數。
  • Poor mathematical routines for computing P-values
  • Incorrect choices for input parameters某些統計測試可能對輸入參數較為敏感。比如序列長度10^6,塊長度接近log2(n)是可以接受的。經驗證據表明,在塊長度m大于14時,觀察到的檢驗統計量將開始與期望值不一致(特別是已知的數據生成器,如sha-1)。
  • 通常需要考慮的參數有:序列長度,樣本大小,塊大小和模板(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 nn是序列長度。

    自己寫個數據測試一下:

    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数字测试套件使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。