一、隨機(jī)數(shù)分類
1、真隨機(jī)數(shù)
其定義為隨機(jī)樣本不可重現(xiàn)。實(shí)際上只要給定邊界條件,真隨機(jī)數(shù)實(shí)際上并不存在,可是如果產(chǎn)生一個(gè)真隨機(jī)數(shù)樣本的邊界條件十分復(fù)雜且難以捕捉,可以認(rèn)為用這個(gè)方法演算出來了真隨機(jī)數(shù)。例如骰子、轉(zhuǎn)輪、噪音等。
2、偽隨機(jī)數(shù),通過一定算法和種子得出,例如計(jì)算機(jī)軟件中實(shí)現(xiàn)的就是偽隨機(jī)數(shù)。
強(qiáng)偽隨機(jī)數(shù):難以預(yù)測的隨機(jī)數(shù),常用于密碼學(xué)
弱偽隨機(jī)數(shù):易于預(yù)測的隨機(jī)數(shù)
二、隨機(jī)數(shù)特性
隨機(jī)數(shù)有3個(gè)特性,具體如下:
隨機(jī)性:不存在統(tǒng)計(jì)學(xué)偏差,是完全雜亂的數(shù)列,即分布均勻性和獨(dú)立性
不可預(yù)測性:不能從過去的數(shù)列推測出下一個(gè)出現(xiàn)的數(shù)
不可重現(xiàn)性:除非將數(shù)列本身保存下來,否則不能重現(xiàn)相同的數(shù)列
隨機(jī)數(shù)的特性和隨機(jī)數(shù)的分類有一定的關(guān)系,比如,弱偽隨機(jī)數(shù)只需要滿足隨機(jī)性即可,而強(qiáng)位隨機(jī)數(shù)需要滿足隨機(jī)性和不可預(yù)測性,真隨機(jī)數(shù)則需要同時(shí)滿足3個(gè)特性。
三、隨機(jī)數(shù)生成器
由于真隨機(jī)數(shù)是不存在的,在程序中使用的都是偽隨機(jī)數(shù)。那么生成偽隨機(jī)數(shù)的生成器又稱為密碼學(xué)偽隨機(jī)數(shù)生成器(英文:Cryptographically secure pseudorandom number generator,通稱CSPRNG),是一種能夠通過運(yùn)算得出密碼學(xué)安全偽隨機(jī)數(shù)的偽隨機(jī)數(shù)生成器。相較于統(tǒng)計(jì)學(xué)偽隨機(jī)數(shù)生成器和更弱的偽隨機(jī)數(shù)生成器,CSPRNG所生成的密碼學(xué)安全偽隨機(jī)數(shù)具有額外的偽隨機(jī)屬性。
介紹兩種不同場景下常用的偽隨機(jī)數(shù)生成器:
1. 線性同余法
因?yàn)橥ㄟ^線性同余方法構(gòu)建的偽隨機(jī)數(shù)生成器的內(nèi)部狀態(tài)可以輕易地由其輸出演算得知,所以此種偽隨機(jī)數(shù)生成器屬于統(tǒng)計(jì)學(xué)偽隨機(jī)數(shù)生成器。設(shè)計(jì)密碼學(xué)的應(yīng)用必須至少使用密碼學(xué)安全偽隨機(jī)數(shù)生成器,故需要避免由線性同余方法獲得的隨機(jī)數(shù)在密碼學(xué)中的應(yīng)用。

