17 - 02 - 16 计算机网络(37)(单向散列函数)

单向散列函数

公钥密码算法加密解密的速度堪忧,故出现散列(hash)函数.

在这里,函数可以将任意长度的消息 转换成一个固定长度的散列值h:

H(M)= h. 散列值也叫消息摘要(message digest)。

单项散列函数具有以下特性:

1、给定M,容易计算h

2、给定h ,很难反推M

3、给定M或者找到M、M,极难找到H(M) = H(M)

设计函数:单向散列函数是建立在压缩函数之上的:把任意长度的消息分成固定长度的分组(最后一组冗余填充), 压缩函数的输入是当前分组和前一分组的输出。(第一次执行压缩函数时,输入为第一个分组和初始化向量IV)。当所有的分组都处理完毕后,压缩函数的输出就是就是最终的散列值。

hash函数的输入是任意长度的,而输出是固定长度的肯定会发生碰撞、冲突。但是在宇宙毁灭之前这一短暂的时间内(?)是很难的。

--单向散列函数的应用1--数字签名

由原文计算出的散列值就相当于我们在文件上的签名(指纹了)。

B要验证A的签名的时候:

1、A用私钥对散列值加密,加密就是签名的过程,密文就是签名值。

2、A把文件本身 和 签名值发给B

3、B用A的公钥解密签名值

4、B计算文件的散列值,把解密出的签名值与散列值比较,若是相同则认为签名有效,若是不同则认为无效。

--使用单向散列函数的其他好处:

1、签名的存储量大大减少。

2、对原文的散列值签名可以抵御某些攻击。

3、可以 验证数据的完整性。常规的单向散列函数是不需要密钥的,带密钥的单向散列函数叫做:消息认证码(message authentication code,MAC),上面A利用密钥计算的文件的散列值,就是MAC码。MAC的关键是利用了密钥。而攻击者不知道密钥,攻击者修改了文件之后,就无法再生成一个与原来一样的MAC(散列值)了。

4、可以存储账户的口令。Linux Unix用单向散列函数来存储口令。

--对单向散列函数的攻击:

字典攻击Attacker made a list includes 上百万常用口令,用单项散列函数对多有口令进行计算。把散列值存储到文件中,attacker 非法获得加密的口令之后,将比较这两个文件。观察是否有相同的口令密文。无奈的是多数 纯数字密码 就这样死翘翘了。

Salt(盐...)(添加符)是一种防御措施,salt是一个随机字符串。将他与口令连接,再计算散列值。若是salt达到64位,那attacker就........

另一个方法是增加对散列函数的处理次数。如可以对口令用单向散列函数处理1000次。这增加了attacker的预计算时间,但是对于口令的验证并没有明显影响。

attacker穷于应对第一种防御措施,但是对于第二种,可以找到

H(M) = H(M'),用生日攻击(在一群人当中,有人与你同一天生日,这个概率有多大?我们把概率曲线描出来,它是十分平缓的。但是!一群人当中,有两个人同一天生日的概率有多大?oh shit!!这个曲线是爆炸式的增长,到了350~365的时候才开始明显放缓(此时的概率接近100%)。也就是说找到两个人同一天生日的概率比我们想象的要大得多。实际上只需要23个人就可以使得这个概率到1/2以上。)


你可能感兴趣的:(计算机网络)