基于加密的随机数生成器
随机数
咱们接着来说小明的故事,上回说到,小明因为设计的日记本由于用了不安全的随机数生成器,成功的又让小红给看到了日记的内容,这时候,小明决定发奋图强,努力的补习了一下相关知识,这时候,小明刚学了加密的相关知识,然后小明心想,这能不能基于加密的相关知识来设计一个随机数生成器呢,这由于密钥在我手里面,然后我每次自增计数器,没有密钥,其他任何人也没办法拿到原始的计数器内容,这加密出来的东西,感觉随机度也挺高的,于是有了今天的这篇文章,基于加密的随机数生成器。
随机数生成器的结构
基于加密的随机数生成器
如上图所示,整个随机数生成器的结构还是类似的,只不过这里多了一点,也就是密钥,具体过程如下:
- 初始化计数器
- 用密钥加密计数器的值
- 将密文作为随机序列的输出
- 计数器+1
- 根据需要生成的随机序列的数量,重复上述的步骤
正如小明所设想的一样,如果要想预测下一次的随机数的值,那么就需要对当前值进行解密,因为只有小明手中有密码,其他人是没办法通过密文来反推计数器的内容的,因此也就没办法去预测下一个随机数的值。
ANSI X9.17
接下来,我们来看一个基于加密的伪随机数生成器的一个具体实现 「ANSI X9.17」
先来看一下,这个伪随机数生成器的结构。
ANSI X9.17
具体步骤如下:
- 初始化内部状态
- 对当前时间戳进行加密
- 对内部状态和第二步生成的密文进行异或运算
- 对步骤三的结果进行加密
- 将步骤四的结果作为随机序列的输出
- 对第四步的结果和第二步输出的结果进行异或运算
- 对第六步的结果进行加密,并更新内部状态为加密之后的结果
- 重复
2-7
得到所需长度的随机序列
这个方案,要比我们在文章开头说的结构要复杂,这里执行了三次加密,分别有不同的作用,并且引入的当前时间这个变量,因此呢,个人感觉即使是用了相同的密钥和相同的种子,由于时间不同,所以生成的随机序列也就不同,这个内部状态也是同样的通过密码来保护的,不过从宏观来看,这个结构和文章开头介绍的也是相似的,只是加密操作复杂一点,加一操作并不是普通的加一操作了。
小结
这时候,小明发现自己所用的随机数生成器已经是不错了,这时候小红也没有办法推测出来下一个密码了,小明愉快的笑了,随着小明故事的结束,随机数的介绍也要告一段落了,感谢各位读者的捧场,谢谢大家。