计算机中的随机数

随机数的性质从弱到强分为3类:
1. 随机性
2. 不可预测性
3. 不可重现性

在上面的三个性质中,越往下就越严格。具备随机性,不代表一定具备不可预测性;具备不可预测性,不代表一定具备不可重现性;但如果具备不可重现性,一定具备随机性和不可预测性。

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

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

下面我们介绍几种伪随机数生成器。
1. 线性同余法
线性同余法生成随机数的过程如下:
第一个伪随机数R0=(A*种子+C) mod M
第二个伪随机数R1=(A*R0+C) mod M
第 N个伪随机数Rn=(A*第N-1个随机数+C) mod M
过程原理如图所示:


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

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


攻击者若想预测下一个随机数,就得知道内部状态,由于单项散列函数具有单项性,所以这是不可能的。因此单项散列函数法具备不可预测性,可以用在密码学中。

3. 密码法
原理同单项散列函数法,只不过将散列函数换成了密钥而已。




猜你喜欢

转载自yizhenn.iteye.com/blog/2306293
今日推荐