解密隨機數生成器(1)——真隨機數生成器(轉)


解密隨機數生成器(1)——真隨機數生成器 

 

    從小就一直很好奇,MP3播放器的隨機播放功能是如何實現的,今天讀到一篇關於隨機數的文章,又勾起了我的那時好奇心,索性上下求索,了解了隨機數背后的很多知識,頓覺豁然開朗,特意寫這篇文章和大家總結分享一下。

 

其實,隨機數在我們身邊無處不在。無論是玩撲克牌麻將骰子時的點數,玩LOL時的玩家匹配,還是高大上的量子物理,核聚變,都無一例外地隨機數有關,在混沌理論中,這個世界本身就是一系列隨機過程的產物——好吧,有點激動,扯得太遠了——作為編程愛好者,應該會發現,每一門編程語言必然會有自己的隨機數生成函數,常用的比如:C語言stdlib庫中的rand()函數,java中Random類中的nextInt () 方法,Python中random模塊的randint()方法等等。作為各種編程語言的“官方標配”,這小小的隨機函數作用那也是大大的,不光而這看似簡單的東西背后學問還真不少。

 

好了,廢話不多講,現在就讓我們走近隨機數,看看它的“廬山真面目”!

 

一、三種隨機數生成器

 

你們有沒有想過這個問題——計算機到底是怎么得到隨機數的?作為人類,我們大可提筆隨便在紙上寫一大串數字,也許就算是隨機數了,但是計算機可沒有這本事,它必須有一個科學穩定的隨機數來源,才能得到隨機數,這個來源,我們稱為隨機數生成器。

 

常見的計算機隨機數生成器有三種:一是使用物理方法,稱為真隨機數生成器(True Random Number Generator),生成的算是真正意義上的隨機數,無法預測且無周期性;與真隨機數對應的是偽隨機數生成器(Pseudo Random Number Generator),它是由算法計算得來的,但這種方法生成的隨機數是可預測、有周期的,並不能算真的隨機數,因此得名偽隨機數;還有第三種方法,叫隨機數表法,就是用真隨機數生成器事先生成好大量隨機數,存到數據庫中,使用時再從庫中調用。記得高中數學書第三冊后附有一個叫隨機數表的東西,使用時直接查閱就行,這種方法簡單,但缺點是內存占用大,因此不常采用,我也就不展開講了,在此我只詳細介紹一下前兩種:真隨機數生成器與偽隨機數生成器。

 

二、真隨機數生成器

 

程序員都是完美主義者,我們自然希望有一個能產生真正隨機數的程序。遺憾的是,生成真隨機數的程序,就像永動機一樣無法實現,要得到真正的隨機數目前來講只能看老天的眼色,比如噪聲(Noise),量子效應(Quantum effects),人品(RP)這些物理現象。

 

第一個真隨機數發生器是1955年由Rand公司創造的,而在1999年,Intel發布Intel810芯片組時,就配備了硬件隨機數發生器,原理利用的是電阻和振盪器生成的熱噪聲。目前,大部分芯片廠商都集成了硬件隨機數發生器,使用十分方便,而一系列為科研和信息安全設計的真隨機數發生器也層出不窮,發展到今天,真隨機數生成器(以下簡稱TRNG)大體可分為以下三種:

 

1、基於電路的TRNG:

 

1 振盪器采樣:如上文中提到的Intel810RNG芯片,利用熱噪聲(是由導體中電子的熱震動引起的)放大后,影響一個由電壓控制的振盪器,再通過另一個高頻振盪器來收集數據,得到隨機數。在Intel 815E芯片組的個人電腦上安裝Intel Security Driver(ISD)后,就可以通過編程讀取寄存器獲取RNG中的隨機數。

 

2 直接放大電路噪聲:直接以熱噪聲等電路噪聲為隨機源,通過運算放大,統計一定時間內達到閾值的信號數以此來得到隨機數。

 

