一 點睛
隨機數的性質分為以下三類:
上面三個性質,越往下就越嚴格。具備隨機性,不代表一定具備不可**性。密碼技術中所使用的隨機數,僅僅具備隨機性是不夠的,至少還需要具備不可**性才行。
具備不可**性的隨機數,一定具備隨機性。具備不可重現性的隨機數,也一定具備隨機性和不可**性。
二 隨機性
所謂隨機性,簡單來說就是看上去雜亂無章的性質。我們可以用偽隨機數生成器大量生成0到9範圍內的整數,然後看看所生成的數列。如果是像0、1、2、3、4、5、6、7、8、9、0、1、2、...這樣不斷迴圈的,那肯定不是雜亂無章的。或者咋一看是雜亂無章的,但實際上在數列中0一次都沒出現,或者整個數列中有一半都是6,這樣的數列也不能算是雜亂無章的。
如果偽隨機數列中不存在統計學偏差,則我們可以認為這個偽隨機數列式隨機的。判斷乙個偽隨機數列是否隨機的方法稱為隨機數測試,隨機數測試的方法有很多種。
一般在電腦遊戲中使用的隨機數只要具備隨機性就可以了。此外,在計算機模擬中使用的隨機數雖然需要根據目的來進行隨機數測試,但也是只要具備隨機性就可以了。然而,密碼技術中所使用的隨機數,僅僅具備隨機性是不夠的。
密碼學中使用的隨機數會被用來生成金鑰,因此金鑰不能被攻擊者看穿。但是雜亂無章並不代表不會被看穿,因此將只具備隨機性的偽隨機數稱為「弱偽隨機數」。
三 不可**性
密碼中所使用的隨機數僅僅具備隨機性是不夠的,還需要具備避免被攻擊者看穿的不可**性。
所謂不可**性,是指攻擊者在知道過去生成偽隨機數列的前提下,依然無法**出下乙個生成出來的偽隨機數的性質。其中,「在知道過去生成的偽隨機數列的前提下......」是非常重要的一點。
現在假設攻擊者已經知道偽隨機生成器的演算法。此外,正如攻擊者不知道金鑰一樣,他也不知道偽隨機數的種子。即偽隨機數生成器的演算法是公開的,但偽隨機數種子是保密的。在上述假設的前提下,即便攻擊者知道過去所生成的偽隨機數列,他也無法**出下乙個生成出來的偽隨機數——這就是不可**性。
那麼如何才能編寫出具備不可**性的偽隨機數生成器呢?其實,不可**性是通過其他密碼技術來實現的。例如,可以通過單向雜湊函式的單向性和密碼的機密性來保證偽隨機數生成器的不可**性。
我們將具備不可**性的偽隨機數稱為強偽隨機。
四 不可重現性
所謂不可重現性,是指無法重現和某個隨機數列完全相同的數列的性質。如果除了將隨機數列本身儲存下來以外,沒有其他方法能夠重現該數列,則我們說該隨機數具備不可重現性。
僅靠軟體是無法生成出具備不可重現性的隨機數列的。軟體只能生成偽隨機列,這是因為執行軟體的計算機本身僅具備有限的內部狀態。而在內部狀態相同的條件下,軟體必然只能生成相同的數,因此軟體所生成的數列在某個時刻一定會出現重複。首次出現重複之前的數列長度稱為週期,對於軟體所生成的數列,其週期必然是有限的。當然,這個週期可能很長,但總歸是有限的。凡是具有週期的數列,都不具備不可重現性。
要生成具備不可重現性的隨機數列,需要從不可重現的物理現象中獲取資訊,比如周圍的溫度和聲音的變化、使用者移動滑鼠的位置、鍵盤輸入的時間間隔、放射線測試儀的輸出值等,根據從這些硬體所獲取的資訊而生成的數列,一般可以認為是具備不可重現性的隨機數列。
目前,利用熱噪音這一自然現象,人們已經開發出能夠生成不可重現的隨機數列的硬體裝置了。例如,英特爾的新型cpu就內建了數字隨機數生成器,並提供了生成不可重現的隨機數的rdseed指令,以及生成不可**的隨機數的rdrand指令。
隨機數 偽隨機數
隨機數 偽隨機數 rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。srand unsigned seed 通過引數seed改變系統提供的種子值,從而可以使得每次呼...
隨機數生成 偽隨機數和真隨機數
c語言隨機數的生成,很隨機,又不隨機,比如像下面的程式 c語言生成隨機數的函式在stdlib.h庫中 include includeint main return 0 上面的 經過執行生成了 41 18467 6334 26500但是無論執行多好遍結果都是一樣的,隨機數並不隨機。這是因為rand 函...
隨機數 科普 真隨機數和偽隨機數
位元幣使用者很喜歡討論 非對稱加密 橢圓曲線 量子計算機 這類高深莫測的話題,然後再以一種非常莫名其妙的方式把幣弄丟,比如說 隨機 隨機很重要,對於位元幣這種密碼學電子貨幣來說,尤其重要。可惜社群內對於隨機的討論並不多,導致很多人缺乏正確的認識,因此,我們今天就和大家聊聊隨機。說到隨機,有兩個必須要...