前言:数字安全的 “隐形基石”
在数字化浪潮席卷全球的今天,从金融交易的密钥生成到区块链的共识机制,从量子通信的加密协议到智能汽车的身份认证,随机数如同空气般渗透在信息系统的每一个安全节点。然而,看似简单的 “随机” 二字背后,隐藏着一套精密的技术体系:熵源作为随机性的 “原始矿藏”,决定了随机数的 “基因纯度”;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