真正的亂數產生(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 才是正確選擇
對於講求速度與可重現性的任務,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 |
原則:凡是涉及安全的情境,一律使用 secrets/crypto/SecureRandom。random/Math.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),在涉及安全時絕對不要使用 random 或 Math.random()。給組織:硬體 TRNG 不再是選配——它是加密的基本要求。
常見問題
我電腦的內部時脈是真正的亂數來源嗎?
不是。時脈是可預測的,而且正因為它會變化,常被用來作為 PRNG 的種子。但如果攻擊者大致知道某個數字是何時產生的,就能縮小可能性範圍。真正的亂數必須來自非確定性事件的計時——例如按鍵間隔、熱雜訊——接著再進行統計漂白處理。
人類能產生真正的亂數序列嗎?
人類不擅長產生亂數。我們會刻意避開群聚(例如「1, 1, 1」),即使這在亂數集合中本來就會自然出現;我們也會過於頻繁地在選項之間切換。統計測試很容易偵測出這些規律,因此人為輸入適合用於播種,但不足以應付安全關鍵任務。
哪些統計測試可驗證真正的亂數?
NIST 統計測試套件(Statistical Test Suite, STS) 是黃金標準。其他框架還包括 Dieharder 測試與 AIS 31 標準。這些測試會尋找重複規律、過長的同位元連續段,以及其他顯示偏差或可預測性的異常。
發佈留言