伪随机数的生成

合集下载

伪随机数生成算法

伪随机数生成算法

伪随机数生成算法伪随机数生成算法是一种应用广泛的数据处理技术,它可以用来产生随机数和随机性结果。

它广泛应用于科学研究、工程设计、生物信息学、通信技术等领域,是大多数数学和计算机算法几乎不可或缺的一种工具。

本文将介绍伪随机数生成算法,包括它的原理、实现步骤和应用场景。

一、伪随机数生成算法的原理伪随机数生成算法是一种算术组合算法,它的核心是将某个“可能的”范围内的数字进行一段分散的处理,这个“可能的”范围可以是随机的范围,也可以是一组规则的范围,比如从一个已知的数学公式中,实现某种规律的随机数字序列。

具体的处理步骤可以用以下数学表达式来描述:X(n+1)=F(Xn)其中Xn表示上一次生成的随机数,F(Xn)是某个特定的数学处理函数,它可以把Xn转化为下一个随机数X(n+1)。

由于X(n+1)和Xn 不相关,因此可以保证X(n+1)是一个“假随机”数,不受任何规律和确定性的影响,即使是一段相同的序列,其中的每个数字都是一个“假随机”数。

二、伪随机数生成算法的实现伪随机数生成算法的实现有三个步骤:初始化种子,选择合适的处理函数,实现步骤2的结果。

1.始化种子:初始化种子也叫做随机种子,它是一个用来初始化伪随机数序列的数字,它可以随着时间改变,也可以由用户输入。

2.择合适的处理函数:选择合适的处理函数是指根据种子的值,构建一个能够将每一次迭代的输出和输入转化为不同的数字的处理函数。

处理函数比如通过使用一个固定的函数进行计算,或者随机数的序列可以直接和处理函数拼接实现,或者使用一个特定的规则对随机数的序列进行改变,这些都是可以实现的方式。

3.现步骤2的结果:最后,根据步骤2中选择的处理函数,通过重复迭代,生成合乎要求的随机序列。

三、伪随机数生成算法的应用伪随机数生成算法的应用非常广泛,它可以用在各种计算机技术中,如密码学、密钥管理、压缩算法、数据编码、计算机图形、网络安全、机器学习、游戏开发、计算机视觉、科学研究等等。

伪随机码的特性

伪随机码的特性

伪随机码的特性
伪随机码(Pseudorandom code)是由确定性算法生成的序列,具有伪随机性,即在统计意义上类似于真随机数。

伪随机码的特性包括:
1、由确定性算法生成,可以重复生成。

2、满足随机性要求,如均匀性、独立性等。

3、比真随机数生成器慢。

4、由于生成方式有限,生成的伪随机数序列长度有限。

5、伪随机数生成算法通常需要一个种子值来初始化,种子值相同会生成相同的
6、伪随机数序列,因此伪随机数序列的随机性取决于种子值的随机性。

7、伪随机数在密码学领域有广泛应用,如密钥生成、密码加密等。

8、伪随机数生成算法有很多,如LCG(线性同余法)、Mersenne Twister(梅森旋转算法)等。

9、伪随机数生成算法的质量会影响到应用中的安全性和性能,需要选择合适的算法。

10、伪随机数生成算法有时可能会被黑客破解,因此在安全应用中需要定期更换算法或种子值。

11、伪随机数可以用来生成伪随机序列,这些序列可以用来模拟随机事件,如在计算机游戏、统计学模拟等中使用。

12、伪随机数生成算法的选择和使用要根据应用场景和安全性要求来考虑。

13、伪随机数的生成质量可以用检验算法来检验,如均匀性检验、独立性检验等。

2.伪随机数的产生