3電路亞穩態: 2010年,德國的研究團隊現在開發出一種真隨機數發生器,它使用的計算機內存雙態觸發器作為隨機的一個額外層,觸發器可隨機的在1或0狀態中切換,在切換之前,觸發器處於行為無法預測的“亞穩態”。在亞穩態結束時,內存中的內容為完全隨機。研究人員對一個觸發器單元陣列的實驗顯示,這種方法產生的隨機數比傳統方法“隨機”約20倍。 

 

4 混沌電路:混沌電路的輸出的結果對初始條件很敏感,不可預測,且在IC芯片中易集成,可產生效果不錯的真隨機數。

 

5 根據。。。質量?:劣質內存芯片工作在高溫下,其數據是不可預測的,讀取這里面的數據,就會得到難以預測的隨機數,人們采用這種技術,制作了隨機數發生器板卡。。。(O(∩_∩)O呵呵 ~)

 

2、基於物理的TRNG:

 

如今的量子物理,從本質上講就是真正隨機的,是不可預測的——比較著名的就是薛定諤的貓啦——因此很適合用來做TRNG,當然,這並不是說基於經典宏觀物理學的TRNG就不存在,比如http://random.org/這個網站,從1998年開始就在Internet上提供真隨機數服務了,它用的是大氣噪音來生成真隨機數(很不可思議吧)。下面舉幾個近年來基於量子物理發明的TRNG:

 

http://random.irb.hr/這是一個與克羅地亞計算機科學家發明的TRNG,全名是Quantum Random Bit Generator Service (QRBGS),它依賴於半導體光子發散量子物理過程中內在的隨機性,通過光電效應檢測光子得到隨機數。

 

2 2010年,比利時物理學家S. Pironio和同事利用糾纏粒子的隨機性和非局域性屬性(別問我,我也不懂- -)創造出了真隨機數。 

 

3 2011年,加拿大渥太華的物理學家Ben Sussman利用激光脈沖和鑽石創造了真隨機數。Sussman的實驗室使用持續幾萬億分之一秒的激光脈沖照射鑽石,激光進入和出來的方向發生了變化。Sussman稱改變與量子真空漲落的相互作用有關,在量子法則中這種作用是不可知的,他認為這可以用於創造真正的隨機數。 

 

4 2012年,澳大利亞國立大學的科學家從真空中的亞原子噪音獲取隨機數,創造了世界上最快的隨機數發生器。量子力學中,亞原子對會持續自發的產生和湮滅,通過監聽真空內亞原子粒子量子漲落產生的噪音,可以得到真正的隨機數。

 

3、基於其他因素的TRNG:

 

1 PuTTYgen:它的隨機數是讓用戶移動鼠標達到一定的長度,之后把鼠標的運動軌跡轉化為種子,由此產生隨機數

 

2 Linux自1.3.30版就在內核提供了真隨機數生成器(至少是理論上),它利用機器的噪音生成隨機數,噪音源包括各種硬件運行時速,用戶和計算機交互時速。比如擊鍵的間隔時間、鼠標移動速度、特定中斷的時間間隔和塊IO請求的響應時間等。

 

3 人可不可以生成隨機數呢?嘿嘿,擲骰子斗地主啥的我就不說了,據說某些HR選簡歷的方式是,往天上一扔,掉在桌子上的簡歷就通過。。。這個可是真隨機啊!

 

另外:

     用Java可以使用java.security.SecureRandom 產生真隨機數(待查); 
     Linux系統有/dev/random,/dev/urandom向用戶提供真隨機數; 
     Windows系統有CryptGenRandom 函數生成真隨機數(待查)

     感興趣的可以研究一下。

 

基於物理的隨機數生成器,生成的隨機數無周期,不可預測,分布均勻,然而,這種隨機數生成器技術要求高,而且隨機數生成效率不高,難以滿足計算機高速計算的需要,因此為了提高數據產生效率,它們都常被用來生成偽隨機數生成器的“種子”(seed),並以此生成偽隨機的輸出序列。

 

 鑒於篇幅太長,關於偽隨機數生成器的介紹放到下一篇博客了,請大家持續關注啊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM