伪随机数发生器
杂乱的方法
用杂乱的算法生成,但是是错的,不可用。
线性同余法
线性同余法是一种使用很广泛的伪随机数发生器算法,然后,他不能用于密码技术。其算法如下:假设我们要生成的伪随机数列R0,R1,R2,…。
首先我们根据伪随机数的种子,用下列公式计算第一个伪随机数R0。
第一个伪随机数R0=(Ax种子+C)mod M。
第二个伪随机数R1=AxR0+C)mod M。
依次计算Rn+1。
简单来说,线性同余法就是将当前伪随机数乘以A加上C,然后除以M得到的余数作为下一个伪随机数。
伪代码
M=正整数
A=大于0小于M的整数
C=大于0小于M的整数
内部状态=伪随机数的种子
while(true){
伪随机数=(Ax内部状态+C)mod M;
内部状态=伪随机数;
输出伪随机数;
}
单向散列函数法
工作方式如下:
- 用伪随机数的种子初始化内部状态(计数器)
- 用单向散列函数计算计数器的散列值
- 将散列值作为伪随机数输出
- 计数器的值加1
- 根据需要重复2~4步骤
密码法
这种方法与上面的单向散列函数法基本类似,只是将单向散列函数换成加密算法,算法未明确规定。
- 初始化内部状态(计数器)
- 用密钥加密计数器的值
- 将密文作为伪随机数输出
- 计数器的值+1
- 根据需要重复2~4步骤
ANSI X9.17
实现伪随机数发生器的步骤如下:
- 初始化内部状态
- 将当前时间加密生成掩码
- 对内部状态与掩码异或
- 将步骤3结果加密
- 将步骤4结果作为伪随机数输出
- 对步骤4结果与掩码异或
- 将步骤6结果加密
- 将步骤7结果作为新的内部状态
- 重复2-8步骤
具体如图所示。
总结
以上我们介绍几种伪随机数发生器,但用于密码学中的随机数都是真随机数,而不是通过算法去生成的,这种生成的随机数很容易被反推以及破解。