2.伪随机数的产生
1分布的随机数序列z∈N(0,1)。 若需要产生服从N(μ, σ2)的随机数,则先产生z∈N(0,1), 再按照公式x=μ+σz计算得到。
9-12
四、产生其他内部随机数的 逆变法
例子:产生负指数分布的随机数x. 已知负指数分布的密度函数为:
f ( x) e , x 0
9-2
二、乘同余法产生0-1均匀 分布的伪随机数
1. 高质量伪随机数特点 (1)随机性强,序列均匀; (2)非重复序列尽可能长; (3)产生速度快,资源占用少。
9-3
二、乘同余法产生0-1均匀 分布的伪随机数
2. 0-1均匀分布函数 设X是0-1区间内服从均匀分布的随机变量, x是X的一个取值,x∈U(0,1),则X的分布 函数和X的密度函数:
9-8
二、乘同余法产生0-1均匀 分布的伪随机数
5. 从随机数Si到服从[0,1]分布的x∈U(0,1)随 机数 xi=Si/M 若需要[a,b]之间均匀分布, 则yi=a+(b-a)xi
9-9
三、产生正态分布伪随机数 的方法
1. 设X服从N(0,1)正态分布,则其分布函数和 密度函数
1 F( x) 2
0 F( x) x 1 x0 0 x 1 x 1
1 f ( x) 0
0 x 1 其它
9-4
二、乘同余法产生0-1均匀 分布的伪随机数
3. 乘同余法
Sk+1=ASk mod (M) A——整常数 Sk——第k个随机数 Sk+1——第k+1个随机数 M——一个大模数 数论理论可证明:对于模数M=2L,当A=8k±3或 A=4k+1(k为正整数)且S0为奇数时,可以获得 最长随机数序列长度为2L-2。

python随机数生成原理

python随机数生成原理

python随机数生成原理Python随机数生成原理随机数在计算机科学中是一个非常重要的概念,它被广泛应用于密码学、模拟实验、游戏开发等领域。

在Python中,生成随机数可以通过random模块来实现。

本文将介绍Python随机数生成的原理及其背后的算法。

一、随机数的概念和应用随机数是指在一定范围内没有规律可循的数值。

它的特点是无法预测,具有不确定性。

在计算机科学中,随机数可以用于生成随机密码、模拟随机事件、生成随机样本等。

二、伪随机数生成器计算机无法生成真正的随机数,因为计算机是基于确定性的逻辑运算的。

因此,计算机生成的随机数实际上是伪随机数,也就是一系列看似随机的数字序列。

这些数字序列是通过伪随机数生成器生成的。

Python中的random模块提供了伪随机数生成器,可以生成服从特定分布的随机数。

三、随机数生成的算法Python的random模块基于Mersenne Twister算法实现了伪随机数生成器。

Mersenne Twister算法是一种非常高效且具有良好统计特性的随机数生成算法。

Mersenne Twister算法的原理是使用一个非常长的周期为2^19937-1的Mersenne素数作为随机数生成的种子。

通过对这个种子进行一系列复杂的数学运算,可以生成一组看似随机的数值序列。

这个序列的周期非常长,因此生成的随机数具有很好的随机性。

四、随机数生成的应用1. 生成随机密码随机数可以用于生成随机密码。

通过随机选择字母、数字和特殊字符,可以生成强度较高的密码,提高账户的安全性。

2. 模拟随机事件随机数可以用于模拟随机事件。

例如,在游戏开发中,可以使用随机数生成器来模拟敌人的行动、掉落物品的概率等。

3. 生成随机样本随机数可以用于生成随机样本。

在数据分析和统计学中,随机样本是进行统计推断的重要基础。

通过随机数生成器,可以生成符合特定分布的随机样本,用于进行统计分析。

五、小结本文介绍了Python随机数生成的原理及其背后的算法。

c语言伪随机数生成算法

c语言伪随机数生成算法

c语言伪随机数生成算法C语言中常用的伪随机数生成算法包括线性同余发生器、梅森旋转算法和龙模算法等。

1. 线性同余法:线性同余发生器是一种基于线性递归的伪随机数生成器。

其算法基本原理是将当前数值与一个常数a相乘再加上一个常数c,再对m取模,得到下一个数值。

具体伪代码如下:seed = 设置初始种子a = 设置常数ac = 设置常数cm = 设置常数mnext = (seed * a + c) % mseed = next2. 梅森旋转算法:梅森旋转算法是一种基于循环移位的伪随机数生成算法,它利用梅森素数进行计算。

具体伪代码如下:state = 种子数W = 计算梅森素数function generateRandomNumber():if state < W:state = 计算下一个数else:state = 计算下一个数return state3. 龙模算法:龙模算法是一种结合线性同余发生器和移位发生器的伪随机数生成算法。

具体伪代码如下:state = 初始种子a = 设置常数ac = 设置常数cm = 设置常数mw = 设置常数wfunction generateRandomNumber():state = (state * a + c) % mrandomBits = state >> wstate = ((state & 0xFFFFFFFF) << (32-w)) randomBitsreturn randomBits需要注意的是,这些算法都是伪随机数生成算法,因为它们的结果是通过确定性的计算得到的,并不是真正的随机数。

随机数生成器原理

随机数生成器原理

