博客
关于我
伪随机生成器具体实现——线性同余法
阅读量: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备份工具xtrabackup
查看>>
mysql备份恢复出错_尝试备份/恢复mysql数据库时出错
查看>>
mysql复制内容到一张新表
查看>>
mysql复制表结构和数据
查看>>
mysql复杂查询,优质题目
查看>>
MySQL外键约束
查看>>
MySQL多表关联on和where速度对比实测谁更快
查看>>
MySQL多表左右连接查询
查看>>
mysql大批量删除(修改)The total number of locks exceeds the lock table size 错误的解决办法
查看>>
mysql如何做到存在就更新不存就插入_MySQL 索引及优化实战(二)
查看>>
mysql如何删除数据表,被关联的数据表如何删除呢
查看>>
MySQL如何实现ACID ?
查看>>
mysql如何记录数据库响应时间
查看>>
MySQL子查询
查看>>
Mysql字段、索引操作
查看>>
mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
查看>>
mysql字段类型不一致导致的索引失效
查看>>
mysql字段类型介绍
查看>>
mysql字段解析逗号分割_MySQL逗号分割字段的行列转换技巧
查看>>