并行伪随机数生成器与加密安全伪随机数生成器
在随机数生成领域,并行生成伪随机数以及生成加密安全的伪随机数是两个重要的研究方向。下面将详细介绍并行伪随机数生成的几种方法,以及四种加密安全的伪随机数生成器。
1. 并行伪随机数生成方法
为了生成独立的伪随机值流,有五种不同的方法被提出和研究。下面是对这五种方法的详细介绍:
-
伪随机数服务器
:这是一个看似合理的想法,通过一个服务器来提供伪随机数。需要伪随机数的进程可以访问该服务器。如果服务器本身实现了一个周期非常大的生成器,这种方法似乎很理想。然而,它有两个严重的缺点:一是速度慢,模拟通常需要非常高的随机值生成速率,而进程间通信的开销会大大减慢模拟速度;二是非确定性,无法保证每次运行使用该服务器的进程时能得到相同的随机值序列。
-
每个流使用不同的生成器
:这种方法自然会带来独立性。以 xorshift32 为例,使用 Marsaglia 论文中的 81 组不同参数对其进行参数化,可得到多达 81 个不同的流。测试表明,这种方法很有用,并且使用这种方法创建 KISS 生成器的流不会影响 KISS 生成器的输出质量。不过,并非每个生成器都能轻松进行参数化,而且参数化的数量可能有限。
-
跳过或提前跳转
:这是并行生成器的常见方法,使用 MINSTD、xorshift128+ 和 xorshift1024
进行了测试。对于 MINSTD,将单个生成器的输出提前跳过每个流样本数的 110%;xorshift128+ 和 xorshift1024
分别有预计算的跳转函数,可提前跳过 2^64 或 2^512 个样本。结果显示,xorshift128+ 和 xorshift1024
的跳转函数效果很好,能将单个流分离成大量不重叠的流,每个流都有相对较大的输出值空间;而 MINSTD 的跳过效果不太好,但容易理解。这种方法的一个严重缺点是并非所有生成器都能有效地进行提前跳转。
-
随机种子
:这种方法很有吸引力,因为它适用于任意一对生成器。只需将源生成器的输出作为目标生成器的种子值,每次需要新的流时,从源生成器获取一个新的种子。测试表明,这种方法虽然有一定风险,但总体上相当适用,特别是当目标生成器的周期很大时,流之间重叠的概率会变得很小。
-
Fog XOR 方法
*:类似于随机种子,但使用两个独立的生成器,其输出进行异或运算。每个流的每个生成器都用第三个生成器的种子进行初始化。即使使用非常弱的种子生成器(如 RANDU),该方法也能取得出色的性能。
以下是这些方法的优缺点总结表格:
| 方法 | 优点 | 缺点 |
| — | — | — |
| 伪随机数服务器 | 若服务器周期大看似理想 | 速度慢,非确定性 |
| 每个流使用不同的生成器 | 带来独立性,不影响部分生成器输出质量 | 并非所有生成器易参数化,参数化数量有限 |
| 跳过或提前跳转 | xorshift128+ 和 xorshift1024* 效果好 | 并非所有生成器能有效提前跳转 |
| 随机种子 | 适用于任意生成器对,目标生成器周期大时效果好 | 有一定风险 |
| Fog XOR 方法 | 性能出色 | 需要为每个流实现两个生成器 |
2. 并行生成器使用建议
根据上述测试结果,对于并行生成器的使用,有以下建议:
-
跳过方法
:如果对 xorshift128+ 或 xorshift1024
的测试性能满意,跳过方法很有吸引力。但需要知道已初始化的流的数量,以便多次调用跳转函数以移动到输出空间的新区域。
-
随机种子方法
:适用于长周期的目标生成器,优点是无需考虑已初始化的流的数量,但需要对每个流使用相同的源生成器,以确保种子是仅初始化一次的源生成器的连续输出。在测试中,KISS 是最佳的目标生成器。
-
Fog 方法
*:与随机种子方法类似,但需要更多的计算。额外的代码层在某些应用中可能是可取的,以防止初始化不佳。
以下是使用不同方法生成并行伪随机数的流程 mermaid 图:
graph LR
A[开始] --> B{选择方法}
B --> |伪随机数服务器| C(访问服务器获取随机数)
B --> |每个流不同生成器| D(参数化生成器)
B --> |跳过或提前跳转| E(使用跳转函数)
B --> |随机种子| F(源生成器提供种子)
B --> |Fog XOR 方法| G(两个生成器异或)
C --> H[结束]
D --> H
E --> H
F --> H
G --> H
3. 加密安全伪随机数生成器
在加密领域,需要能够抵御攻击的伪随机数生成器,即加密安全的伪随机数生成器(CSPRNGs)。下面介绍四种这样的生成器:
-
Blum Blum Shub(BBS)
:这是一种历史上的生成器,虽然简单且在理论和实现上有一定的趣味性,但不适合用于真正需要安全的加密工作。其数学原理基于线性同余生成器的形式,通过选择特定的素数 p 和 q 计算模数 n,然后根据公式 xi+1 = xi^2 mod n 生成随机数。
-
ISAAC
:目前被认为是安全的,但不使用外部熵源。
-
Fortuna
:由 Schneier 和 Furguson 提出,使用外部熵源,并明确针对状态知识攻击进行防护,目前被认为是安全的。
-
ChaCha20
:类似于 Fortuna,被 Google 用于浏览器和网站之间的传输层安全(TLS),也在较新的 Linux 内核(≥4.8)中使用。
4. Blum Blum Shub 生成器详细介绍
Blum Blum Shub 生成器的数学原理如下:
- 种子是一个整数 x0。
- 生成器公式为 xi+1 = xi^2 mod n,其中 n 是 Blum 整数,即两个满足 p mod 4 = 3 和 q mod 4 = 3 的素数 p 和 q 的乘积。
- 随着 n 趋于无穷,xi 序列的最低位使得 xi+1 的最低位无法以大于 50% 的概率确定,满足下一位测试。这是因为该问题类似于解决高斯提出的二次剩余问题。
以下是使用 Python 实现 BBS 生成器的代码:
import sys
import os
class BBS:
def __init__(self, seed, n=2214251461768250569337):
self.seed = seed
self.n = n
def next(self):
b = 0
for i in range(8):
self.seed = (self.seed*self.seed) % self.n
if (self.seed % 2):
b |= (1 << i)
return b
def main():
bbs = BBS(int(sys.argv[1]))
with open(sys.argv[3],"w") as f:
for i in range(int(sys.argv[2])):
f.write("%s" % chr(bbs.next()))
if (__name__ == "__main__"):
main()
5. BBS 生成器性能测试
运行上述代码生成两亿字节的输出文件,并使用 ent 和 dieharder 进行测试,结果如下:
-
ent 测试结果
:
- 熵:每字节 8.000000 位。
- 最佳压缩率:0%。
- 卡方分布:254.21,随机情况下超过此值的概率为 50.00%。
- 算术平均值:127.4985(随机值为 127.5)。
- 蒙特卡罗计算的圆周率:3.141563067(误差 0.00%)。
- 串行相关系数:-0.000046(完全不相关为 0.0)。
-
dieharder 测试结果
:得分 223,114 项测试中 109 项通过,5 项较弱,0 项失败。
与 MINSTD 生成器的输出相比,BBS 生成器的结果更好。
6. BBS 生成器的周期和直接输出功能
- 周期计算 :BBS 生成器的周期 T 是 n 的函数,可通过 T = λ(λ(n)) 计算,其中 λ() 是 Carmichael λ 函数。使用 Python 的 numbthy 库计算得到 T = 375809633466223320 ≈ 2^58,这是一个有用的周期,但并非非常出色。更大的 p 和 q 会相应增加周期。
- 直接输出功能 :BBS 生成器的一个有趣特性是可以直接输出第 i 个值而无需计算之前的值。数学公式为 xi = (x0^(2^i mod λ(n))) mod n。可以在上述代码中添加以下方法来实现此功能:
def idx(self, m):
b = 0
for i in range(8*m, 8*m+8):
e = pow(2, i, self.l)
v = pow(self.x0, e, self.n)
if (v % 2):
b |= (1 << (i%8))
return b
7. 总结
在并行伪随机数生成方面,不同的方法各有优缺点,需要根据具体需求选择合适的方法。而在加密安全伪随机数生成方面,Blum Blum Shub 虽然有其历史和理论价值,但不适合用于实际的安全加密工作,ISAAC、Fortuna 和 ChaCha20 则是目前更可靠的选择。通过对这些生成器的研究和测试,可以更好地满足不同领域对随机数生成的需求。
以下是加密安全伪随机数生成器的特点总结列表:
- Blum Blum Shub:历史意义大,不适合实际安全工作,数学原理简单。
- ISAAC:目前安全,不使用外部熵源。
- Fortuna:使用外部熵源,防护状态知识攻击。
- ChaCha20:用于 Google TLS,Linux 内核也有使用。
并行伪随机数生成器与加密安全伪随机数生成器
8. 各方法的深入分析与对比
为了更清晰地了解并行伪随机数生成的五种方法,我们进一步分析它们在不同场景下的表现。
伪随机数服务器 :在对速度要求不高且对随机数序列重复性要求也不高的场景中,该方法可能勉强可用。但在大规模模拟实验中,由于其速度慢和非确定性的缺点,会严重影响实验效率和结果的可重复性。例如,在金融市场的高频交易模拟中,需要在短时间内生成大量随机数来模拟市场波动,伪随机数服务器的低效率会导致模拟结果滞后,无法准确反映市场情况。
每个流使用不同的生成器 :当生成器可以方便地进行参数化,并且需要的流数量不超过参数化的数量时,这种方法能很好地保证流之间的独立性。然而,对于一些复杂的生成器,参数化可能非常困难,甚至无法实现。比如某些基于深度学习模型的随机数生成器,其内部结构复杂,很难找到合适的参数进行调整来生成不同的流。
跳过或提前跳转 :对于支持高效跳转的生成器,如 xorshift128+ 和 xorshift1024*,该方法能有效地将单个流分离成多个不重叠的流,适用于需要大量独立随机数流的并行计算场景。但对于不支持高效跳转的生成器,如 MINSTD,跳过操作可能会导致流之间的重叠,影响随机数的质量。在并行计算的图像渲染中,如果使用不适合的生成器进行跳过操作,可能会导致图像出现重复的纹理或颜色模式,影响渲染效果。
随机种子 :该方法的灵活性较高,适用于各种类型的生成器。当目标生成器的周期足够大时,流之间重叠的概率会大大降低。但如果目标生成器的周期较小,或者源生成器的随机性不足,就可能会出现流之间的重叠。例如,在使用随机种子方法为小型嵌入式系统的随机数生成器提供种子时,如果源生成器的熵较低,可能会导致不同流之间的随机数序列相似,影响系统的安全性。
Fog XOR 方法 :虽然需要更多的计算资源,但它能提供更高的安全性。在对随机数安全性要求较高的场景中,如加密通信、密码学应用等,Fog XOR 方法是一个不错的选择。但在对计算资源有限的设备上,过多的计算会增加设备的负担,降低系统性能。
以下是各方法在不同场景下的适用性对比表格:
| 方法 | 速度要求高场景 | 可重复性要求高场景 | 大量独立流场景 | 安全性要求高场景 | 计算资源有限场景 |
| — | — | — | — | — | — |
| 伪随机数服务器 | 不适用 | 不适用 | 不适用 | 不适用 | 不适用 |
| 每个流使用不同的生成器 | 适用(参数化容易时) | 适用 | 适用(流数量有限时) | 一般 | 适用(生成器简单时) |
| 跳过或提前跳转 | 适用(支持高效跳转时) | 适用 | 适用 | 一般 | 适用(跳转计算简单时) |
| 随机种子 | 适用 | 适用 | 适用 | 一般(目标周期大时较好) | 适用 |
| Fog XOR 方法 | 不适用 | 适用 | 适用 | 适用 | 不适用 |
9. 加密安全伪随机数生成器的应用场景
不同的加密安全伪随机数生成器适用于不同的加密场景。
Blum Blum Shub :虽然不适合用于实际的安全加密工作,但在教学和理论研究中具有重要价值。它的简单数学原理可以帮助初学者更好地理解随机数生成和加密算法的基本概念。例如,在大学的密码学课程中,可以使用 BBS 生成器来演示随机数的生成过程和加密算法的安全性评估。
ISAAC :由于其不使用外部熵源,在一些对外部环境依赖较小的加密场景中可以使用。例如,在一些独立的嵌入式设备中,无法获取外部熵源,ISAAC 可以作为一种安全的随机数生成器。但需要注意的是,由于缺乏外部熵的注入,其长期安全性可能会受到一定影响。
Fortuna :使用外部熵源并防护状态知识攻击,适用于对安全性要求极高的加密场景。在金融机构的加密通信、政府的机密信息传输等场景中,Fortuna 可以提供可靠的随机数生成,确保通信内容的保密性和完整性。
ChaCha20 :在网络通信领域有广泛的应用。Google 将其用于浏览器和网站之间的传输层安全(TLS),可以有效防止网络攻击,保护用户的隐私和数据安全。同时,在较新的 Linux 内核中使用 ChaCha20,也提高了操作系统的安全性。
以下是加密安全伪随机数生成器的应用场景总结列表:
- Blum Blum Shub:教学和理论研究。
- ISAAC:独立嵌入式设备。
- Fortuna:金融机构加密通信、政府机密信息传输。
- ChaCha20:网络通信(Google TLS、Linux 内核)。
10. 随机数生成器的安全风险与防范
随机数生成器的安全性至关重要,一旦出现安全漏洞,可能会导致严重的后果。历史上有许多随机数生成器出现安全问题的案例。
Netscape 浏览器的随机数种子弱点 :1996 年,Goldberg 和 Wagner 发现 Netscape 浏览器的随机数生成器基于进程 ID、父进程 ID 和时间等信息进行种子初始化。攻击者可以通过获取这些信息,使用暴力破解的方法找到随机数的种子,从而破解浏览器的安全套接层(SSL)加密,获取用户的敏感信息。为了防范此类风险,随机数生成器应该使用更复杂、难以预测的熵源,如用户的键盘输入时间、鼠标移动轨迹等。
Windows 2000 随机数生成器的漏洞 :研究人员通过逆向工程发现,Windows 2000 随机数生成器可以被预测未来和过去的输出。这违反了加密安全伪随机数生成器的要求,使得攻击者可以获取系统中的敏感信息。为了避免类似问题,随机数生成器的设计应该更加复杂,增加攻击者预测输出的难度。
RSA 密钥生成的问题 :在 RSA 密钥生成过程中,如果使用了质量不佳的随机数生成器,可能会导致密钥的重复使用,从而使密钥被破解。例如,在一些嵌入式系统中,由于熵源不足,随机数生成器生成的密钥可能存在重复,攻击者可以通过计算最大公约数(GCD)的方法破解密钥。为了保证 RSA 密钥的安全性,应该使用高质量的随机数生成器,并确保熵源的充足。
以下是随机数生成器安全风险的防范措施 mermaid 图:
graph LR
A[选择高质量随机数生成器] --> B[使用复杂熵源]
B --> C[避免使用可预测信息作为种子]
A --> D[增加生成器复杂度]
D --> E[防止攻击者预测输出]
A --> F[定期更新熵源]
F --> G[保证随机数的随机性]
11. 未来发展趋势
随着计算机技术的不断发展,随机数生成领域也在不断进步。未来,随机数生成器可能会朝着以下几个方向发展:
更高的安全性 :随着加密技术的不断升级,对随机数生成器的安全性要求也会越来越高。未来的随机数生成器可能会结合更多的加密算法和安全机制,如量子加密技术,来提高随机数的安全性。
更好的性能 :在保证安全性的前提下,提高随机数生成的速度和效率是未来的重要发展方向。例如,利用硬件加速技术,如 GPU 加速,来快速生成大量高质量的随机数。
更广泛的应用 :随机数在各个领域的应用会越来越广泛,除了传统的加密、模拟等领域,还会在人工智能、机器学习等新兴领域发挥重要作用。例如,在深度学习的模型训练中,随机数可以用于初始化模型参数、随机采样数据等,提高模型的训练效果和泛化能力。
12. 总结与建议
在选择随机数生成方法和生成器时,需要根据具体的应用场景和需求进行综合考虑。
对于并行伪随机数生成,跳过、随机种子和 Fog 方法是比较好的选择。如果对 xorshift128+ 或 xorshift1024* 的性能满意,可以优先考虑跳过方法;对于长周期的目标生成器,随机种子方法更合适;在对安全性要求较高的场景中,Fog 方法能提供更好的保障。
对于加密安全伪随机数生成,ISAAC、Fortuna 和 ChaCha20 是目前更可靠的选择。Blum Blum Shub 虽然有一定的历史和理论价值,但不适合用于实际的安全加密工作。
同时,要重视随机数生成器的安全性,采取有效的防范措施,避免出现安全漏洞。在未来的发展中,关注随机数生成领域的新技术和新趋势,不断优化随机数生成方案,以满足不同领域对随机数的需求。
通过对并行伪随机数生成和加密安全伪随机数生成的研究和实践,我们可以更好地利用随机数来解决各种实际问题,提高系统的安全性和性能。
超级会员免费看
1222

被折叠的 条评论
为什么被折叠?



