随机数是专门的随机试验的结果,那么为什么叫伪随机数呢?
之所以称之为伪随机数,是因为真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的。
而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的。我们可以这样认为这个可预见的结果其出现的概率是100%。所以用计算机随机函数所产生的“随机数”并不随机,是伪随机数。计算机的伪随机数是由 随机种子 根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。
那么怎么对伪随机数进行攻击呢,也就是怎么样再现之前的随机数呢?
以python为例
>>> x = random.getstate() //将随机数内部的状态赋值给x
>>> print(x)
(3, (1016028004, 1802878489, 812885751, 2907554112, 1792390388, 2786629648, 3270952119, 342996505, 2586295976, 509783117, 3462393140, 3197552260, 4130960772, 987064256,...... 1), None)
>>> random.randint(1,10) //随机生成1-10之间的随机数
3
>>> random.randint(1,10) //随机生成1-10之间的随机数
1
>>>
>>> random.randint(1,10) //随机生成1-10之间的随机数
9
>>> random.randint(1,10)
10
>>> random.randint(1,10)
9
>>> random.randint(1,10)
4
>>> random.setstate(x) //重新设置之前的随机数状态,即将之前的种子设置为当前的随机数状态值
>>> random.randint(1,10) //再次生成随机数发现与之前的随机数一致,说明随机数攻击成功,也再次印证了python的random模块生成的随机数是有规律特征的所谓的伪随机数
3
>>> random.randint(1,10)
1
>>> random.randint(1,10)
9
>>> random.randint(1,10)
10
>>> random.randint(1,10)
9
>>> random.randint(1,10)
4
>>>