随机数生成器原理随机数生成器是计算机科学中一个非常重要的概念,它在密码学、模拟实验、统计学等领域都有着广泛的应用。

随机数生成器的原理是如何产生一系列看似无规律、不可预测的数字序列,这些数字序列被认为是随机的。

在现代计算机系统中,随机数生成器是一个至关重要的组成部分,它为计算机提供了随机性,使得计算机能够执行各种复杂的任务。

本文将介绍随机数生成器的原理及其在计算机科学中的应用。

随机数生成器的原理可以分为伪随机数生成器和真随机数生成器两种。

伪随机数生成器是通过一定的算法产生一系列近似随机的数字序列,这些数字序列在一定程度上具有随机性,但是其实质是确定性的。

真随机数生成器则是通过一些物理过程产生真正的随机性,比如利用量子力学的原理来产生随机数。

在实际应用中,由于真随机数生成器的成本较高,大部分情况下我们使用的是伪随机数生成器。

伪随机数生成器的原理是基于一个种子(seed)和一个确定性的算法来产生随机数序列。

种子是一个初始值,通过对种子进行一系列的数学运算,比如加法、乘法、取模等,就可以产生一系列的伪随机数。

在计算机中,通常使用当前的系统时间作为种子,以保证每次生成的随机数序列都是不同的。

当然,在一些特定的应用中,我们也可以自己指定种子来产生确定的随机数序列。

随机数生成器在计算机科学中有着广泛的应用。

在密码学中,随机数生成器被用来产生加密密钥,以保证数据的安全性。

在模拟实验中,随机数生成器可以用来模拟各种随机事件,比如赌博游戏、天气模拟等。

在统计学中,随机数生成器可以用来进行抽样调查,以获取一定的样本数据。

总的来说,随机数生成器在计算机科学中扮演着非常重要的角色。

在实际应用中,我们需要注意随机数生成器的质量。

一个好的随机数生成器应该具有均匀性、独立性和周期性。

均匀性是指随机数生成器产生的随机数应该服从均匀分布,即每个数值的概率应该是相同的。

独立性是指随机数生成器产生的随机数应该是相互独立的,一个随机数不应该受到其他随机数的影响。

sha1prng算法原理

sha1prng算法原理

sha1prng算法原理SHA1PRNG算法原理是指安全哈希算法随机数生成器,是Java中一种常用的伪随机数生成器。

它采用SHA-1算法,结合Java密码安全的特性,生成一个伪随机数序列。

下面就来详细介绍SHA1PRNG算法原理。

1. SHA-1算法SHA-1算法是一种密码安全哈希函数,能够将数据压缩为固定长度的哈希值。

SHA-1算法的原理是将信息块进行消息扩展、填充、划分、迭代压缩,得到一个160位的消息摘要。

SHA-1算法的强度比MD5算法更高,输出的消息摘要长度也更长。

2. PRNG算法PRNG算法是伪随机数生成器,通过数学计算得到一系列看起来随机的数列。

PRNG算法有两种:线性同余发生器和梅森旋转算法。

线性同余发生器采用线性方程来计算,易于实现,但随机性不是非常好。

梅森旋转算法采用组合逆置位操作,极大增强了随机性。

3. SHA1PRNG算法SHA1PRNG算法将SHA-1算法和PRNG算法结合,生成伪随机数。

具体步骤如下:(1)计算熵值。

熵值是随机性的度量,取自系统时间、内存使用情况等信息。

计算熵值的目的是为了增加随机性。

(2)使用SHA-1算法生成哈希值。

将熵值作为SHA-1算法中的密钥,再加上一个计数器作为消息,生成哈希值。

(3)使用梅森旋转算法生成伪随机数。

梅森旋转算法需要一个初始向量,将哈希值作为初始向量,通过迭代来生成一序列随机数。

SHA1PRNG算法每生成一个随机数,就更新一次哈希值。

(4)初始化计数器。

计数器是用于防止攻击者通过短时间内的暴力攻击得到相同的随机数。

SHA1PRNG算法会记录生成的随机数的计数器值,每次重新初始化时,计数器值也一并重新初始化。

4. SHA1PRNG算法的应用SHA1PRNG算法被广泛应用于Java中的随机数生成和加密功能中。

例如,Java中的SecureRandom类,就是基于SHA1PRNG算法实现的。

SecureRandom类可以生成高质量的随机数,并且可以快速地生成大量的随机数序列。

伪随机数生成

伪随机数生成

