计算机中的随机数

随机数的性质从弱到强分为3类:
[color=red]1. 随机性
2. 不可预测性
3. 不可重现性[/color]
在上面的三个性质中,越往下就越严格。具备随机性,不代表一定具备不可预测性;具备不可预测性,不代表一定具备不可重现性;但如果具备不可重现性,一定具备随机性和不可预测性。

[color=red]满足上面的3性依次对应着:弱伪随机数,强伪随机数,真随机数。[/color]
在计算机中,用软件生成的随机数都是伪随机数,即弱伪随机数和强伪随机数。由于弱伪随机数不具备不可预测性,因此在密码学中只使用强随机数和真随机数[color=red](在密码学中,随机数常常被用于生成密钥,因此具备可预测性是危险的)[/color]

至此,我们知道,密码学中使用的随机数一定是强伪随机数或者真随机数。由于真随机数用纯软件产生很困难,因此我们在软件设计中都是用强伪随机数。[color=red]不过遗憾的是,一些语言提供的随机数生成函数都是弱随机数。比如java.util.Random类生成的就是弱伪随机数,当时java中的java.security.SecureRandom类提供的是强随机数。[/color]。

下面我们介绍几种伪随机数生成器。
1. [color=red]线性同余法[/color]
线性同余法生成随机数的过程如下:
第一个伪随机数R0=(A*种子+C) mod M
第二个伪随机数R1=(A*R0+C) mod M
第 N个伪随机数Rn=(A*第N-1个随机数+C) mod M
过程原理如图所示:
[img]http://dl2.iteye.com/upload/attachment/0118/2662/7f4b7eec-2e3f-3849-9963-ca0059e53b1e.png[/img]

可见,线性同余法生成的随机数序列是可预测的,这一点使得他无法应用在密码学中。

2. [color=red]单向散列函数法[/color]
使用种子作为初始状态,将该状态作为输入,用单项散列函数计算随机数序列。然后使内部状态自增,然后继续使用单项散列函数计算随机数序列。

[img]http://dl2.iteye.com/upload/attachment/0118/2664/ed981aa1-b5b5-3a07-b527-21d85e7d5085.png[/img]
攻击者若想预测下一个随机数,就得知道内部状态,由于单项散列函数具有单项性,所以这是不可能的。因此单项散列函数法具备不可预测性,可以用在密码学中。

3. 密码法
原理同单项散列函数法,只不过将散列函数换成了密钥而已。
[img]http://dl2.iteye.com/upload/attachment/0118/2667/24050af2-383c-37ae-a12a-66fefce8b6ea.png[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值