參數(shù)取值需要滿足三個(gè)標(biāo)準(zhǔn):函數(shù)在重復(fù)前應(yīng)該產(chǎn)生0-M之間的所有數(shù);產(chǎn)生的序列應(yīng)該顯得隨機(jī);生成函數(shù)可以用計(jì)算機(jī)方便地實(shí)現(xiàn),滿足條件的參數(shù)選擇如下:
M一般取素?cái)?shù),且要求很大,對于32位機(jī)一般取值為$2^{31} - 1$
A的可取值不多,當(dāng)$A= 7^5 =16807$時(shí)滿足以上標(biāo)準(zhǔn)。
這個(gè)算法的缺點(diǎn)是,在參數(shù)確定后,偽隨機(jī)序列只與N0相關(guān),容易被破解。有一種改進(jìn)的辦法就是每隔n個(gè)數(shù)就以時(shí)鐘值對M取模作為新的種子來產(chǎn)生新的序列。還有一種方法是直接將隨機(jī)數(shù)加上時(shí)鐘值再對M取模。
比較常用的一般是線性同余法,比如我們熟知的C語言的rand庫和Java的java.util.Random類,都采用了線性同余法生成隨機(jī)數(shù)。
一般來說,各大編程語言提供的偽隨機(jī)數(shù)通用實(shí)現(xiàn)出于效率方面的考量,都達(dá)不到密碼學(xué)強(qiáng)度的要求。
請勿在密碼學(xué)強(qiáng)度系統(tǒng)中使用編程語言提供的通用偽隨機(jī)數(shù)生成器實(shí)現(xiàn)。
2. ANSI X9.17
該偽隨機(jī)數(shù)發(fā)生器是密碼學(xué)意義上最強(qiáng)的偽隨機(jī)數(shù)發(fā)生器之一,應(yīng)用在金融安全和PGP上。它使用了3DES來加密,算法流程如下圖

DTi:算法第i輪開始時(shí)的日期/時(shí)間值,64位,每一輪都被更新。
Vi:算法第i輪開始時(shí)的種子值,64位,每一輪都被更新。
Ri: 算法第i輪所產(chǎn)生的偽隨機(jī)數(shù)。
K1,K2:各階段算法所用的DES密鑰,各56位。
可用以下表達(dá)式描述該算法:
Ri = EDE(K1,K2,Vi⊕EDE(K1,K2,DTi))
Vi+1 = EDE(K1,K2,Ri⊕EDE(K1,K2,DTi))
該方法的密碼強(qiáng)度來自幾個(gè)方面,包括112位密鑰和3個(gè)EDE共計(jì)9次DES加密。
四、隨機(jī)數(shù)在區(qū)塊鏈中的使用
隨機(jī)數(shù)有很多的應(yīng)用場景,例如抽獎活動、驗(yàn)證碼、Token、密碼應(yīng)用場景(生成秘鑰、生成鹽)等。
而隨機(jī)數(shù)的生成是一個(gè)由來已久的問題。一個(gè)廣泛的原則是:隨機(jī)性的生成最好不被任何個(gè)體所控制。因此譬如從比特幣的未來某區(qū)塊的數(shù)據(jù)來獲取隨機(jī)性的方式是不能使人信服的,因?yàn)檫@些隨機(jī)性最終實(shí)際上是由某個(gè)個(gè)體決定的,無法證明這個(gè)相關(guān)人沒有作惡。
區(qū)塊鏈中常用的是一種分布式的隨機(jī)數(shù)生成算法,使用了DPOS結(jié)構(gòu)中的受托人來提供隨機(jī)性。受托人事先成私密的種子數(shù)據(jù),然后生成區(qū)塊時(shí)公布該種子數(shù)據(jù)的哈希值,在下一次生成區(qū)塊時(shí)再公布該種子數(shù)據(jù) 。最終外部過程所使用的隨機(jī)數(shù)由連續(xù)的多個(gè)(至少應(yīng)大于等于 101)種子數(shù)據(jù)來確定。這樣只要有一位受托人是誠實(shí)的并將他們的信息保密,那么其他人就無法預(yù)測結(jié)果。那么我們可以很放心地假設(shè)受托人中至少其中有一個(gè)是誠實(shí)的。這樣產(chǎn)生的隨機(jī)數(shù)可信程度是非常高的。
電子發(fā)燒友App













評論