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

你可能感兴趣的文章
netty php,netty
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Vue过渡 & 动画---vue工作笔记0014
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty 的 Handler 链调用机制
查看>>
Netty 编解码器和 Handler 调用机制
查看>>
Netty 编解码器详解
查看>>
Netty 解决TCP粘包/半包使用
查看>>
Netty 调用,效率这么低还用啥?
查看>>
Netty 高性能架构设计
查看>>
Netty+Protostuff实现单机压测秒级接收35万个对象实践经验分享
查看>>
Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)
查看>>
netty--helloword程序
查看>>
netty2---服务端和客户端
查看>>
【Flink】Flink 2023 Flink易用性和稳定性在Shopee的优化-视频笔记
查看>>
Netty5.x 和3.x、4.x的区别及注意事项(官方翻译)
查看>>
netty——bytebuf的创建、内存分配与池化、组成、扩容规则、写入读取、内存回收、零拷贝
查看>>
netty——Channl的常用方法、ChannelFuture、CloseFuture
查看>>
netty——EventLoop概念、处理普通任务定时任务、处理io事件、EventLoopGroup
查看>>