真正的亂數是怎麼產生的:TRNG、PRNG 與 CSPRNG 完整解析

A simple 3-step pipeline: Physical Source -> Sensor/Digitizer -> Binary Output.

真正的亂數產生(True Random Number Generation) 的運作原理,是從物理世界擷取亂度(entropy)——熱雜訊、大氣靜電、量子衰變——再將這些混亂的類比訊號轉換為數位位元。與演算法式的產生器不同,硬體驅動的系統測量的是非確定性的環境變數,因此能產生在數學上無法預測、沒有規律的序列。

以下將說明這項技術的運作方式、失敗情境,以及如何根據你的使用場景挑選正確方案。

TRNG 如何運作:從物理混亂到數位位元

真亂數產生器(True Random Number Generator,TRNG)——又稱硬體亂數產生器(Hardware Random Number Generator,HRNG)——並不依賴公式。它透過擷取外部的亂度來源,將其類比訊號轉換為二進位資料流,從而在不可預測的物理世界與嚴格的數位邏輯之間搭起橋樑。

正如 John von Neumann 在 1951 年提出的警語:「任何考慮以算術方法產生亂數的人,當然都身處罪惡之中。」

三種常見的亂度來源

來源 測量內容 裝置範例
熱雜訊 電路中電子移動造成的電壓波動 智慧型手機的 Secure Enclave(Apple A 系列、Google Tensor)
大氣雜訊 閃電等自然事件產生的無線電雜訊 專用 RNG 伺服器
量子現象 放射性衰變、真空漲落 ANU 量子 RNG、企業級伺服器

簡單的三步驟流程:物理來源 -> 感測器/數位化器 -> 二進位輸出。

整個流程很單純:物理來源 → 感測器/數位化器 → 二進位輸出。原始亂度從一端輸入,乾淨的亂數位元從另一端輸出。

TRNG vs PRNG:確定性與否的分界

亂數產生的核心分歧,在於物理亂度與演算法邏輯之間的差異。

特性 TRNG(硬體) PRNG(演算法) CSPRNG(混合)
來源 物理亂度 數學公式 硬體種子 + 演算法
可預測? 是——若種子已知 極度困難
速度 較慢(會阻塞) 非常快
可重現? 是(相同種子 = 相同輸出)
適用場景 加密金鑰、安全權杖 模擬、遊戲 正式上線的安全系統

當 PRNG 失靈:Hot Lotto 詐欺案

PRNG 使用一個種子值(seed) 作為數學公式的起點。輸出看起來像亂數,但實際上完全是確定性的。只要有人知道種子與公式,就能預測每一個數字。

這並非理論假設。在 Hot Lotto 詐欺案 中,內部人員安裝了惡意軟體,在維護期間強迫 PRNG 使用可預測的種子,進而操縱了 1,650 萬美元的頭獎。

PRNG(確定性/快速)與 TRNG(非確定性/安全)的清楚對比。

當 PRNG 才是正確選擇

對於講求速度與可重現性的任務,PRNG 反而更合適。在 蒙地卡羅模擬(Monte Carlo simulations) 中,科學家需要重複執行相同的序列以驗證結果。因為可以重用同一個種子,模擬結果能保持一致——這是會阻塞的 TRNG 無法做到的。

混合方案:CSPRNG

大多數現代系統採用密碼學安全虛擬亂數產生器(Cryptographically Secure Pseudorandom Number Generator,CSPRNG)——這是一種混合方案,先擷取少量的真實硬體亂度作為種子,再交由高速演算法產生亂數。如此既具備 TRNG 的不可預測性,也擁有 PRNG 的速度。

業界標準是 NIST SP 800-90A,它規範了這些產生器在政府與工業應用中應如何建構。

開發者指南:該使用哪個函式庫

語言 不安全(PRNG) 安全(CSPRNG)
Python random(Mersenne Twister) secrets(讀取 /dev/urandom
JavaScript Math.random() crypto.getRandomValues()
Go math/rand crypto/rand
Java java.util.Random java.security.SecureRandom

原則:凡是涉及安全的情境,一律使用 secretscryptoSecureRandomrandomMath.random() 只用於遊戲與模擬。

2026 年消費級硬體中的 TRNG

到了 2026 年,硬體亂度已從企業伺服器走進日常裝置。現代智慧型手機晶片在其 Secure Enclave 內建了專屬的 TRNG,直接從處理器擷取熱雜訊,用來產生 FaceID、數位錢包與安全通訊所需的加密金鑰。

在企業安全領域,前沿技術是量子亂數產生(Quantum Random Number Generation)。例如 澳洲國立大學(Australian National University) 的系統,就從量子真空漲落中產生亂數——這種隨機性等級,即便是未來的量子電腦也極可能無法破解。

漂白處理:從原始雜訊到乾淨資料

原始亂度極少是均勻分布的。舉例來說,熱感測器可能因為溫度漂移,而產生略多於 0 的 1。為了修正這種偏差,資料必須經過漂白(whitening)——通常是 XOR 運算或密碼學雜湊——來抹平規律,確保分布均勻。

這個後處理步驟是 NIST SP 800-90B 對任何用於認證系統的亂度來源的強制要求。

擷取混亂的簡史

  • 1927 年: L.H.C. Tippett 發表了一份從人口普查記錄中以人工方式抽取的 41,600 個數字 的表格。
  • 1955 年: RAND Corporation 以電子脈衝機產生並出版了《一百萬個亂數(A Million Random Digits)》。
  • 2013 年: Dual_EC_DRBG 醜聞揭露美國國家安全局(NSA)在一個通過 NIST 認證的產生器中植入了後門,使其得以破解 SSL 連線。此事件促使業界轉向多來源亂度混合——避免任何單一失效點。

結論

真正的亂數是數位信任的基石。它們需要實體硬體,才能在可預測的程式碼與混亂的現實之間搭起橋樑。無論是你手機裡的熱雜訊,還是伺服器機房裡的量子漲落,從虛擬亂數走向硬體驗證的亂度,已是 2026 年安全不可或缺的一步。

給開發者:請使用 secrets(Python)或 crypto.getRandomValues()(JavaScript),在涉及安全時絕對不要使用 randomMath.random()。給組織:硬體 TRNG 不再是選配——它是加密的基本要求。

常見問題

我電腦的內部時脈是真正的亂數來源嗎?

不是。時脈是可預測的,而且正因為它會變化,常被用來作為 PRNG 的種子。但如果攻擊者大致知道某個數字是何時產生的,就能縮小可能性範圍。真正的亂數必須來自非確定性事件的計時——例如按鍵間隔、熱雜訊——接著再進行統計漂白處理。

人類能產生真正的亂數序列嗎?

人類不擅長產生亂數。我們會刻意避開群聚(例如「1, 1, 1」),即使這在亂數集合中本來就會自然出現;我們也會過於頻繁地在選項之間切換。統計測試很容易偵測出這些規律,因此人為輸入適合用於播種,但不足以應付安全關鍵任務。

哪些統計測試可驗證真正的亂數?

NIST 統計測試套件(Statistical Test Suite, STS) 是黃金標準。其他框架還包括 Dieharder 測試與 AIS 31 標準。這些測試會尋找重複規律、過長的同位元連續段,以及其他顯示偏差或可預測性的異常。

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *