密码学基础-为什么使用真随机数(True Random Number Generators)
概述
随机的意义很重要,就像你的银行密码如果是亲朋好友的生日,结婚纪念日(可预测的),那么就容易被人测试出来;而如果是与上述信息毫无关系的随机数,那么破解的难度就增大了。
加密、签名算法中经常添加随机数,以增强算法的安全性。
随机数生成器是保证保证生成的随机数足够“随机”(不可预测)的一种安全组件。对这种随机性的具体描述可以表达为:
- 前向保密保证了对设备过去输出和内部状态的了解不应使攻击者能够预测未来的数据;
- 向后保密保护“相反的方向”:对未来输出和内部状态的了解不应泄露先前的数据。
按照原理,将随机数生成器分为:
- 伪随机数生成器(Pseudo Random Number Generators,PRNG)
也称为 确定性随机数。软件生成的随机数只是伪随机数。它们不是真正的随机的,因为计算机使用基于分布的算法,并且不安全,因为它们依赖于确定性的、可预测的算法。
即只要对算法输入相同、相似的数据,就可以大致猜测出该算法生成的随机数的范围。
Python 和 Excel 等日常工具中的伪随机数生成基于 Mersenne Twister 算法。但是,它们不适用于安全加密的方案。
- 真随机数生成器(True Random Number Generators,TRNG)
TRNG是基于不可预测的物理现象(称为熵源,随机性越高,熵源值越大)的功能或设备,旨在生成非确定性数据(例如,一系列数字)。真随机数必须是不可预测的、统计上独立的(与任何先前生成的随机数无关、并且与之后生成的随机数也无关)、均匀分布(生成任何数字的概率相等)和受保护的。
对于真正的随机数,计算机必须使用一些不可预测的外部物理变量来生成,例如同位素的放射性衰变或电波静电,而不是通过软件算法。一些亚原子粒子具有完全随机的行为,使它们成为生成真随机数的一种方案。
两种随机数生成机制应用场景
真随机性和伪随机性根据其特征都有自己的实际应用。
真随机性的实际应用
1.密码学:
- 密钥生成: 真随机数对于生成加密密钥、会话令牌和其他安全参数至关重要,以确保它们的不可预测性和安全性。在加密协议中使用真随机值来防止重放攻击、侧信道攻击并确保加密操作的唯一性。各种算法(对称、非对称加密、MAC、身份验证签名)和协议(SSL/TLH、SSH、WIFI、LTE、IPsec 等)生成密钥时建议使用真随机数。
2. 赌博和彩票:
- 彩票抽奖: 通过使用真正的随机数来选择获胜者来确保公平竞争。
3. 科研:
- 随机抽样: 真正的随机抽样在实验设计和统计研究中是必不可少的,以消除偏差并确保结果的有效性。
伪随机数的实际应用
1. 计算机模拟与建模:
-
游戏开发: 伪随机数用于在游戏中生成各种元素(例如,地形、敌人行为),这些元素看起来是随机的,但可以复制以进行调试。
-
模拟: 科学和工程仿真通常使用伪随机数来模拟复杂的系统和过程。
2. 算法和数据结构:
-
哈希算法: 伪随机数用于在哈希表之间均匀分布数据。
-
随机算法: 依靠随机性(例如,快速排序、随机选择)来提高平均性能的算法。
3. 程序内容生成:
- 赌博: 生成广阔而多样的游戏世界(例如,Minecraft),这些世界是伪随机创建的,每次都提供不同的体验,同时允许可重复性。
4. 网络安全:
-
代币生成: 会话令牌和非关键加密操作,其中完美的不可预测性不是必需的。
-
验证码系统: 生成伪随机但足够不可预测的挑战,以阻止自动化机器人。
5. 机器学习:
-
数据洗牌: 以伪随机方式随机洗牌数据,以确保训练集和测试集正确随机化。
-
参数初始化: 使用伪随机数初始化神经网络中的权重和偏差,以确保训练期间的收敛性。
主要区别
- 真随机数源自物理过程(例如放射性衰变、大气噪声),本质上是不可预测的。它的实现成本通常较高,消耗的时间更多,并且会随着物理器件的使用寿命增加而存在损坏风险。
- 伪随机数由算法(例如,线性同余生成器)生成,是确定性的,但设计为随机的。它的实现成本通常较低,执行较快。
在不可预测性和安全性至关重要的场景中,真正的随机性是必不可少的,而在可重复性和效率很重要的应用中,伪随机性是首选。
对于大多数应用来说,伪随机数就足够了。例如,如果你想对一大组数据进行随机抽样,你需要将数字输入程序,以便样本或多或少均匀分布。在这种情况下,使用伪随机数是完全可以接受的,因为在随机性程度上真随机数没有数量优势。大部分情况下,可以使用伪 RNG 来满足你所有的随机数需求,直到你遇到真正需要真正随机的东西的情况,请从他们的区别出发,再评估下你的需求。
真正的随机性很难实现
真正的随机性很难实现(一个真正的随机生成器当然是可能的)。正确构造的TRNG需要从某种形式的随机过程(如晶体管中流动的电流产生的噪声或放射性衰变事件之间的时间)中收集熵,然后调节熵信号以消除偏置并白化产生的输出序列的频谱。此外,还必须根据工作温度、老化、对电子噪声和扰动的敏感性、电压变化和工作频率范围等因素来控制此过程。如果不控制这些因素,TRNG电路可能会被试图影响其运行的外部人员修改。
真随机数发生器基本上由三个主要组件组成:基于物理不可控现象的噪声发生器、随机性提取器(用于确保生成的位均匀分布)和随机性测试电池。下图是 STM32 上的真随机数生成器的结构,它基于电噪声来实现:
普通笔记本电脑等个人计算机可用的随机性来源包括:
- 周围的光线和场景
- 周围的声音或噪音
- 网络的 TCP 信息
- 特定网络的 RTT,取决于网络的拥塞情况
- 系统时间
- 内核或多核调度延迟
一些标准
弱随机数或可预测的随机数可能会破坏加密密钥、拦截数据以及提供入侵设备的通道。真正的随机性对于密钥生成、芯片制造、加密算法的初始值、挑战和侧信道对抗解决方案至关重要。
一些标准和认证协会正在推动TRNG的规范和验证方法,以定义真正的随机数解决方案的认证指南。
美国国家标准与技术研究院 (NIST) 机构开发了一套 NIST SP 800-90A/B/C 标准。德国标准机构 (BSI) 长期以来一直有一套单独的 RNG 标准 (AIS 20/31)。
• GM/T 0005-2012 和 GM/T 0062-2018 是中国标准,描述了 TRNG 和随机位序列的性能要求
• OSCCA是针对中国市场的认证计划。它需要基于其更高级别的不同原理的多个不同的熵源。
不同的标准描述了TRNG的要求,并适用到不同的地理区域。
总结
- 随机数生成器是保证保证生成的随机数足够“随机”(不可预测)的一种安全组件
- 真随机数生成器(True Random Number Generators,TRNG)生成不可预测的、统计上独立的(与任何先前生成的随机数无关、并且与之后生成的随机数也无关)、均匀分布(生成任何数字的概率相等)和受保护的随机数据。
- 真随机数与为随机数在生成原理、实现成本、执行速率上存在差别。可以 TRNG/PRNG 组合一起使用,从而使随机数生成更加有效。
- 真正的随机数很难生成,并且需要一定的硬件成本。
- 真随机数目前有NIST、AIS、GM/T 的一些标准。
(感谢收藏和点赞)