伪随机数长度: 格式:
伪随机数生成器的结构

伪随机数生成器具有“内部状态”,并根据外部输入的“种子”来生成伪随机数列。

伪随机数生成器的内部状态
伪随机数生成器的内部状态,是指伪随机数生成器所管理的内存中的数值。当有人对伪随机数生成器发出“给我一个伪随机数”的请求时,伪随机数生成器会根据内存中 的数据(内部状态)进行计算,并将计算的结果作为伪随机数输出。随后,为了响应下一个伪随机数的方法和改变内部状态的方法组合起来,就是伪随机数生成的算法。

伪随机数生成器的种子
为了生成伪随机数,伪随机数生成器需要被称为种子的信息,伪随机数的种子时用来对伪随机数生成器的内部状态进行初始化的。

伪随机数的种子是一串随机的比特序列,根据种子就可以生成出专属于自己的伪随机数数列。伪随机数生成器是公开的,但种子是需要自己保密的,这就好像密码算法是公开的, 但密钥只能自己保密。由于种子不可以被攻击者知道,因此不可以使用容易被预测的值,例如不可以用当前时间作为种子。

伪随机数生成器的实现方法

单向散列函数法
使用单向散列函数(如SHA-1)可以编写出能够生成具备不可预测性的伪随机数列(即强伪随机数)的伪随机生成器。

这种伪随机数生成器的工作方式如下。

(1) 用伪随机数的种子初始化内部状态(计数器)。
(2) 用单向散列函数计算计数器的散列值。
(3) 将散列值作为伪随机数输出。
(4) 计数器的值加1。
(5) 根据需要的伪随机数数量重复(2)~(4)的步骤。

假设攻击者获得了这样的伪随机数生成器所生成的过去的伪随机数列,攻击者要预测下一个伪随机数,需要知道计数器的当前值。这里输出的伪随机数列实际上相当于单向散列函 数的散列值。也就是说,要想知道计数器的值,就需要破解单向散列函数的单向性,这是非常困难的,因此攻击者无法预测下一个伪随机数。总而言之,在这种伪随机数生成器中, 单向散列函数的单向性是支撑伪随机数生成器不可预测性的基础

密码法
我们可以使用密码来编写能够生成强伪随机数的伪随机数生成器。既可以使用AES等对称密码,也可以使用RSA等公钥密码。

这种伪随机数生成器的工作方式如下。

(1) 初始化内部状态(计数器)。
(2) 用密钥加密计数器的值。
(3) 将密文作为伪随机数输出。
(4) 计数器的值加1。
(5) 根据需要的伪随机数数量重复(2)~(4)的步骤。

同样假设攻击者获得了这样的伪随机数生成器所生成的过去的伪随机数列,攻击者要预测下一个伪随机数,需要知道计数器的当前值。然而,由于之前所输出的伪随机数列相当于密 文,因此要知道计数器的值,就需要破译密码,这是非常困难的,因此攻击者无法预测出下一个伪随机数。总而言之,在这种伪随机数生成器种,密码的机密性是支撑伪随机数生 成器不可预测性的基础

ANSI X9.17
关于用密码实现伪随机数生成器的具体方法,在ANSI X9.17和ANSI X9.31的附录中进行了描述(以下简称“ANSI X9.17方法”),下面我们来介绍一下这种方法。

实现伪随机数生成器的步骤如下。

(1) 初始化内部状态。
(2) 将当前时间加密成掩码。
(3) 对内部状态和掩码求XOR。
(4) 将步骤(3)的结果进行加密。
(5) 将步骤(4)的结果作为伪随机数输出。
(5) 对步骤(4)的结果与掩码求XOR。
(5) 将步骤(6)的结果加密。
(5) 将步骤(7)的结果作为新的内部状态。
(5) 重放步骤(2)~(8)直到得到所需数量的伪随机数。

通过分析上述步骤,我们可以发现,在这种伪随机数生成器中,密码的使用保证了无法根据输出的伪随机数列来推测内部状态。换言之,伪随机数生成器的内部状态是通过密码进行保 护的。
+