博客
关于我
伪随机生成器具体实现——线性同余法
阅读量: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.此外,只要重复上述计算过程,就可以预测出之后生成的全部伪随机数。

你可能感兴趣的文章
NFS的安装以及windows/linux挂载linux网络文件系统NFS
查看>>
NFS的常用挂载参数
查看>>
NFS网络文件系统
查看>>
nft文件传输_利用remoting实现文件传输-.NET教程,远程及网络应用
查看>>
NFV商用可行新华三vBRAS方案实践验证
查看>>
ng build --aot --prod生成文件报错
查看>>
ng 指令的自定义、使用
查看>>
nghttp3使用指南
查看>>
Nginx
查看>>
nginx + etcd 动态负载均衡实践(三)—— 基于nginx-upsync-module实现
查看>>
nginx + etcd 动态负载均衡实践(二)—— 组件安装
查看>>
nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
查看>>
Nginx + Spring Boot 实现负载均衡
查看>>
Nginx + uWSGI + Flask + Vhost
查看>>
Nginx - Header详解
查看>>
Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
查看>>
nginx 1.24.0 安装nginx最新稳定版
查看>>
nginx 301 永久重定向
查看>>
nginx css,js合并插件,淘宝nginx合并js,css插件
查看>>
Nginx gateway集群和动态网关
查看>>