【密码学】一文读懂基于散列函数的伪随机数生成器

简介: 上回说到,小明制作了一个特殊的日记本,在每次输入正确的密码之后,都会随机的生成下一个密码,但是呢,由于小明设计随机数算法选的不太好,这让小红给钻了空子,这时候小明心里别提多伤感了,这。。。这我的日记不就相当于直接公开了吗,这是要社死的节奏啊,不行不行,我要换一个新的方法,这时候,小明刚好学完了密码学当中的散列函数,心想,这我要是直接用散列函数的输出作为随机密码的生成,这不就成了,哈哈,这时候小明心里别提有多美了,于是乎,小明设计出了如下的随机数生成算法。

一文读懂基于单向散列函数的随机数


W1`U`]ON[OKSDYY_1HN$QTX.jpg随机数

上回说到,小明制作了一个特殊的日记本,在每次输入正确的密码之后,都会随机的生成下一个密码,但是呢,由于小明设计随机数算法选的不太好,这让小红给钻了空子,这时候小明心里别提多伤感了,这。。。这我的日记不就相当于直接公开了吗,这是要社死的节奏啊,不行不行,我要换一个新的方法,这时候,小明刚好学完了密码学当中的散列函数,心想,这我要是直接用散列函数的输出作为随机密码的生成,这不就成了,哈哈,这时候小明心里别提有多美了,于是乎,小明设计出了如下的随机数生成算法。


小明设计的基于单向散列函数的随机数生成器

具体小明设计的伪随机数生成器步骤如下:

  1. 先挑一个种子,作为随机数生成器的输入
  2. 用单向散列函数计算内部状态的散列值
  3. 将散列值作为伪随机数输出
  4. 用刚才第三步生成的散列值作为新的内部状态
  5. 重复执行第二步到第四步,然后不断生成新的伪随机序列

具体小明设计的方案呢,可以如下图所示:

~}~13SWVMN_NU4LXG6{9@L8.png

image.gif小明设计的伪随机数生成器

看着自己刚设计出来的新的日记本,小明心里笑开了花,心想,这时候,小红你就没办法找到下一个密码了吧。

可是呢,没过多久小红就找到了密码生成的规律,然后呢,你懂得。。。

看到这里,各位读者发现小明所设计的伪随机数生成算法有什么问题吗?答案将在文末揭晓。


一般的基于单向散列函数的伪随机数生成器

下面,我们来看一下一个一般的基于散列函数的伪随机数生成算法的过程。

  1. 选择一个种子作为生成器的初始状态(或者可以理解成为这是一个计数器)
  2. 用单向散列函数计算内部状态的散列值, 这一块其实和小明设计的是一样的
  3. 将散列值作为随机数输出, 这一步也和小明的想法一样
  4. 将计数器+1, 这里和小明设计的是有区别的
  5. 重复执行第二步到第四步,然后不断生成新的伪随机序列, 这里和小明的依然一样

具体的过程,可以看做是下图:

[F0}FEGUM2D@W44XX8T0K6A.png基于散列函数的伪随机数生成器

这里要注意,对于任何时候,种子都应该是保密的,如果攻击者拿到了种子,自然而然的就可以直接推导出所有的随机序列了,如果攻击者不知道种子,由于散列函数的单向性,攻击者无法去推导出来散列函数之前的值,也就无法对计数器进行加一操作,自然而然的无法去预测出来下一个随机数生成的值。


答案

看到这里,大家应该可能已经发现小明设计的伪随机数生成器的缺点在哪了,就是攻击者可以直接去预测下一次随机数生成的值,和常规的基于散列函数的伪随机数不同,对于小明的设计是可以拿到内部状态的。


小结

本文呢,简单的介绍了一下基于散列函数的伪随机数生成器的算法,整体算法还是比较容易理解的,对于伪随机数生成器的整体结构而言,无论是什么算法,其实都是相似的。


代码实现

对于这次代码呢,就不给出具体的实现了,这个比较简单,写个伪代码吧

seed = init_state; // 初始化的种子
function hash_based_prng() {
    output = hash(seed); // 计算内部状态作为输出
    seed += 1; // 计数器加一
}


相关文章
|
Rust 算法 Go
【密码学】一文读懂FNV Hash
FNV哈希全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。它可以快速hash大量的数据并保持较小的冲突概率,适合hash一些相近的字符串比如IP地址、URL、文件名等等。目前FNV算法有三个版本,分别是: FNV-0(已废弃)、FNV-1以及FNV-1a。这三个算法的结构非常相似,因此呢,在这里就一块说了。
2649 0
【密码学】一文读懂FNV Hash
|
Rust 算法 数据安全/隐私保护
【密码学】一文读懂XTEA加密
本篇文章,我们来看一下上一次讲过的TEA加密算法的一个升级版XTEA, 相比于TEA, XTEA的安全性显然是更高的,其中的过程要比TEA稍微复杂一点点。
1240 0
【密码学】一文读懂XTEA加密
|
2月前
|
存储 安全 算法
加盐哈希的科学原理及其重要性
【8月更文挑战第31天】
81 0
|
4月前
|
设计模式 算法 程序员
伪随机数为什么叫伪随机数
伪随机数为什么叫伪随机数
57 1
|
Rust 算法 数据安全/隐私保护
【密码学】一文读懂RSA的随机数生成器
本文接着来聊一个比较轻松的内容,再来说一个随机数生成器,对于这个随机数生成器呢,这里和之前讲到过的BBS有一些类似,直接来看具体的内容蛤。
1095 1
【密码学】一文读懂RSA的随机数生成器
|
Rust 搜索推荐 算法
【密码学】一文读懂GCM(Golais计数器模式)
GCM(Galois计数器模式)同样的也是NIST提出来的,这个模式基于并行化设计,下面来一起看一下这个模式具体是如何工作的吧。
1906 0
【密码学】一文读懂GCM(Golais计数器模式)
|
算法 安全 数据安全/隐私保护
常见几种加密算法的Python实现
常见几种加密算法的Python实现
151 0
|
算法 物联网安全 物联网
【密码学】单向散列函数简介
​  单项散列函数又称为安全散列函数或者哈希函数,可以将一段可变长度是输入数据转化为固定长度的一段输出值。 输入数据通常称为消息,输出数据通常称为消息摘要或者摘要,可用于检查消息的完整性。​  常用的单向散列算法有MD4/5系列和SHA系列等。由于MD4、MD5算法都已被攻破,渐渐退出历史舞台,而SHA系列算法在物联网安全领域比较常见,特别是SHA256算法。​  额外提一点,提到单向散列函数的特性,很多人一下子想到,我们经常使用到的CRC校验,例如将一段可变长度的数据经过CRC校验后,生成2个字节的校验值
349 0
【密码学】单向散列函数简介
|
存储 算法 安全
同态随机基加密的量子多方密码-数学公式
同态随机基加密的量子多方密码-数学公式
98 0