前言:數字安全的 “隱形基石”
在數字化浪潮席卷全球的今天,從金融交易的密鑰生成到區塊鏈的共識機制,從量子通信的加密協議到智能汽車的身份認證,隨機數如同空氣般滲透在信息系統的每一個安全節點。然而,看似簡單的 “隨機” 二字背后,隱藏著一套精密的技術體系:熵源作為隨機性的 “原始礦藏”,決定了隨機數的 “基因純度”;DRBG(確定性隨機比特生成器)則是 “提煉工廠”,將有限的原始熵轉化為海量可用的隨機序列;而最終輸出的隨機數,既是安全協議的 “密鑰材料”,也是抵御攻擊的 “第一道防線”。
一個簡單的比喻
想象一下你要創建一個無人能預測的彩票抽獎系統:
-
熵源:就像測量天空中云朵形狀和風速的過程。這個過程充滿了不可預測性(高熵),是真正隨機性的來源。你得到的是原始的、混亂的、非數字的“隨機素材”。
-
隨機數:就是最終開獎的那個號碼,比如?
5, 17, 23, 36, 41
。它是最終可以被系統使用的、格式規整的數字。 -
DRBG:就像彩票搖獎機。它本身不會產生隨機性。它的作用是:
- 初始化(播種):你先把從“測量云朵”得到的那一團原始隨機數據(熵)作為種子,放進搖獎機里。
- 生成號碼:然后,你啟動搖獎機(DRBG),它會根據初始的種子,通過一套復雜的數學算法,搖出(生成)一連串看似隨機的中獎號碼。
- 效率與連續性:這樣你就不需要每次都去測量云朵(那樣很慢),只需要搖動機器(非常快)就能得到大量的號碼。
隨著量子計算的崛起和攻擊手段的升級,傳統隨機數生成機制正面臨前所未有的挑戰:2013 年 Dual_EC_DRBG 算法的后門曝光,揭示了標準制定中的信任危機;2022 年 NIST 對 SP 800-90B 的修訂,反映了熵源評估方法的持續迭代;中國 GB/T 45240-2025 的發布,則標志著量子隨機數標準化的全球競爭進入新階段。理解隨機數、熵源與 DRBG 的技術原理、協同關系及標準體系,已成為信息安全領域的核心課題。
一、隨機數的分類與技術解析
-
定義:指在一定范圍內隨機產生的、無規律可循的數字序列。它是最終的目的和產物。
(一)隨機數的技術分類
類型 | 技術原理 | 典型實現方案 | 應用場景 |
真隨機數(TRNG) | 基于量子漲落、熱噪聲等物理過程,輸出具有不可預測性和不可復現性 | 中國科學技術大學器件無關量子隨機數發生器(通過貝爾檢驗) | 高安全場景(如量子密鑰分發、數字簽名) |
偽隨機數(PRNG) | 通過算法生成看似隨機的序列,相同種子產生相同輸出 | 梅森旋轉算法(周期 2^19937-1)、AES-CTR_DRBG(NIST SP 800-90A 推薦) | 高性能計算(如蒙特卡洛模擬)、非關鍵業務邏輯 |
密碼學隨機數 | 需同時滿足統計隨機性(通過 SP 800-22 測試)和不可預測性(抗前向 / 后向預測) | Linux /dev/urandom(SHA-3 哈希 + 硬件熵源補充) | 密鑰生成(如 AES 密鑰)、安全協議(TLS 握手) |
量子隨機數 | 利用量子力學內稟隨機性(如單光子探測、糾纏光子對) | 國盾量子 GB/T 45240-2025 器件無關量子隨機數發生器(自驗證安全) | 后量子密碼、零知識證明等前沿領域 |
(二)量子隨機數的革新突破
- 器件無關量子隨機數:通過貝爾不等式檢驗,即使設備存在漏洞也能生成可信隨機數,如中國科大實現的隨機數信標系統,結合后量子簽名算法確保廣播安全。
- 性能指標:中國研制的量子隨機數發生器實現 3.2Gbps 輸出速率,通過 NIST SP 800-22 全套測試,填補國內空白。
二、熵源的分類與技術解析
-
定義:隨機性的根本來源。它是從物理世界中采集到的、具有不可預測性和不確定性的原始數據。熵是衡量其混亂度或不可預測性的指標。熵值越高,越隨機,越難被猜測。
(一)熵源分類與特性對比
分類 | 子類 | 技術原理 | 優勢 | 劣勢 | 典型應用場景 |
物理熵源 | 熱噪聲 | 導體中電子熱運動產生的電壓波動(奈奎斯特定律) | 穩定性高,溫度漂移可補償 | 需低噪聲放大器,硬件成本高 | 金融加密設備(如 ATM 機密鑰生成) |
雪崩噪聲 | 反向偏置 PN 結雪崩倍增過程的隨機脈沖電流 | 高速(1.6Gbps),適合硬件實現 | 需高壓(5-15V),噪聲帶寬受限 | 通信設備(如 5G 基站會話密鑰生成) | |
單光子探測 | 量子不確定性原理下的光子透射 / 反射隨機性 | 安全性最高(器件無關),抗量子攻擊 | 需低溫環境(4K 以下),實現復雜 | 量子通信網絡(如京滬干線密鑰分發) | |
時鐘抖動 | 兩個高頻振蕩器相位差的隨機漂移 | 無需專用硬件,可在 FPGA 實現 | 熵率較低(1-2 位 / 樣本),需交叉驗證 | 工業控制系統(如 SCADA 設備隨機指令生成) | |
非物理熵源 | 混沌系統 | 洛倫茲方程或 Logistic 映射的混沌行為 | 軟件實現簡單,適合嵌入式設備 | 數字化實現存在周期退化風險 | 物聯網傳感器(如智能家居隨機事件觸發) |
密碼學哈希 | 對系統狀態連續哈希擴散隨機性 | 與現有系統兼容,成本低 | 依賴哈希函數抗碰撞性(SHA-1 已被破解) | 輕量級加密(如 Wi-Fi 密碼生成) |
三、DRBG的分類與技術解析
-
定義:確定性隨機比特生成器。它是一種密碼學安全的偽隨機數生成算法。
-
特點:
-
高效:一旦被播種,它可以非常快速地生成大量隨機數。
-
可重現:相同的種子會產生相同的輸出序列。
-
密碼學安全:即使輸出序列的一部分被泄露,也很難推算出之前的數字或預測之后的數字(前提是算法設計是安全的)。
-
(一)DRBG 類型與特性對比
類型 | 核心算法 | 技術原理 | 優勢 | 劣勢 | 典型應用場景 |
Hash_DRBG | SHA-256/SHA-512/SHA3 | 哈希函數迭代擴展種子 | 抗側信道攻擊,軟件實現簡單 | 生成速率低(100Mbps),不適合高速場景 | 嵌入式設備(如智能卡安全模塊) |
CTR_DRBG | AES-128/256 | 計數器模式加密擴展隨機序列 | 硬件加速(10Gbps),適合高速場景 | 依賴分組密碼安全性(AES 抗量子攻擊需后量子算法替代) | 數據中心(如云服務器 TLS 密鑰生成) |
HMAC_DRBG | HMAC-SHA2/3 | 密鑰化哈希的消息認證特性 | 靈活支持多種哈希函數,適合頻繁重播種 | 需定期更新密鑰,硬件實現復雜度高 | 移動終端(如手機支付會話密鑰生成) |
Dual_EC_DRBG | ECDLP(P-256 曲線) | 橢圓曲線標量乘法生成序列 | 歷史兼容性強 | 存在 NSA 后門,已被 NIST 撤銷推薦 | 遺留系統(如早期 VPN 設備) |
四、隨機數、熵源、DRBG 的關系與標準體系
(一)技術協同關系模型
特性 | 熵源 | DRBG | 隨機數(最終產物) |
---|---|---|---|
角色 | 隨機性的源頭 | 隨機性的放大器和生成器 | 最終產品 |
本質 | 物理世界的混沌現象 | 數學算法 | 數字 |
速度 | 慢 | 非常快 | N/A |
確定性 | 非確定性(真隨機) | 確定性(偽隨機) | 分為真隨機和偽隨機 |
輸出 | 原始、有偏、非均勻的比特 | 均勻、無偏、高偽隨機性的比特流 | 格式規整的數字 |
依賴關系 | 獨立存在,不依賴其他二者 | 嚴重依賴熵源進行播種 | 由熵源或DRBG產生 |
關聯(工作流程):
它們三者構成了一個生成密碼學安全隨機數的標準管道:
熵源 → DRBG → 隨機數
-
收集熵:操作系統持續地從各種硬件和軟件事件中收集熵,存入一個叫“熵池”的地方。
-
播種:當應用程序(如openHiTLS)需要隨機數時,DRBG會從熵池中取出足夠長度的種子來初始化自己。
-
生成:DRBG根據這個種子,運行其加密算法,生成一長串高性能的、密碼學安全的偽隨機數,提供給應用程序使用。
-
重置:為確保安全,DRBG會定期用新的熵重新播種,以防止因內部狀態泄露而導致的全序列推演。
區別:
-
熵源 vs DRBG:熵源是“原因”,是“原料”;DRBG是“工具”,是“加工廠”。最核心的區別是:熵源提供不可預測性,DRBG提供效率和可用的輸出長度。沒有熵源的DRBG是完全不安全的,因為它的輸出可以被完全預測。
-
DRBG vs 隨機數:DRBG是過程,隨機數是結果。我們通過DRBG這個過程來得到隨機數這個結果。
你可以這樣理解:
計算機需要一個真隨機數(比如用于生成加密密鑰),但直接從物理世界收集(熵源)又太慢。
于是,它先收集一點點真正的隨機性(熵)作為“種子”,然后把它喂給一個非常強大的數學算法(DRBG)。這個算法能把這一點點真隨機性“放大”成萬億個看起來毫無規律、無法預測的數字,即高質量的隨機數。
所以,熵源是根基,DRBG是核心工具,而安全可靠的隨機數是最終追求的目標。三者密不可分,共同構成了現代密碼學和安全應用的基石。
(二)標準體系與對應關系
標準類別 | 國際標準 | 中國標準 | 核心內容 |
熵源規范 | NIST SP 800-90B Rev.1(2022) | GB/T 37076-2022 | 熵源質量評估方法(如條件最小熵),物理熵源壓力測試(溫度、電磁干擾) |
DRBG 規范 | NIST SP 800-90A(2012) | GM/T 0105-2021 | DRBG 算法實現(如 CTR_DRBG、Hash_DRBG),安全強度分級(112-256 位) |
隨機數規范 | FIPS 140-3(2019) | GB/T 45240-2025 | 隨機數生成器物理安全(如防篡改涂層),量子隨機數自驗證要求 |
系統整合 | ISO/IEC 18031:2023 | 待發布 | 熵源與 DRBG 互操作性接口,量子隨機數系統架構 |
(三)后量子時代的標準演進
- NIST 后量子遷移路線圖:計劃 2035 年前完成后量子密碼過渡,要求 DRBG 支持 ML-KEM 等后量子算法的 256 位安全強度。
- 中國自主標準:GB/T 45240-2025 器件無關量子隨機數發生器標準,填補國內空白,推動國際互認。
- 技術挑戰:量子計算可能破解基于 ECDLP 的 DRBG,需研發基于格密碼的新型 DRBG。
五、典型應用與風險防范
(一)高安全場景應用案例
- 金融領域:
- 熵源:熱噪聲 + 單光子探測組合(如中國銀聯量子隨機數信標)
- DRBG:CTR_DRBG(AES-256)結合硬件加速(10Gbps)
- 標準遵循:FIPS 140-3 Level 3 + GB/T 45240-2025
- 工業控制:
- 熵源:時鐘抖動 + 用戶行為數據融合(如西門子 PLC 設備)
- DRBG:HMAC_DRBG(SHA-3)支持頻繁重播種
- 標準遵循:ISO/SAE 21434(汽車電子) + GM/T 0105-2021
(二)風險與應對策略
? ?1、熵耗盡攻擊:
- 風險:拒絕服務導致熵源無法更新,隨機數可預測
- 應對:動態熵池管理(熵余量<50% 時暫停非關鍵請求)+ 硬件熵源芯片(如 Intel RDRAND)
? 2、算法后門:
- 風險:Dual_EC_DRBG 等算法存在 NSA 后門
- 應對:優先選擇 AES-CTR_DRBG,遵循 NIST SP 800-90A 推薦算法
? 3、側信道攻擊:
- 風險:通過功耗或電磁泄漏推測密鑰
- 應對:恒定時間實現 + 噪聲注入(如 AES 運算隨機延遲)
六、結語:隨機性的 “三重門” 與安全生態的未來
隨機數、熵源與 DRBG 構成了信息安全的 “三重門”:熵源的質量決定了隨機性的 “下限”,DRBG 的設計決定了隨機性的 “上限”,而隨機數的應用則決定了安全體系的 “防線強度”。從熱噪聲的微觀波動到量子世界的內稟隨機,從哈希函數的迭代擴展到后量子算法的抗攻擊設計,這一技術體系的每一次迭代都反映了攻防對抗的升級。
未來,隨著量子計算的實用化和物聯網的普及,隨機性需求將呈現 “量質齊升” 的趨勢:一方面,6G 通信、元宇宙等場景需要 Tbps 級隨機數支撐;另一方面,量子攻擊迫使隨機數生成必須具備 “器件無關” 的自驗證能力。在這場全球技術競賽中,標準體系的主導權將直接影響數字經濟的話語權 —— 中國 GB/T 45240-2025 與 NIST SP 800 系列的并行發展,既體現了技術路線的多元性,也預示著國際互認將成為關鍵課題。
最終,真正的安全并非依賴單一技術,而是熵源的物理不可預測性、DRBG 的算法嚴謹性、標準的強制約束性三者的有機統一。只有筑牢這 “三重門”,才能在數字時代構建起不可逾越的安全屏障。
開源代碼示例:
示例代碼展示了基于Linux熵源(/dev/random)的DRBG實現,包括初始化、隨機數生成和重新播種等操作流程,使用SHA-256等加密算法確保安全性。
/** This file is part of the openHiTLS project.** openHiTLS is licensed under the Mulan PSL v2.* You can use this software according to the terms and conditions of the Mulan PSL v2.* You may obtain a copy of Mulan PSL v2 at:** http://license.coscl.org.cn/MulanPSL2** THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.* See the Mulan PSL v2 for more details.*/#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "crypt_types.h"
#include "bsl_sal.h"
#include "bsl_err.h"
#include "crypt_algid.h"
#include "crypt_eal_init.h"
#include "crypt_errno.h"
#include "crypt_eal_rand.h"void *StdMalloc(uint32_t len) {return malloc((size_t)len);
}void PrintLastError(void) {const char *file = NULL;uint32_t line = 0;BSL_ERR_GetLastErrorFileLine(&file, &line);printf("failed at file %s at line %d\n", file, line);
}int main(void)
{int ret;uint8_t output[100] = {0};uint32_t len = 100;ret = CRYPT_EAL_Init(CRYPT_EAL_INIT_CPU | CRYPT_EAL_INIT_PROVIDER);if (ret != CRYPT_SUCCESS) {printf("CRYPT_EAL_Init: error code is %x\n", ret);return ret;}/*** Before calling the algorithm APIs,* call the BSL_SAL_CallBack_Ctrl function to register the malloc and free functions.* Execute this step only once. If the memory allocation ability of Linux is available,* the two functions can be registered using Linux by default.*/BSL_SAL_CallBack_Ctrl(BSL_SAL_MEM_MALLOC, StdMalloc);BSL_SAL_CallBack_Ctrl(BSL_SAL_MEM_FREE, free);BSL_ERR_Init(); // Initialize the error module.// Initialize the global random number by using the default entropy source from **/dev/random** of Linux.ret = CRYPT_EAL_ProviderRandInitCtx(NULL, CRYPT_RAND_SHA256, "provider=default", NULL, 0, NULL);if (ret != CRYPT_SUCCESS) {printf("RandInit: error code is %x\n", ret);PrintLastError();goto EXIT;}// Obtain the random number sequence of the **len** value.ret = CRYPT_EAL_RandbytesEx(NULL, output, len);if (ret != CRYPT_SUCCESS) {printf("CRYPT_EAL_Randbytes: error code is %x\n", ret);PrintLastError();goto EXIT;}printf("random value is: "); // Output the random number.for (uint32_t i = 0; i < len; i++) {printf("%02x", output[i]);}printf("\n");// Reseedingret = CRYPT_EAL_RandSeedEx(NULL);if (ret != CRYPT_SUCCESS) {printf("CRYPT_EAL_RandSeed: error code is %x\n", ret);PrintLastError();goto EXIT;}// Obtain the random number sequence of the **len** value.ret = CRYPT_EAL_RandbytesEx(NULL, output, len);if (ret != CRYPT_SUCCESS) {printf("CRYPT_EAL_Randbytes: error code is %x\n", ret);PrintLastError();goto EXIT;}printf("random value is: "); // Output the random number.for (uint32_t i = 0; i < len; i++) {printf("%02x", output[i]);}printf("\n");EXIT:// Release the context memory.CRYPT_EAL_RandDeinit();BSL_ERR_DeInit();return 0;
}
?除示例代碼外,openHiTLS提供各種種類的DRBG,可訪問代碼倉了解:
https://gitcode.com/openHiTLS/openhitls