主要代码
void C随机码生成器Dlg::OnCreatekey() { int RanCheckNum = 0; char out[25]={0}; char keytemp[5]={0}; memset(out,0x30,18);//memset(void *s, int ch, size_t n)函数解释:将s中 前n个字节替换为ch并返回s srand((unsigned)timeGetTime());//产生随机数种子 for(int i=0;i<6;i++) { RanCheckNum = rand();//产生随机数 _itoa(RanCheckNum,keytemp,16);//将随机数转换成进制 memcpy(&out[i*4],keytemp,strlen(keytemp)); } out[24]=NULL; SetDlgItemText(IDC_EDIT1,_T(out)); }
实现界面截图
演讲完毕
谢谢,鼓掌!
摘要
为追求真正的随机序列,人们曾采用很多种原始 的物理方法用于生成一定范围内满足精度(位数)的 均匀分布序列,其缺点在于:速度慢、效率低、需占 用大量存储空间且不可重现等。为满足计算机模拟研 究的需求,人们转而研究用算法生成模拟各种概率分 布的伪随机序列。伪随机数是指用数学递推公式所产 生的随机数。从实用的角度看,获取这种数的最简单 和最自然的方法是利用计算机语言的函数库提供的随 机数发生器。典型情况下,它会输出一个均匀分布在0 和1区间内的伪随机变量的值。其中应用的最为广泛、 研究最彻底的一个算法即线性同余法。
线性同余法LCG(LINEAR CONGRUENCE GENERATOR)
应用递推公式产生均匀分布随机数时,式中参数n0,a,b,M的选 取十分重要。

伪随机数的生成

伪随机数的生成
称为乘同余法.
1.3 同余法
当λ=1 ,C≠ 0时,Xn+1=Xn+C (mod M),0≤ Xn+1< M , Rn=Xn /M, (8)
称为加同余法.
虽然加同余法产生的序列周期长,电子计算机实现也很方便, 只要进行加法及移位运算即可完成,但从理论上看,所得到随 机数列的性质一般不如乘同余法和混合同余法. 若 λ =c=1,则有Xn+1=Xn+1(mod M).这样构成的序列虽然周期
void rand1(long &x1,long &x2)//混合同余法 { int a[2]={129,515},c[2]={17,53};//a[2],c[2]分别为乘子 和增量 x1=(a[0]*x1+c[0])%M; x2=(a[1]*x2+c[1])%M; }
void rand2(long &x1,long &x2)//乘同余法 { int a[2]={83,197};//a[2]为乘子 x1=(a[0]*x1)%M; x2=(a[1]*x2)%M;
摘要
在计算机上用数学的方法产生随机数列是目前通 用的方法,它的特点是占用的内存少,速度快.用数 学方法产生的随机数列是根据确定的算法推算出来的, 严格说来并不是随机的,因此一般称用数学方法产生 的随机数列为伪随机数列.不过只要用数学公式产生 出来的伪随机数列通过统计检验符合一些统计要求, 如均匀性、抽样的随机性等,也就是说只要具有真正 随机数列的一些统计特征,就可以把伪随机数列当作 真正的随机数列使用 . 由于是用算法产生的,因而本质上是决定性的, 再加上计算机字长有限,所以无论用什么算法产生的 数列,在统计特征上都不可能完全与从均匀分布中抽 样所得的子样完全相同,因而只能要求尽可能地近 似.

rand原理

rand原理

rand原理rand函数是一个随机数生成函数,它可以生成伪随机数。

在计算机领域中,因为计算机实际上是以确定性方式工作的,所以无法生成真正的随机数。

因此,我们使用伪随机数来模拟真正的随机性。

rand函数的原理是基于一个种子值(seed),通过一系列的数学运算来生成随机数。

在同样的种子值下,rand函数每次被调用时都会生成相同的随机数序列。

因此,为了让rand函数生成不同的随机数序列,我们需要改变种子值。

在C语言中,我们可以使用srand函数来设置种子值。

通常情况下,我们可以使用系统时间作为种子值,因为时间是一个不断变化的值,这样就能够保证每次程序运行时都会生成不同的随机数序列。

下面是一个简单的例子,演示了rand函数的使用:```#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {// 设置种子值srand(time(NULL));// 生成10个随机数for (int i = 0; i < 10; i++) {int randomNum = rand();printf("%d\n", randomNum);}return 0;}```上述代码中,srand函数使用了time(NULL)作为种子值。

time(NULL)会返回当前的时间,以秒计算。

然后,每次调用rand函数时都会生成一个随机数,并通过printf函数打印出来。

需要注意的是,rand函数生成的随机数范围是0到RAND_MAX之间的整数,其中RAND_MAX是一个宏,表示系统能够生成的最大随机数。

总的来说,rand函数是一个通过设置种子值来生成伪随机数的函数。

通过改变种子值,我们可以获得不同的随机数序列。

java random 原理

java random 原理

java random 原理
Java的random原理是基于伪随机数算法实现的。

所谓伪随机数指的是通过确定的初始值,然后根据特定的算法生成一系列看似随机的数字序列。

Java的random类使用了一个48位的种子(seed)来进行随机数生成。

它首先将种子通过一个线性同余法进行处理,得到一个新的种子值。

然后,将这个新的种子值的低位返回作为生成的随机数。

具体算法如下所示:
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
其中,seed表示当前的种子,0x5DEECE66DL和0xBL是固定的常数。

通过上述算法,每次调用random类的next方法,都会生成一个新的种子,并用它来计算随机数。

种子的初始值可以通过Random类的构造方法来指定,如果没有指定,默认以当前系统时间作为种子。

需要注意的是,由于伪随机数算法的特性,两次生成随机数的间隔时间越长,生成的随机数序列越不会重复。

但如果两次生成的随机数的间隔时间非常短,那么很有可能会得到相同的随机数。

为了解决这个问题,Java的random类通过使用CAS (compare-and-swap) 操作来保证线程安全。

它使用了一个
volatile修饰的种子变量,以及原子操作来控制并发访问和更新种子。

通过以上原理和措施,Java的random类能够生成看似随机的数字序列,以满足各种随机性需求,例如随机生成密码、模拟随机事件等。

伪随机原理

伪随机原理

伪随机原理
伪随机原理是指使用计算机算法生成的数列,虽然具有一定的随机性,但实际上是可预测和可重现的。

这种随机性是通过特定的算法和初始种子(seed)来生成的。

与真正的随机数相对,伪随机数是一种伪装成随机的数列。

以下是伪随机原理的一些关键概念:
1. 算法:伪随机数生成的核心是一个算法,它通过一系列的数学运算,以及对前一次生成的数字的处理,产生看似随机但实际上具有可预测性的数列。

2. 种子:伪随机数生成器通常需要一个起始值,称为种子。

相同的种子将产生相同的伪随机数序列。

因此,如果知道种子和算法,理论上可以复现整个数列。

3. 周期性:伪随机数生成器具有一个周期,即在经过一定次数的生成后,数列将重复。

这意味着如果用相同的算法和种子生成足够多的数字,最终会回到相同的数列。

4. 均匀性:伪随机数生成器的输出应该在一定范围内均匀分布,以模拟真实随机数的均匀性。

5. 确定性:伪随机数是确定性的,即在相同的输入条件下,生成的数列是可预测的。

这使得在科学计算、模拟和其他需要可重现性的领域中广泛使用。

6. 常见算法:线性同余法、梅森旋转算法、梅尔森尼旋转算法等是常见的伪随机数生成算法。

尽管伪随机数不具备真正随机数的性质,但在许多应用中,它们足够满足需要。

在实际应用中,选择合适的伪随机数生成器和合理的种子对于确保生成的数列满足要求非常重要。

伪随机数生成原理

伪随机数生成原理

伪随机数生成原理
伪随机数生成原理是指通过一定的算法和种子,生成看似随机的数字序列。

这种序列与真正的随机序列有所不同,因为它们是通过计算机程序生成的。

在实际应用中,伪随机数可以用于密码学、模拟、游戏等领域。

伪随机数生成算法通常包括线性同余法、梅森旋转算法、拉格朗日插值法等。

其中,线性同余法是最简单的算法,通过如下公式生成: X(n+1) = (a * X(n) + c) mod m
其中,a、c、m为常量,X(n)为上一个随机数种子,X(n+1)为新生成的随机数种子。

在实际应用中,伪随机数生成原理的安全性和随机性都受到极大的关注。

因此,需要严格控制种子值的生成和算法的选择,以确保生成的随机数序列不易被猜测和攻破。

同时,还需要对生成的随机数序列进行统计分析,以检验其随机性和分布情况。

总之,伪随机数生成原理是计算机科学中一个重要的概念,它涉及到许多领域的应用和研究。

在实际应用中,我们需要理解伪随机数生成原理的基本原理和技术,以便更好地应用和优化算法。

- 1 -。

利用平方取中法生成伪随机序列的方法_概述说明以及解释

利用平方取中法生成伪随机序列的方法_概述说明以及解释

利用平方取中法生成伪随机序列的方法概述说明以及解释1. 引言1.1 概述本文旨在介绍利用平方取中法生成伪随机序列的方法。

随机序列在现代计算机科学和密码学领域具有重要应用,如加密算法、模拟实验和随机抽样等。

而平方取中法是一种常用且简单的方法,可以产生近似均匀分布的伪随机数序列。

1.2 文章结构本文总共分为五个部分,即引言、平方取中法生成伪随机序列的方法、平方取中法的优缺点、示例与实验结果分析以及结论与展望。

在引言部分,我们将概述本文内容,并明确研究目的。

在第二部分,我们将详细介绍平方取中法生成伪随机序列的原理,并提供实现步骤。

同时,我们还将探讨该方法在不同应用领域下的可行性和效果。

第三部分将从优点和缺点两个方面全面评估平方取中法,在了解其优势和限制条件后能更好地使用和改进该方法。

第四部分将通过示例说明和实验设计来验证平方取中法生成的伪随机序列的效果,并对实验结果进行详细分析。

最后,在结论与展望部分,我们将总结主要结论,并探讨可能的改进方法和未来发展方向。

1.3 目的本文的主要目的是介绍平方取中法生成伪随机序列的方法,并对其应用领域、优缺点进行全面评估。

通过详细说明实验设计和分析结果,我们旨在为读者提供清晰的理解,并能够根据具体需求判断该方法是否适合使用。

同时,我们也希望能够促进相关研究工作的深入发展,为生成高质量伪随机序列提供可靠技术支持。

2. 平方取中法生成伪随机序列的方法:2.1 原理介绍:平方取中法是一种生成伪随机序列的方法,其原理基于对初始种子进行平方运算,并选取结果的中间部分作为下一个种子。

具体来说,该方法将初始种子进行平方运算,并提取产生的结果的中间部分数字作为新的种子,再重复这个过程来生成更多的伪随机数。

2.2 实现步骤:利用平方取中法生成伪随机序列的步骤如下所示:- 步骤1:选择一个初始种子值。

- 步骤2:对初始种子值进行平方运算。

- 步骤3:从平方运算结果中提取中间部分数字作为新的种子。

prng名词解释

prng名词解释

prng名词解释
PRNG是伪随机数生成器(Pseudo Random Number Generator)的缩写,是一种算法或设备,用于生成一系列看似随机但实际上具有一定规律的数字序列。

PRNG通常使用一个初始种子或
密钥来初始化,然后通过一系列数学运算生成伪随机数。

与真随机数生成器(TRNG)不同,PRNG的输出可以被准确预测,并且在给定相同的初始条件下,能够再现相同的随机数序列。

PRNG广泛应用于计算机科学、密码学和模拟等领域。

在计算
机科学中,PRNG通常用于模拟随机事件、生成测试数据或填
充密码学密钥流等任务。

由于PRNG的输出具有确定性,因
此在安全性要求高的应用场景中,常常使用真随机数生成器来提供初始种子,以增加生成的随机数的随机性。

常见的PRNG算法包括线性同余发生器(LCG)、Mersenne Twister、XORShift和Blum Blum Shub等。

这些算法通过数学
运算和查表等方式,从初始种子生成一个看似随机的数字序列。

然而,PRNG算法的安全性与它的周期长度、初始种子选择和
密钥状态等因素有关。

在选择PRNG算法时,需要综合考虑
其安全性、速度和随机性等因素。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8.3 概率分布的不可区分性

伪随机数生成器的两个主要目标是:

应该快速,即能作为k的函数在多项式时间内计算出来 其次,应该安全 当然这两个需求经常相互矛盾。基于线性同余或基于LFSR 的比特生成器的确都很快。这些比特生成器在模拟中是相当 有用的,但对密码应用来说它们是非常不安全的。 现在来对比特生成器满足什么条件算得上“安全”,给出一 个准确的描述。直观上,由一个比特生成器产生的长为 l 的 比特串应该看起来“随机”。也就是说,应该不能够在k的 多项式时间内把由PRBG产生的长为 l 的比特串与真正随机 的长为 l 的比特串区分开来。

例如要想产生56比特的DES密钥, 可使用周期为256的计数器,每产生
一个密钥后,计数器加1
8.4 基于密码算法的随机数产生器

因此本方案产生的伪随机数以整周期循环,输出数列 X0,X1,…,XN-1中的每个值都是由计数器中的不同 值得到,因此X0≠X1≠…≠XN-1

又因为主密钥是受到保护的,所以知道前面的密钥值
dst z l
l
的结果表示区分器猜测 p0 和 p1 哪个更可能产生 z 。
p0 和 p1 上输出的平均值(期望
l
Edst p j 的值表示dst在两个概率分布
值)。 如果 Edst ( p0 ) 和 Edst p1 这两个期望值至少距离 较远,那么就说 dst是一个 区分器。

8.3 概率分布的不可区分性

例如,如果一个比特生成器以2/3的概率产生1,那么就很容易 把该比特生成器产生的比特串和一个真正随机的比特串区分开 来。具体来说,可以使用如下的区分策略。假设我们得到一个 长为 l 的比特串。记其中1的个数为 l1。那么,平均来讲,一个 长为 l 的真随机串有 l / 2个1,而一个上述比特生成器产生的长 为 l 的比特串包含 2l / 3个1。因此,如果

0,5,20,3,14,16,22,9,1,8,29,30,2,11,7,26,21,6,23,12,10,4,17,25,18,28, 27,24,15,19 当种子选取为13之外的任意数时,即在这个圈上选定了一个初 始点,从该点开始的10个数经模2运算之后就形成一个伪随机 数列。该生成器可产生3变形 (1)幂形式 幂形式的迭代公式为Xn+1=(Xn)d mod m,n=1,2,… 其中d, m是参数,X0(0X0<m)是种子 根据参数的取法,幂形式又分为以下两种: ①RSA产生器 此时参数取为RSA算法的参数,即m是两个大素数乘积,d 是RSA秘密钥,满足gcd(d, (m))=1 ②平方产生器 取d=2,m=pq,而p,q为模4余3的大素数 (2)离散指数形式 离散指数形式的迭代公式为Xn+1=gXn mod m,n=1,2,… 其中g, m是参数,X0(0X0<m)是种子



8.1 随机数的产生
随机数源

真随机数很难获得

在物理噪声产生器中,如离子辐射脉冲检测器、气体放 电管、漏电容等都可作为随机数源,但在网络安全系统 中很少采用,一方面是因为数的随机性和精度不够,另 一方面这些设备又很难连接到网络系统中

一种方法是将高质量的随机数作为随机数库编辑成书, 供用户使用

定义:设 p0 和 p1 是长度为 l的所有比特串之集 Z 2 上的两个概 l p j z l 表示比特串 z l 在分布 p j 下 率分布。对 j 0,1和 z l Z 2 ,
l
出现的概率。设dst: Z 2 定义
l
0,1 是一个函数,
0 。对 j 0,1
8.4 基于密码算法的随机数产生器

为了产生密码中可用的随机数,可使用 加密算法
周期为N的计数器 C C+1 主密钥Km 加密算法 Xi=EKm[C+1] 循环加密产生伪随机数

1. 循环加密 类似于CTR模式

右图是通过循环加密由主密钥产生会话
密钥的示意图,其中周期为N的计数器 用来为加密算法产生输入



如果m,a,c,X0都为整数则产生的随机数序列{ Xn}也都是整 数,且0X0<m 例:假设 m 31, a 3, c 5,这样可以构造一个 (5,10)比特
3x 5mod 31 ,那么有 13 13 , 生成器。考虑映射 x 而其余30个剩余数被置换,并构成一个长度为30的圈,即

然而与网络安全对随机数巨大的需求相比,这种方式提 供的随机数数目非常有限
8.1 随机数的产生

再者,虽然这时的随机数的确可被证明具有随机性,但 由于敌手也能得到这个随机数源,而难以保证随机数的 不可预测性

网络安全中所需的随机数都借助于安全的密码算法来
产生

但由于算法是确定性的,因此产生的数列不是随机的 然而如果算法设计得好,产生的数列就能通过各种随机 性检验,这种数就是伪随机数


模数m (m>0),



乘数a (0a<m),
增量c (0c<m), 初值即种子 X0(0X0<m); Xn+1=aXn+c mod m
现在,对 1 n l ,由以下迭代公式得到随机数数列{ Xn}:

8.2 伪随机数产生器

定义 f ( x0 ) ( z1, z2 ,... zl ) ,其中 zn xn mod2 ,此时,称 f 为一个 ( k , l ) 线性同余生成器 注意到一个种子的二元表示就是一个长度不超过k的比特串; 然而,并非所有的k长比特串都是被允许使用的种子。
第八章 伪随机数的生成
8.1 随机数的产生 8.2 伪随机数产生器 8.3 概率分布的不可区分性 8.4 基于密码算法的随机数产生器 8.5 随机比特产生器 8.6 概率加密
8.1 随机数的产生

我们知道随机数在密码学中起着重要的作用,这里将 介绍随机数在密码学中的作用 很多密码算法都需要使用随机数,例如:


给定参数,则线性同余算法由初始值X0确定 如果敌手知道正在使用线性同余算法,并知道算法的参数, 则一旦获得数列中的一个数,就可得到以后的所有数 甚至如果敌手只知道正在使用线性同余算法以及产生的数 列中极少一部分,就足以确定出算法的参数。假定敌手能 确定X0,X1,X2,X3,就可通过以下方程组,

通常,可取m=2r,a=2i+1,c=1,其中r是一整数, i<r也是一整数即可满足定理5-1的条件 线性同余算法的强度在于如果将乘数和模数选择得好, 则产生的数列和从1,2,…,m-1中随机选取的数列是 不可区分的

8.2 伪随机数产生器

线性同余算法除了初值X0 的选取具有随机性外,算法本身不 具有随机性,因为X0 选定后,以后的数就被确定性地产生了。 这个性质可用于对该算法的密码分析。 线性同余算法的密码分析
8.2 伪随机数产生器

从 上一节我们知道,在密码学中,有很多时候需要产生随机数,随 机比特串等。例如,通常需要从一个指定的密钥空间中随机地生成 密钥,而且许多加密和签名方案都需要在它们的执行过程中应用随 机数。由投掷硬币或者其他物理过程产生随机数即费时又昂贵,因 此,在实际中通常使用一个伪随机比特生成器来产生随机数。一个 比特生成器可以将一个较短的随机比特串(种子)拓展成一个较长 的比特串。而最为广泛使用的伪随机数产生器是线性同余生成器 线性同余算法有4个参数:
8.2 伪随机数产生器

Knuth给出了使迭代函数达到整周期的充要条件

Xn+1=aXn+c ( mod m) ① gcd(c,m)=1 ② 对所有满足p|m的素数p,有a=1( mod p) ③ 若m满足4|m,则a满足a=1(mod 4)

定理8-1 线性同余算法达到整周期的充要条件是:


8.1 随机数的产生

2)不可预测性

