【随机性放大】
伪随机生成器具有一个非常重要的性质:它们是高效的随机性放大器(Amplifiers/Expanders of Randomness)。也就是说,伪随机生成器只需要使用很少的真正随机性,例如一个随机选择的种子,就能够产生很长的序列,并且这些序列在任何高效观察者看来都像是真正随机的。
如果一个伪随机生成器 $G$ 输入一个 $n$ 比特的随机种子 $s\leftarrow U_n$,然后输出一个多项式长度的字符串:
那么虽然 $G(s)$ 不是真正均匀随机的,但对于任何多项式时间算法来说,它都无法有效区分 $G(s)$ 和真正的均匀随机串。
因此,在任何需要随机序列的高效应用中,都可以用伪随机序列 $G(U_n)$ 替代真正随机序列 $U_{\mathrm{poly}(n)}$,且这种替代造成的性能差异至多是可忽略的。
原因是,如果某个高效应用在替换后出现不可忽略的性能下降,那么说明该应用能够察觉真正随机序列和伪随机序列之间的差别。于是,这个应用本身就可以被改造成一个区分器。更具体地说:
- 当输入是真正随机序列时,应用表现较好
- 当输入是伪随机序列时,应用表现明显变差
- 那么可以利用这种性能差异判断输入究竟来自真正随机分布,还是来自伪随机生成器
- 这就构造出了一个能区分 $G(U_n)$ 和 $U_{\mathrm{poly}(n)}$ 的高效算法
但是这与伪随机生成器的定义矛盾。因为如果 $G$ 是伪随机生成器,那么任何多项式时间算法都不能以不可忽略优势区分 $G(U_n)$ 和 $U_{\mathrm{poly}(n)}$。
所以,只要 $G$ 是伪随机生成器,它的输出就可以安全地替代真正随机序列,并且不会造成不可忽略的性能损失。
【伪随机生成器的通用性】
伪随机生成器的一个重要优点在于它具有很强的通用性(Generality)。也就是说,一旦证明某个算法确实是伪随机生成器,就可以把它用于任何需要随机序列的高效应用中,而不需要针对每一个新的具体应用重新测试它的表现。
如果没有伪随机性的统一定义,那么每当把一个生成器用于某个新任务时,都必须重新分析:
- 这个任务是否会发现生成器输出中的规律
- 生成器在这个任务中的表现是否接近真正随机
- 是否存在某种特殊攻击能利用该任务的结构区分伪随机输出
而伪随机生成器的定义直接避免了这种逐个应用分析的麻烦,因为它保证只要应用是多项式时间的,那么它就不能有效区分伪随机序列和真正随机序列。
因此,伪随机生成器是一种通用的随机性替代品。
【在密码学中的意义】
伪随机生成器在密码学中极其重要,因为几乎所有密码学任务的实现都需要大量的高质量随机性(High-quality Randomness)。
例如,密码学协议中常常需要随机密钥、随机挑战、随机选择的秘密值、随机化加密中的随机比特等。这些随机性不仅数量大,而且质量要求很高。
如果随机性质量不好,例如存在偏差、可预测性或重复使用,那么密码系统可能直接失去安全性。但是,真正高质量随机比特的生成、交换和共享通常代价较高。
伪随机生成器正好解决了这个问题,它允许只付出生成、交换或共享 $n$ 个真正随机比特的代价,却得到 $\mathrm{poly}(n)$ 个伪随机比特。
也就是说,只要双方共享一个短随机种子 $s\in\{0,1\}^n$,就可以通过伪随机生成器生成一段很长的伪随机序列 $G(s)$,这段序列在计算意义上可以当作真正随机序列使用。
因此,伪随机生成器把生成、交换或共享大量高质量随机比特的问题,转化成了生成、交换或共享少量真正随机种子的问题。