密码学/随机数生成
随机数的生成对密码学至关重要。密码学算法中最难的方面之一是依赖或生成真正的随机信息。这是有问题的,因为没有已知的方法可以产生真正的随机数据,尤其是没有方法可以在有限状态机(如计算机)上做到这一点。
一般来说,随机数生成器有两种:非确定性随机数生成器,有时称为“真随机数生成器”(TRNG),以及确定性随机数生成器,也称为伪随机数生成器(PRNG)。[1]
许多高质量的密码系统都同时使用这两种方法——硬件随机数生成器来定期重新播种确定性随机数生成器。
量子力学理论表明,一些物理过程本质上是随机的(虽然收集和使用此类数据存在问题),但确定性机制,例如计算机,则不能。任何随机过程(随机数生成)在计算机上模拟,都不是真正的随机,而只是伪随机。
在伪随机生成器的局限性内,任何高质量的伪随机数生成器都必须
- 在所有维度上具有均匀分布的值
- 没有可检测的模式,即生成的数字之间没有相关性
- 具有非常长的循环长度
- 没有或易于避免的弱初始条件,这些条件会产生模式或短循环
记住我们正在处理伪随机数生成(即从有限状态机,例如计算机生成的数字),有各种方法可以随机生成数字。
在 C 和 C++ 中,函数rand() 返回零到 RAND_MAX(内部定义的常量)之间的伪随机整数,通过srand() 函数定义;否则,它将使用默认种子,并且在程序重新启动时始终返回相同的数字。大多数这样的库都具有较短的循环长度,不适用于加密目的。
“C 语言数值方法”回顾了几种随机数生成器,并建议将修改后的 DES 密码作为他们推荐的最高质量随机数生成器。“实用密码学”(Ferguson 和 Schneier)推荐了一种他们命名为 Fortuna 的设计;它取代了他们早期称为 Yarrow 的设计。
截至 2004 年,最好的随机数生成器包含 3 部分:不可预测的非确定性机制、熵评估和调节器。非确定性机制(也称为熵源)生成原始有偏位的位块。熵评估部分对原始有偏位的位块的最小熵进行保守估计。调节器(也称为白化器、去偏算法或随机性提取器)将原始位块提炼成一个更小的条件输出位块——输出位块的大小是原始有偏位位的估计熵(以位为单位)的一半——消除任何系统偏差。如果估计良好,则即使非确定性机制随着时间的推移而下降,条件输出位也是无偏的完整熵位。在实践中,熵评估是最困难的部分。[2]
- ↑ NIST. "随机数生成".
- ↑ John Kelsey. "X9.82 中的熵和熵源" NIST. 2004. "你测量的是你认为你在测量的吗?" "样本变异中有多少是熵,有多少只是复杂性?"