隨機和偽隨機 電腦隨機數是如何生成的?

2020-12-04 泡泡網

隨機和偽隨機 電腦隨機數是如何生成的?

2014年02月24日 08:37作者:cnbeta編輯:趙子悅

    泡泡網CPU頻道2月24日 不論是維持著你餘額寶安全的加密過程還是你在玩《戰地4》,電腦都會產生隨機數。目前有兩類隨機數——「真」隨機數和偽隨機數——兩者的區別關乎加密系統的安全度。

  對於隨機數的討論日漸升溫,許多人懷疑英特爾內置於各種硬體內的隨機數生成晶片是不是靠得住。要理解為什麼這種隨機數不太可靠,你必須理解隨機數的生成原理。

  隨機數的作用

  隨機數的使用歷史已經有數千年。無論是拋硬幣還是搖色子,目的是讓隨機概率決定結果。電腦中的隨機數生成器的目的也是如此——生成隨機不可預測的結果。

  加密法要求數字不能被攻擊者猜到,不能多次使用同樣的數字。所以需要一種機制產生攻擊者無法預測的數字,這些隨機數對加密法至關重要,無論你是加密文件還是訪問https協議網站,都需要用到隨機數。

  真隨機數

  如果電腦是靠代碼生成隨機數,是不是意味著隨機數可以被預測?

  根據隨機數的生成原理,我們把電腦隨機數分為兩類:「真」隨機數和偽隨機數。

  要生成一個「真」隨機數,電腦會檢測電腦外部發生的某種物理現象。比如說,電腦可以測量某個原子的放射性衰變。根據量子理論,原子衰變是隨機而不可測的,所以這就是宇宙中的「純粹」隨機性。攻擊者永遠無法預測原子衰變的發生時間,也就不可能猜出隨機值。

  舉個更實際的例子,電腦會根據環境中的噪音或者採取你敲擊鍵盤的精確時間作為隨機數據或熵的生成依據。舉個例子,你的電腦監測到你某天下午2點以後敲擊鍵盤的精確時間是0.23423523秒,有足夠的這些特定長數字你就能得到一個熵源,也就可以生成「真」隨機數。由於人不是機器,所以攻擊者無法掌握你的敲擊時間。Linux中的/dev/隨機設備生成隨機數,「阻攔」訪問直到熵積累量足夠才返回一個真隨機數。

  偽隨機數

  偽隨機數這個概念是相對於「真」隨機數而言。電腦通過發送種子數值,運用算法產生某個看起來像隨機數的數字,但是實際上這個數字是可以預測的。因為電腦沒有從環境中收集到任何隨機信息。

  雖然是偽隨機數,但是並不是所有領域都不需要偽隨機數。比如,如果你在玩電子遊戲,那麼遊戲過程中是靠偽隨機數還是真隨機數並不重要。另一方面,如果你的應用正在加密,情況就不同了,因為你不希望攻擊者能夠猜到你的隨機數。

  舉個例子,如果攻擊者掌握了某隨機數生成器使用的種子數值和加密算法,如果隨機數生成器完全依靠種子數值和加密算法生成密文,這個過程中不添加任何額外隨機性,如果攻擊者掌握的情報足夠多,他們可以逆推來確定加密算法一定會用到的偽隨機數,也就能破譯密文。

  NSA和Intel的硬體隨機數生成器

  為了幫助程序開發者更簡單的生成隨機數,也為了幫助生成安全的隨機數,Intel的晶片組中包括一個硬體隨機數生成器,名叫RdRand,這塊晶片利用處理器的熵源向軟體提供隨機數。

  問題是這個隨機數生成器是個黑盒,我們不清楚裡面的工作原理。如果RdRand藏有NSA的後門,那麼政府就可以破譯依靠隨機數生成器提供的唯一數據產生的密鑰。

  這個問題非常嚴重。在2013年12月,FreeBSD的開發者們取消了對直接採用RdRand作為隨機數源的支持,理由是無法信任Intel。RdRand設備的輸出結果會用另一套加密算法增加額外熵,確保隨機數伺服器中即便有後門程序也不會產生影響。Linux已經這麼做了,在RdRand的隨機數基礎上再次進行隨機處理,以確保後門程序不可能從中作祟。Intel總裁Brian Krzanich在Reddit上沒有直接回答關於是否裝有後門的問題。

  當然這不是Intel一家的問題,FreeBSD的開發者們也點了Via晶片的名。從這場爭論中我們可以看出為什麼不可預測的真隨機數如此重要。

  而隨機數生成器生成「真」隨機數只需要搜集熵或者從真實世界搜集看似隨機的數據。對於某些不需要真正隨機的應用,隨機生成器可能會通過算法和種子數值算出隨機數。

