博客
关于我
伪随机生成器具体实现——线性同余法
阅读量:177 次
发布时间:2019-02-28

本文共 1118 字,大约阅读时间需要 3 分钟。

一 点睛

线性同余法是一种使用很广泛的伪随机数生成器算法。然而,它并不能用于密码技术。

算法介绍如下:

假设我们要生成伪随机数列为R0、R1、R2...。首先,我们根据伪随机数的种子,用下列公式计算第一个伪随机数R0

R0=(A*种子+C)mod M

在这里,A、C、M都是常量,且A和C需要小于M

接下来,根据R0用相同的公式计算下一个伪随机数R1

R1=(A*R0+C)mod M

接下来我们再用同样的方法,根据当前的伪随机数Rn来计算下一个伪随机数R(n+1)

R(n+1)=(A*Rn+C)mod M

简而言之,线性同余法就是将当前的伪随机数值乘以A再加上C,然后将除以M得到的余数作为下一个伪随机数。在线性同余法中,最近一次生成的伪随机数的值就是内部状态,伪随机数的种子被用来对内部状态进行初始化。线性同余法的结构如下图:

二 实战

A=3

C=0

M=7

然后将6作为伪随机数的种子,根据线性同余法,生成伪随机数列的过程如下:

R0=(3*6+0)mod 7 =4

R1=(3*4+0)mod 7 =5

R2=(3*5+0)mod 7 =1

R3=(3*1+0)mod 7=3

以此类推,我们可以得到4、5、1、3、2、6、4、5、1、3、2、6...这样的伪随机数列。在这里,数列是以4、5、1、3、2、6的顺序不断循环的,因此周期为6。

由于伪随机数是除以M得到的余数,因此其范围必定是0~M-1,而且根据A、C、M的值,最终只能生成上述范围中的一部分值(因此周期会缩短)。例如,当A=6、C=0、M=7,且种子为6时,所得到的伪随机数列为1、6、1、6、1、6...周期为2。

如果改变A的值,生成的伪随机数列又将如何变化呢?我们可以发现,如果样让周期为6,只有A=3和A=5才能满足条件。

在线性同余法中,只要谨慎选择A、C、M的值,就能够很容易地生成具备随机性的伪随机数列。

然而,线性同余法不具备不可预测性,因此不可以将线性同余法用于密码技术。

很多伪随机数生成器的库函数都是采用线性同余法编写的。例如C语言的库函数rand,以及Java的java.util.Random类等,都采用了线性同余法。因此这些函数是不能用于密码技术的。

我们可以很容易地证明线性同余法不具备不可预测性。

假设攻击者已经A=3、C=0、M=7。这时,攻击者只要得到所生成的伪随机数中的任意一个,就可以预测出下一个伪随机。因为攻击者只要用得到的伪随机数R根据下来公式计算就可以了。

(A*R+C)mod M=(3*R+0)mod7

在这个过程中,攻击者没有必要知道种子6.此外,只要重复上述计算过程,就可以预测出之后生成的全部伪随机数。

你可能感兴趣的文章
MySQL事务及其特性与锁机制
查看>>
mysql事务理解
查看>>
MySQL事务详解结合MVCC机制的理解
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
webpack css文件处理
查看>>
mysql二进制包安装和遇到的问题
查看>>
MySql二进制日志的应用及恢復
查看>>
mysql互换表中两列数据方法
查看>>
mysql五补充部分:SQL逻辑查询语句执行顺序
查看>>
mysql交互式连接&非交互式连接
查看>>
MySQL什么情况下会导致索引失效
查看>>
Mysql什么时候建索引
查看>>
MySql从入门到精通
查看>>
MYSQL从入门到精通(一)
查看>>
MYSQL从入门到精通(二)
查看>>
mysql以下日期函数正确的_mysql 日期函数
查看>>
mysql以服务方式运行
查看>>
mysql优化--索引原理
查看>>
MySQL优化之BTree索引使用规则
查看>>