在诸如相互认证和会话密钥的产生等应用中,不仅要求数 列具有随机性而且要求对数列中以后的数是不可测的 对于真随机数列来说,数列中每个数都独立于其它数,因 此是不可预测的 对于伪随机数来说,就需要特别注意防止敌手从数列前边 的数预测出后边的数 在设计密码算法时,由于真随机数难以获得,经常使用似 乎是随机的数列(这样的数列称为伪随机数数列,这样的 随机数称为伪随机数)。例如在RSA算法中素数的产生。 这时不可预测性就非常重要,否则敌手可以根据随机数的 预测来猜测RSA中的秘密大素数

随机性和不可预测性

(1)随机性
以下两个准则常用来保障数列的随机性: ①均匀分布 数列中每个数出现的频率应相等或近似相等 ②独立性 数列中任意一数都不能由其它数推出 数列是否满足均匀分布可通过检测得出,而是否满足独立性则 无法检测,相反却有很多检测方法能证明数列不满足独立性 因此通常检测数列是否满足独立性的方法是在对数列进行了 足够多次检测后都不能证明不满足独立性,就可比较有把握 地相信该数列满足独立性

8.2 伪随机数产生器


评价线性同余算法的性能有以下3个标准: ①迭代函数应是整周期的,即数列中的数在重复之前应 产生出0到m之间的所有数 ②产生的数列看上去应是随机的。因为数列是确定性产 生的,因此不可能是随机的,但可用各种统计检测来评 价数列具有多少随机性 ③迭代函数能有效地利用32位运算实现 a, c和m的取值是产生高质量随机数的关键,通过精心选取a, c和m,可使以上3个标准得以满足 为使随机数数列的周期尽可能大,m应尽可能大,普遍 原则是选m接近等于计算机能表示的最大整数,为了方 便32位运算地实现,m可取为231-1,这满足上述的第③ 条要求
想得到后面的密钥在计算上是不可行的

为进一步增加算法的强度,可用整周期的伪随机数产生 器代替计数器作为方案中加密算法的输入
相关文档
最新文档