在这里我们将随机数的性质分为以下三类。
随机性——不存在统计学偏差,是完全杂乱的数列
不可预测性不能从过去的数列推测出下一个出现的数
不可重现性—除非将数列本身保存下来,否则不能重现相同的数列
上面三个性质中,越往下就越严格。具备随机性,不代表一定具备不可预测性。密码技术中所使用的随机数,仅仅具备随机性是不够的,至少还需要具备不可预测性才行。
具备不可预测性的随机数,一定具备随机性。具备不可重现性的随机数,也一定具备随机性和不可预测性。
下面我们来按顺序讲解一下随机性、不可预测性和不可重现性。
我们先来介绍一下随机性
所谓随机性,简单来说就是看上去杂乱无章的性质。我们可以用伪随机数生成器大量生成0到9范围内的整数,然后看一看所生成的数列。如果数列是像0、1、2、3、4、5、6、7、8、9、0、1、2…这样不断循环的,那肯定不是杂乱无章的。或者乍一看是杂乱无章的,但实际上在数列中0一次都没有出现,或者整个数列中有一半都是6,这样的数列也不能算是杂乱无章的。
如果伪随机数列中不存在统计学偏差,则我们可以认为这个伪随机数列是随机的。判断个伪随机数列是否随机的方法称为随机数测试,随机数测试的方法有很多种。
密码技术中所使用的随机数,仅仅具备随机性是不够的。密码技术中使用的随机数需要具备怎样的性质。由于随机数会被用来生成密钥,因此密钥不能被攻击者看穿。但是,杂乱无章并不代表不会被看穿,因此本书中将只具备随机性的伪随机数称为“弱伪随机数”。
不可预测性
密码中所使用的随机数仅仅具备随机性是不够的,还需要具备避免被攻击者看穿的不可预测性。
所谓不可预测性,是指攻击者在知道过去生成的伪随机数列的前提下,依然无法预测出下一个生成出来的伪随机数的性质。其中,“在知道过去生成的伪随机数列的前提下………,”是非常重要的一点。
现在我们假设攻击者已经知道伪随机数生成器的算法。此外,正如攻击者不知道密钥一样,他也不知道伪随机数的种子。伪随机数生成器的算法是公开的,但伪随机数的种子是保密的。在上述假设的前提下,即便攻击者知道过去所生成的伪随机数列,他也无法预测出下一个生成出来的伪随机数—这就是不可预测性。
不可预测性是通过使用其他的密码技术来实现的。例如,可以通过单向散列函数的单向性和密码的机密性来保证伪随机数生成器的不可预测性。我们将具备不可预测性的伪随机数称为强伪随机数。
不可重现性
所谓不可重现性,是指无法重现和某一随机数列完全相同的数列的性质。如果除了将随机数列本身保存下来以外,没有其他方法能够重现该数列,则我们就说该随机数列具备不可重现性。
仅靠软件是无法生成出具备不可重现性的随机数列的。软件只能生成伪随机数列,这是因为运行软件的计算机本身仅具备有限的内部状态。而在内部状态相同的条件下,软件必然只能生成相同的数,因此软件所生成的数列在某个时刻一定会出现重复。首次出现重复之前的数列长度称为周期,对于软件所生成的数列,其周期必定是有限的。
当然,这个周期可能会很长,但总归还是有限的。凡是具有周期的数列,都不具备不可重现性。要生成具备不可重现性的随机数列,需要从不可重现的物理现象中获取信息,比如周围的温度和声音的变化、用户移动的鼠标的位置信息、键盘输入的时间间隔、放射线测量仪的输出值等,根据从这些硬件中所获取的信息而生成的数列,一般可以认为是具备不可重现性的随机数列。我们将具备不可重现性的随机数称为真随机数。