隨機數產生器(random number generator) - 程式人生
文章推薦指數: 80 %
Dual_EC_DRBG是美國國家標準技術研究院所制定的4個隨機數標準演算法之一。
該演算法使用了一個常數Q,如果該常數經過特殊選擇,並且用來選擇常數所使用的 ...
程式人生>>隨機數產生器(randomnumbergenerator)
隨機數產生器(randomnumbergenerator)
阿新••發佈:2019-01-04
隨機數產生器
隨機數產生器一般分為真正的隨機和偽隨機(pseudorandomnumbergenerator(PRNG))。
真正的隨機則是不可預測的;偽隨機則依靠隨機數種子和隨機演算法,是可能被預測的。
很多東西被黑客攻破與此有關。
比如非常著名的美國所謂的標準隨機數產生器的後門事件,簡單來講,就是“美國所謂的標準隨機數產生器裡面居然存在後門,通過某個常數,可以預測未來的隨機數,從而攻破任何用此隨機數產生器的加密裝置。
Dual_EC_DRBG是美國國家標準技術研究院所制定的4個隨機數標準演算法之一。
該演算法使用了一個常數Q,如果該常數經過特殊選擇,並且用來選擇常數所使用的資料被儲存,那麼在知道該演算法生成隨機數前32個位元組的情況下,可以預測未來所有生成的隨機數。
因此,如果該演算法被植入後門,攻擊者就可獲知利用Dual_EC_DRBG演算法生成的加解密金鑰,從而使得保護的祕密洩露。
2014年4月21日,美國國家標準技術研究院所宣佈從隨機數標準演算法中刪除Dual_EC_DRBG。
只依靠計算機程式,不依賴硬體和外部噪音能否產生真正的隨機?
個人分析:
不可能。
原因如下:種子是可選擇的,產生序列的演算法程式碼也是固定的,那麼這個序列則是可以預測的,即使引入“時間”這種動態的變數,也是一個可以獲取和預測的變數,那麼最終的序列仍然可能被預測。
這就是為何很多利用偽隨機數進行加密而比較容易被破解的原因之一。
綜合而言,採用固定變數產生的資訊是可能被預測的,這是我個人的理解。
當然,不能用我們大部分人攻不破而證明是“不可被預測”,也許黑客可以。
D:)
我們舉個例子:
publicstaticvoidmain(Stringargs[])
{
Randomrnd=newRandom(10);
for(inti=0;i<10;i++)
System.out.println(rnd.nextInt());
}
執行兩次的結果:
-1157793070
1913984760
1107254586
1773446580
254270492
-1408064384
1048475594
1581279777
-778209333
1532292428
-1157793070
1913984760
1107254586
1773446580
254270492
-1408064384
1048475594
1581279777
-778209333
1532292428
很容易看出,java的Random類的nextInt方法,只要固定了seed,連續兩次的執行序列是一樣的,這顯然不能算作真正的隨機,採用這種方法產生的序列,幾乎100%可預測,而且極其容易。
如果稍微變化一下seed,seed稍微設定的複雜一些,這種序列的變化只是變得複雜,但仍然是可能被預測的。
當然,大部分程式和語言中的隨機數(比如Java,C中的,MATLAB中的),是偽隨機。
是由可確定的函式(常用線性同餘),
Xn+1=(aXn+c)modm
通過一個種子(常用時鐘),產生的偽隨機數。
這意味著:如果知道了種子,或者已經產生的隨機數,都可能獲得接下來隨機數序列的資訊(可預測性)。
那麼能否產生真的隨機呢?
可以。
軟體的方法有缺陷,都是固化的變數和資訊(至少是可知的),引入系統外的變數(把軟體,程式碼,演算法想象成一個封閉的系統)才可能產生真的隨機性。
一個典型的例子就是UNIX核心中的隨機數發生器(/dev/random),它在理論上能產生真隨機。
即這個隨機數的生成,獨立於生成函式,這時我們說這個產生器是非確定的。
具體來講,UNIX維護了一個熵池,不斷收集非確定性的裝置事件,即機器執行環境中產生的硬體噪音來作為種子。
比如說:時鐘,IO請求的響應時間,特定硬體中斷的時間間隔,鍵盤敲擊速度,滑鼠位置變化,甚至周圍的電磁波等等……直觀地說,你每按一次鍵盤,動一下滑鼠,鄰居家wifi訊號強度變化,磁碟寫入速度,等等訊號,都可能被用來生成隨機數。
我們來分析一下linux裡的c程式碼簡略看一下:
==============================
Thecurrentexportedinterfacesforgatheringenvironmentalnoisefromthedevicesare:
*voidadd_device_randomness(constvoid*buf,unsignedintsize);
*voidadd_input_randomness(unsignedinttype,unsignedintcode,unsignedintvalue);
*voidadd_interrupt_randomness(intirq,intirq_flags);
*voidadd_disk_randomness(structgendisk*disk);
add_device_randomness()isforaddingdatatotherandompoolthatislikelytodifferbetweentwodevices(orpossiblyevenperboot).Thiswouldbethingslike***MAC***addressesorserialnumbers,ortheread-outoftheRTC.Thisdoes*not*addanyactualentropytothepool,butitinitializesthepooltodifferentvaluesfordevicesthatmightotherwisebeidenticalandhaveverylittleentropyavailabletothem(particularlycommonintheembeddedworld).
add_input_randomness()usestheinputlayerinterrupttiming,aswellastheeventtypeinformationfromthehardware.
add_interrupt_randomness()usestheinterrupttimingasrandominputstotheentropypool.Usingthecyclecountersandtheirqsourceasinputs,itfeedstherandomnessroughlyonceasecond.
add_disk_randomness()useswhatamountstotheseektimeofblocklayerrequestevents,onaper-disk_devtbasis,asinputtotheentropypool.Notethathigh-speedsolidstatedriveswithverylowseektimesdonotmakeforgoodsourcesofentropy,astheirseektimesareusuallyfairlyconsistent.Alloftheseroutinestrytoestimatehowmanybitsofrandomnessaparticularrandomnesssource.Theydothisbykeepingtrackofthefirstandsecondorderdeltasoftheeventtimings.
個人以為,通過依賴於硬體的變數產生的資訊在結合優秀的軟體演算法,理論上是可以產生真隨機的。
偽隨機
當然,我們工程中,大部分用的都是偽隨機,其實也沒必要用真隨機。
比如:中獎的隨機數產生器,沒必要非要追求真隨機。
本來就是”模擬“。
另外,隨機數發生器對區域性搜尋的影響是存在的,可以參考各種論文。
比如:
什麼是好的偽隨機數發生器
主要是看:隨機分佈的優劣
主要看四個方面:
1.相同序列的概率非常低。
2.符合統計學的平均性,比如所有數字出現概率應該相同,卡方檢驗應該能通過,超長遊程長度概略應該非常小,自相關應該只有一個尖峰,任何長度的同一數字之後別的數字出現概率應該仍然是相等的等等。
3.不應該能夠從一段序列猜測出隨機數發生器的工作狀態或者下一個隨機數。
4.不應該從隨機數發生器的狀態能猜測出隨機數發生器以前的工作狀態。
參考:
我們一般用的隨機數發生器至少要符合1和2,而用於加密等應用的隨機數發生器應該符合3和4。
引用文獻
Android命名規範(提高程式碼可以讀性)
«上一篇
zabbix服務無法啟動的問題下一篇»
相關推薦
隨機數產生器(randomnumbergenerator)
隨機數產生器
隨機數產生器一般分為真正的隨機和偽隨機(pseudorandomnumbergenerato...
OpenCV學習筆記(十二)——隨機數產生器RNG
用OpenCV做演算法的朋友們肯定為隨機數煩惱過,新版本一直支援隨機數產生器啦,而且還繼續支援之前版本的c格式的函式,不過與...
Linux核心隨機數產生器的設計與實現
EDN部落格精華文章 作者:bluehacker
這幾天抽了點時間看了看linux2.6.10的程式碼,對裡面的那個核心隨機數產生器發生...
python3線性同餘發生器(random隨機數生成器)偽隨機數產生週期的一些探究
importrandom
x=[str(random.randint(0,5))foriinrange(10)]
x_str=''.join(...
中的隨機數產生函式rand,random,srand,srandom的一些知識
1、intrand()產生一個從0到最大整數之間的一個隨機數,但是每次程式啟動後產生的隨機數在時間順序上都是一樣的。
如:...
隨機數產生轉換-根據(1,5)隨機數生成器,生成(1,7)之內的隨機數
1.題目
給定一個隨機數生成器,這個生成器能均勻生成1到5(1,5)的隨機數,如何使用這個生成器生成均勻分佈的...
產生任意隨機數發生器
如何利用給定的隨機數發生器產生其他任意你想得到的隨機數發生器。
假定給定的隨機數發生器是變數產生離散變數X服從某一分佈...
java基礎基礎總結-----隨機數(產生四個隨機數)
nbsp總結頁面ringbufferimage2017年遇見++前言:在開發的時候經常會遇見,一些驗證碼登...
寒假15(前n個數的隨機置換的兩個算法)(隨機數產生)
語言技術支持分布函數命名大量連續決定use模型具體實現過程見substitutionofintfro...
一個隨機數發生器用於在服務器和客戶機直接進行安全性驗證的類
提供服務instancedigext隨機個數相關algorithmsso在服務器向客戶端提供服務時有可能...
搜尋
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
最近訪問
隨機數產生器(random+number+generator)
有關程式設計師的幾則冷笑話
HTML文字框樣式大全!(很實用,轉載!)
Oracle監聽的配置——主機只能寫主機名,IP是錯誤的,localhost也是錯誤的
servlet中加入socket
win10下安裝Pytorch+(CUDA9.1+CUDNN7.0)
docker安裝及常規使用
git與碼雲小總結
StarUML+序列圖建模
抖音點贊動畫實現—iOS
延伸文章資訊
- 1隨機數產生器(random number generator) - 程式人生
Dual_EC_DRBG是美國國家標準技術研究院所制定的4個隨機數標準演算法之一。該演算法使用了一個常數Q,如果該常數經過特殊選擇,並且用來選擇常數所使用的 ...
- 2小科普:真随机数和伪随机数 - 律动BlockBeats
大部分计算机程序和语言中的随机函数,都是伪随机数生成器,它们都是由确定的算法,通过一个「种子」(比如「时间」),来产生「看起来随机」的结果。
- 3Random number - 随机数生成器的发展历史 - NKDACS
C语言用来产生伪随机数的库函数rand()的种子是固定的值,因此每次调用该函数产生的随机数数列都是相同的。所以为了获得随机性更好的数列,种子应为一个变量,该变量可以与 ...
- 4偽隨機數_百度百科
顯然,該算法的缺點是較難確定g與c。 偽隨機數發生器. 因此,偽隨機數生成器(PRNG)一般採用逆轉法,其基礎 ...
- 5伪随机数发生器_百度百科
伪随机数发生器用于在系统需要随机数的时候,通过一系列种子值计算出来的伪随机数。因为生成一个真正意义上的“随机数”对于计算机来说是不可能的,伪随机数也只是尽可能 ...