1. 程式人生 > >隨 機 數 算 法

隨 機 數 算 法

一、隨機數概述

在密碼技術中,隨機序列是非常重要的,比如金鑰產生、數字簽名、身份認證和眾多的密碼學協議等都要用到隨機序列。所以產生高質量的隨機數序列對資訊的安全性具有十分重要的作用。隨機數分為真隨機數和偽隨機數,計算機通過演算法產生的隨機數並不上真正意義上的隨機數,很容易被破解,只能稱為偽隨機數。若要產生真正的隨機數,必須通過硬體來實現,比如使用離子輻射事件的脈衝檢測器、氣體放電管和帶洩露的電容等,但是為每臺計算機配備這樣的裝置上不可能。所以在此我們通過改進我們的演算法,使生成的偽隨機數達到真隨機數的標準。

二、軟體常用的產生隨機數的方法

    在軟體上計算機常用的產生隨機數的演算法為線性同餘演算法,即使用下面的公式遞推產生不同的隨機數.

ni+1=(a*ni+b)mod M          其中i=0,1,…,M-1

c語言中的rand()函式即是通過該公式遞推產生隨機數的,常用當前的系統時間為種子。

通過該公式可以看出,產生的隨機數是明顯有規律可尋的,每一個隨機數都是在前一個隨機數的基礎上通過公式計算得來的,所以通過該方法得來的隨機數的隨機性很差。

所以為了提高計算機產生的隨機數的隨機性,在這裡我們通過收集系統隨機的物理量來填充隨機數緩衝池,比如鍵盤敲擊時間、滑鼠點選時間、cpu執行引數等,通過這些方法得到的隨機數具有很高的隨機性。可達到真隨機數的要求。

在WAPI系統中,均需要產生32位的隨機數,在這裡區分不同的平臺,編寫隨機數產生程式,並根據美國NIST(美國標準與技術研究院)提供的最新隨機數測試標準進行測試。

二、Windows平臺下隨機數生成演算法

首先建立一個動態資料緩衝池,緩衝池被釋放之前,會不停的收集windows平臺下眾多的物理隨機資訊,包括:①當前程序的ID;②當前執行緒的ID;③系統引導以來的時鐘數;④各種高精度的效能計數器;⑤使用者環境模組的MD4(Message Digest 4,資訊摘要4)雜湊,包括使用者名稱,計算機名和搜尋路徑等;⑥高精度的內部CPU計算器,如RDISC,ROMSR,RDPM等;⑦底層系統資訊,如空閒時間,內檢時刻,中斷時間,提交限定,頁面計數,快取計數,作業系統外部計數、鍵盤、滑鼠資訊等。

當程式需要隨機數時,從這些緩衝池中讀取這些物理資訊,因為這些資訊大部分均從物理量讀取而來,所以有不可預測性,可以滿足隨機性的要求。

三、Linux平臺下隨機數生成演算法

Linux平臺下也首先建立一個緩衝池用來收集來自裝置驅動程式和其它來源的環境噪音,包括兩次中斷的時間間隔、鍵的掃描碼、兩次按鍵之間的時間間隔、滑鼠位置和連續兩次滑鼠中斷時間間隔、連續兩次磁碟操作之間的間隔。

需要隨機數的時,就從這些緩衝池中讀取這些物理資訊,這些資訊具有不可預測性,滿足隨機性的要求。

四、隨機數統計測試 

每項的測試結果均轉換為p-value值進行判斷,若p-value>=0.01,則說明該隨機數序列具有隨機性,否則不具有隨機性。以下對這15項測試進行簡單的介紹。

這15項測試分別為:

1. Frequency (Monobit) Test(頻率測試)

   2. Frequency Test within a Block(塊內頻率測試)

3. Runs Test(流程測試)

4.Test for the Longest Run of Ones in a Block(塊內最長遊程測試)

5. Binary Matrix Rank Test(二進位制矩陣測試)

6. Discrete Fourier Transform (Spectral) Test(離散付利葉測試)

7. Non-overlapping Template Matching Test(非重疊模板匹配測試)

8. overlapping Template Matching Test(重疊模板匹配測試)

9. Maurer’s “Universal Statistical” Test(Maurer's普通統計測試)

10. Linear Complexity Test(線性複雜性測試)

11. Serial Test(連續測試)

12. Approximate Entropy Test(近似熵測試)

13. Cumulative Sums (Cusum) Test(累積和測試)

14. Random Excursions Test(自由遊程測試)

15. Random Excursions Variant Test(自由變數測試)