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

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

 

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

 

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

 

好了,廢話很少講,如今就讓咱們走近隨機數,看看它的「廬山真面目」!算法

 

1、三種隨機數生成器數據庫

 

大家有沒有想過這個問題——計算機究竟是怎麼獲得隨機數的?做爲人類,咱們大可提筆隨便在紙上寫一大串數字,也許就算是隨機數了,可是計算機可沒有這本事,它必須有一個科學穩定的隨機數來源,才能獲得隨機數,這個來源,咱們稱爲隨機數生成器。編程

 

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

 

2、真隨機數生成器dom

 

程序員都是完美主義者,咱們天然但願有一個能產生真正隨機數的程序。遺憾的是,生成真隨機數的程序,就像永動機同樣沒法實現,要獲得真正的隨機數目前來說只能看老天的眼色,好比噪聲(Noise),量子效應(Quantum effects),人品(RP)這些物理現象。編程語言

 

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

 

一、基於電路的TRNG:

 

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

 

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

 

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

 

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

 

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

 

二、基於物理的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年,澳大利亞國立大學的科學家從真空中的亞原子噪音獲取隨機數,創造了世界上最快的隨機數發生器。量子力學中,亞原子對會持續自發的產生和湮滅,經過監聽真空內亞原子粒子量子漲落產生的噪音,能夠獲得真正的隨機數。

 

三、基於其餘因素的TRNG:

 

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

 

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

 

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

 

另外:

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

     感興趣的能夠研究一下。

 

基於物理的隨機數生成器,生成的隨機數無週期,不可預測,分佈均勻,然而,這種隨機數生成器技術要求高,並且隨機數生成效率不高,難以知足計算機高速計算的須要,所以爲了提升數據產生效率,它們都常被用來生成僞隨機數生成器的「種子」(seed),並以今生成僞隨機的輸出序列。

 

 鑑於篇幅太長,關於僞隨機數生成器的介紹放到下一篇博客了,請你們持續關注啊!

相關文章
相關標籤/搜索