随机数 —— 不可预测性的源泉

和对称密码、公钥密码、数字签名等技术相比,生成随机数的技术确实不是很引人注意,但是,随机数在密码技术中却扮演着十分重要的角色。
例如,下面的场景中就会用到随机数。

【生成密钥】:用于对称密码和消息认证码。
【生成密钥对】:用于公钥密码和数字签名。
【生成初始化向量(IV)】:用于分组密码的CBC、CFB和OFB模式。
【生成nonce】:用于防御重放攻击以及分组密码的CTR模式。
【生成盐】:用于基于口令的密码(PBE)等。


随机数的性质

要给随机数下一个严密的定义是非常困难的,有时候甚至会进入哲学争论的范畴。在这里,我们只介绍一下随机数和密码技术相关的一些性质。
在这里我们将随机数的性质分为以下三类。

(1)   随机性——不存在统计学偏差,是完全杂乱的数列
(2)  不可预测性——不能从过去的数列推测出下一个出现的数
(3)  不可重现性——除非将数列本身保存下来,否则不能重现相同的数列

上面三个性质中,越往下就越严格。具备随机性,不代表一定具备不可预测性。密码技术中所使用的随机数,仅仅具备随机性是不够的,至少还需要具备不可预测性才行。

具备不可预测性的随机数,一定具备随机性。具备不可重现性的随机数,也一定具备随机性和不可预测性。

下面我们将上述三个性质按照顺序分别命名为“弱伪随机数”、“强伪随机数”和“真随机数”,整理如下。



伪随机数与真随机数

因此在密码技术领域,随机数就被分为了具备不可预测性伪随机数具备不可重现性真随机数

伪随机数
所谓不可预测性,是指攻击者在知道过去生成的伪随机数列的前提下,依然无法预测下一个生成出来的伪随机数的的性质。

那么如何才能编写出具备不可预测性的随机数生成器呢?其实,不可预测性是通过使用其他的密码技术来实现的。例如可以通过单项散列函数的单向性和密码的机密性来 保证伪随机数生成器的不可预测性。详情请见:PRNG

真随机数
所谓不可重现性,是指无法重现和某一随机数列完全相同的数列的性质。如果除了将随机数列本身保存下来以外,没有其他方法能够重现该数列,则我们就说该随机 数列具备不可重现性。

仅考软件是无法生成出具备不可重现性的随机数列的。软件只能生成伪随机数,这是因为运行软件的计算机本身仅具备有限的内部状态。而在内部状态相同的条件下,软件必然只 能生成相同的数,因此软件所生成的数列在某个时刻一定会出现重复。首次出现重复之前的数列长度称为周期,对于软件所生成的数列,其周期必定是有限的。当然,这 个周期可能会很长,但总归还是有限的。凡是具有周期的数列,都不具备不可重现性。

要生成具备不可重现性的随机数列,需要从不可重现的物理现象中获取信息,比如周围的温度和声音的变化,用户移动的鼠标的位置信息、键盘输入的时间间隔、放射线测量仪的 输出值等,根据从这些硬件中所获取的信息而生成的数列,一般可以认为是具备不可重现性的随机数列。详情请见:TRNG


随机数的随机性

验证随机数的随机性是确保随机数源确实是随机的至关重要的一步,特别是在涉及安全和密码应用的场景中。随机数的随机性通常通过统计测试来验证。 详情请见:随机性验证
+