相關焦點

  • 隨機數在區塊鏈中的應用和生成機制
    在人們的生活中,很多場景都需要用到隨機數,例如福利彩票,車牌搖號,公共用房分配等。網際網路的發展,讓人們對隨機數的運用越來越依賴中心化系統,但是絕大多數中心化系統,生成的隨機數都是偽隨機數,並且存在作弊的風險。區塊鏈的出現,讓人們看到了生成更公平的隨機數的可能。
  • 隨機數不隨機,那麼它們到底是怎麼產生的呢?
    遊戲抽籤的機制和賭博類似,我們每次抽籤,電腦就會生成一個隨機數,這個隨機數便決定了你抽到的是蝴蝶精還是大天狗(遊戲角色)。除了應用在遊戲中,隨機數也被用於安全加密方面。為了保證信息的安全,加密系統不能一直使用同一個密碼,而是使用一些毫無章法的數字,讓黑客根本無法猜測。
  • 隨機數本質,C語言的隨機數與隨機種子
    引言在實際編程中,我們經常會用到隨機數這個概念,其實也是一個偽隨機數,實際上並不是一個真正的隨機數,但是也足夠我們使用了。在C語言中,編寫一些關於遊戲之類的程序時就需要用到隨機數了。> 頭文件中的 rand() 函數來生成隨機數,它的用法為:int rand (void);【void是指不需要傳遞參數】rand() 會隨機生成一個位於 0 ~ RAND_MAX 之間的整數。
  • 聊一聊網際網路基礎設施——隨機數
    隨機數加入和加密過程其實就相當於對數據進行一個保護的過程,防止簡單的破解和篡改,現在很多場景其實用的都是偽隨機數,而真隨機數因為產生比較複雜,因此很多機構基本上也不怎麼使用。從個人計算機和網際網路的普及之後,隨機數的生成主要經歷了三個階段:1、計算機軟體生成隨機數2、計算機軟體通過硬體信號生成隨機數3、專門生成隨機數的硬體第一個我們可以理解為就是軟體程序層面上的,我們都知道計算機中大量的數據是通過數位訊號進行傳輸的
  • 嚴重依賴「偽隨機數」,讓計算機實現真正的隨機有多難?
    編者按:生活當中看似到處都是隨機。但真正的隨機比你想像的要難得多。其實,我們接觸的絕大多數都是偽隨機數。即便如此,偽隨機數的生成也是個很耗時間和內存的事情。但最近,MIT的研究人員找到了一種經典隨機數生成算法的改進辦法,令隨機數的生成效率提高了很多,確定論的計算機有望將隨機性植入到自己的建構塊裡面。
  • 遊戲中的「真隨機」和「偽隨機」
    遊戲中的「真隨機」和「偽隨機」 「十連保底」「百抽不出貨」「我怎麼不暴擊啊?」類似於這樣的話,是很多遊戲玩家經常會說的。
  • DApp的隨機數為什麼會被黑客破解
    真隨機數需要同時滿足隨機性、不可預測性、不可重現性,而偽隨機數只需要滿足隨機性,或者是隨機性和不可預測性即可。 真隨機數隻存在於物理世界中,一般需要通過物理手段(包括量子過程)獲得,比如我們日常見到的拋硬幣、擲骰子,生成的隨機數就是真隨機數。但是,拋硬幣、擲骰子這種隨機數生成方法的缺點非常明顯,那就是耗時、耗力,而且也無法滿足現代的計算機世界對隨機數的需求。
  • MIT提出了用隨機數生成隨機數的計算機算法
    多年來,有些公司開發出新穎的算法,儘管它們本身不會生成隨機數,但卻提供了巧妙而有效的方式來使用和操縱隨機性。8月份,在線國際人工智慧與統計會議上,麻省理工學院的Mansinghka小組公布了他們的最新成果之一:提出了被稱為「快速加載的骰子滾輪」(FLDR)的算法。 簡而言之,FLDR使用隨機序列完美地模擬了加載模具的滾動。
  • 計算機能不能生成真正的隨機呢?
    顯然,再分配紅包金額這件事兒上,你手上的這臺小型計算機可能並不是真的隨機。那麼計算機是如何製造隨機事件的呢?各種軟體中的隨機都是真的隨機嗎?在計算機中生成隨機事件的關鍵是輸出一個隨機數,然後再利用算法就能模擬出各式各樣的隨機事件。剛才說到的拼手氣紅包背後就是這樣一套算法,其中的隨機數決定了你最後搶到的金額大小。那麼如何才能得到這樣的隨機數呢?
  • python安全開發軍規之四:使用安全的隨機數生成器
    背景日常開發中,必然會碰到需要生成隨機數的需求,比如生成圖片驗證碼,簡訊驗證碼……隨機數生成既然是這麼簡單的一個功能,開發必然也很簡單,我們看看怎麼生成一個隨機數,這裡以隨機生成1-100的整數為例。QA有話說隨機模塊提供的隨機生成器是偽隨機數生成器。所謂偽隨機數,是通過固定的算法生成的,其結果是確定的,可預見的。一般情況下,偽隨機數的生成需要一個種子,如果沒有特別設置,種子就是系統的時鐘。簡而言之,由於偽隨機數算法固定,種子固定,那結果就是可推導和模擬的。
  • 真隨機數發生器在信息安全系統中的應用
    本文引用地址:http://www.eepw.com.cn/article/274735.htm  隨機數是以現代密碼學為基礎的信息安全系統的基石。在現代信息安全系統中,密碼體制和算法本身可以被公開,訪問策略可以公布,密碼設備可能丟失,而系統的安全性要求不受影響。整個系統的安全性完全依賴於隨機數序列的生成效率和質量。
  • 密碼學基礎——偽隨機數生成器
    如果想要深入了解區塊鏈和區塊鏈項目,不可避免的需要了解密碼學。區塊鏈是對密碼學的一次整合運用,理解了密碼學,才能真正理解區塊鏈。獵豹區塊鏈中心在密碼學起源的科普文章中,給大家介紹了經典的加密方法,從凱撒密碼到多表密碼,以及一次一密,在本篇文章中,我們將會和大家分享最早實現一次一密的加密機以及偽隨機數生成器。
  • Excel生成隨機數的技巧,隨機數發生器,你用過嗎
    Excel獲取隨機數從概率分布中產生隨機樣本,其基本原理是隨機數的概念。隨機數是均勻分布在0和1之間的數。從技術上講,電腦不能產生真正的隨機數,因為它們必須使用一個可預測的算法。但是,設計用於產生一個數列的算法,似乎是隨機的。在 Excel中,我們可以使用函數RAND()在任何一個單元格之中產生隨機數。
  • 區塊鏈中產生隨機數的性質及特點介紹
    在本文中,我們將重點討論在不可信環境中使用集體隨機數生成方案的解決方案及其實際應用。簡而言之,如何以及為什麼在區塊鏈中使用隨機數,以及如何區分「好的」和「壞的」隨機數。長期以來,密碼學家一直在研究生成一個真正的隨機數,但即使在一臺單獨的計算機上也很難達實現它。更不用說分散式網絡了,其中隨機數的生成更加複雜。
  • 抽獎真的是隨機的嗎?科學解釋你為什麼沒能成為「中國錦鯉」
    但現在有很多場景確實需要計算機 「 隨機 」 點兒啥,比如遊戲,抽獎。。。於是。。。就有了各種各樣的,用來讓計算機生成隨機數的偽隨機算法。C++ 裡的偽隨機數計算公式這種算法一般是個函數:你輸入一個東西,就會輸出一個東西。
  • 前官員修改隨機數生成器操縱彩票中獎號碼
    (原標題:前官員修改隨機數生成器操縱彩票中獎號碼)
  • 社區專欄 | 隨機數是什麼
    這個隨機產生的數字串就是隨機數。由此可見,一個安全的隨機數體系是多麼的重要。 怎樣創造一個安全的隨機數體系呢?HPB結合自身獨有的硬體設施,創造性地提出了硬體隨機數。HPB隨機數服務的產生依賴於區塊鏈提供的共識服務和數據同步服務,是基於高性能節點、生產礦機的物理數據,是一種基於硬體隨機種子與區塊鏈共識算法的高效多方隨機數生產方案,該方案允許多個隨機數生產者參與,並在一定周期內共同生成隨機數。
  • 量子新法生成「真正隨機」的數字
    據美國國家標準與技術研究院(NIST)官網消息,該機構研究人員在12日出版的《自然》雜誌上撰文指出,他們開發出一種新方法,可生成由量子力學保證的隨機數字。新技術超越了此前獲得隨機數字的所有方法,得到了「真正的隨機數字」,有助增強密碼系統的安全性。
  • 利用Excel隨機生成抽獎器或隨機抽取相關人員,你真的會嗎?
    從效果圖中可以看出,「名單」是隨機產生的,而且每次產生的都不一樣,那麼,該如何去完成此過程了?二、必備函數簡介。1、Index函數。作用:返回大於等於0且小於1的隨機數。語法:=Rand()。目的:隨機生成大於等於0且小於1的隨機數。
  • 利用隨機數完成公司年會抽獎過程
    真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等,這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。計算機或計算器產生的隨機數有很長的周期性。其實它們不是真正地隨機產生,因為它們實際上是可以計算出來的,但是它們具有類似於隨機數的統計特徵。這樣的發生器叫做偽隨機數發生器。