真實隨機數如何產生?為什麼說真實隨機數可以抵抗惡意攻擊?
01-30
謝邀,
先舉個例子說明隨機數的攻擊是什麼,2000年的時候,神舟大地還非常時興各種電話卡(充值卡或或者IP電話卡等)。電話卡都是不記名的,用的是一串卡號,一串密碼,卡號一般是一個序列,密碼一般是通過隨機數生成的。當時就出過案子,有人買的電話卡發現沒錢了報案。電信一查,發現被盜打了或者提前註冊了,一些破獲的案件說明,有些「」聰明人「發現了密碼規律,自己買一兩張卡,就能生成一堆卡的密碼(卡號就是序列)。」為什麼呢,因為偽隨機數演算法以及演算法使用的問題,
大部分隨機數演算法都有一個循環長度問題,市面上大部分random函數的隨機數的循環長度都是2^32,而且其實常用的就哪幾種,都是線性取余的方式。大體實現是隨機數 = 種子 * 大數1 % 數字2 + 數字3;
種子= 隨機數;什麼是循環長度呢,就是第一次產生的數值是A,第二次產生的數值是B,經過這個循環長度後,取得的數值又是A,下一個又是B。線性取余的演算法特點就決定了這個問題。
所以如果你買了2張卡,你就可以計算得到這個隨機序列的種子,那麼這個序列你也就知道。那後面的密碼你就都知道了。而如果你有真隨機數,兩個數據間是沒有任何演算法可以關聯的。當然這個卡號和密碼就絕對安全了。當然其實即使是最普通的random函數,你加入干擾,比如一次用N次結果的數據拼湊起來,也可以大大提高破解的難度。據說真隨機數一般依靠硬體產生,但沒見過。
但其實很多隨機數演算法已經大大改進了。比如Mersenne Twister梅森旋轉演算法,他的常用實現的循環長度是2^19937.
在這個循環長度下,基本不可預測下一個數字是什麼。這種演算法滿足99.99999%大部分模擬情況,除非你想搞天文級別的模擬。https://zh.wikipedia.org/zh/%E6%A2%85%E6%A3%AE%E6%97%8B%E8%BD%AC%E7%AE%97%E6%B3%95
BTW:這個演算法是日本人發明的。C++11 新的隨機庫應該也收錄了這個庫。而且,他的速度很快很快。講道理題主九成是在做CUPT吧……
自己整理的一點關於隨機數的筆記,供參考:
- 密碼學中的隨機數(Random)
- 隨機數的作用
- 在密碼學中用於加解密演算法的密鑰要求是由隨機數產生,最好是由真隨機數產生
- Salt(鹽)也是建議由隨機數產生
- 隨機數的三個標準
- 統計學隨機性
- 給定隨機樣本的一部分和隨機演算法,不能有效的演算出隨機樣本的剩餘部分
- 隨機樣本不可重現
- 偽隨機數
- 滿足前兩個條件
- 所有由人編寫的通過程序計算出來的都是偽隨機數 (樣本可重現)
- (真)隨機數
- 同時滿足三個條件
- 從理論上來看真正的隨機數,目前只有從量子世界中獲得
- 而日常使用中用到的(真)隨機數通常是由容易觀測的物理現象產生的,比如投硬幣,擲骰子,電子元件的噪音,核裂變等等
- 操作系統中隨機數的實現:
- Linux:/dev/random
/dev/urandom 設備
- /dev/random中的隨機數是由系統收集的背景噪音(來源主要是設備驅動程序)中產生,有大小限制
- /dev/urandom是/dev/random的一個別名實現,產生的隨機數沒有大小限制,循環使用
- Windows:CryptGenRandom函數,RtlGenRandom函數
隨機數(RNG)主要分為兩大類:偽隨機與物理隨機數。
偽隨機是由各種演算法產生的,本質上是決定論的,就是你輸入同一個初值,結果是確定的。當然這不是我們想要的。
物理隨機數是由物理過程產生的。分為三小類。Noise,chaos,quantum。
Noise和chaos是由經典物理過程產生的,也是決定論的。比如我們知道小球的初始條件,我們就可以預測小球未來的運動情況。這也不是我們想要的。
真隨機數是由量子過程產生的,其原理是基於uncertain principle。舉個最簡單的例子,當單個光子經過分束器BS的時候,有兩條路徑可以選擇,用任何理論都無法預測which way(隱變數理論除外),所以通過測量光子走了哪條路就可以產生真正的隨機數。當然這裡要求探測設備和發射源是被信任的。如果被壞人操作,其實也產生不了隨機數。
那麼就不存在真隨機數嗎?No,device independent quantum random number(DI-QRNG)就可以實現。DI-QRNG是通過觀察貝爾不等式的違背來產生隨機數,這個過程是不依賴探測設備和源的,所以由DI-QRNG產生的真隨機數可以抵抗惡意攻擊。謝邀.有一種方法是:用攝像頭採集岩漿燈圖像的亮度.不能說是真隨機(基本運動定律還是遵循的,但值很難預測),在常見的方法里隨機程度已經非常高了;一般的應用沒有問題.可以參考:Generating Random Numbers for Cryptography with Lava Lamps大概就是這樣.
世界上真的有隨機數存在么? - 物理學對於真實隨機數,參見這個Milo Yip的回答這裡有一篇wiki,介紹了隨機數攻擊 Random number generator attack確定的是,你永遠無法在PC上得到一個真正的隨機數,通常隨機數都是由某個特定的硬體或者軟體產生的,如果定位到了產生者,他就可以偽造。通常部分加密協議,是需要用隨機數的。很顯然,如果是真實的隨機數,任何人都沒有辦法偽造,當然加密也就絕對安全了。錯誤之處,還望指出。
真實隨機數需要引入物理過程,比如大氣雜訊,放射性衰變等等。民用級別加密用機器上的環境熵也足夠了。
推薦閱讀:
※一個無理數現有精度的下一位是否是隨機的?
※可以通過未賦值的變數產生隨機數嗎?
TAG:隨機數 |