第六讲 消息认证和散列函数

安全攻击

  • 泄密、传输分析:破坏机密性
  • 伪装、内容修改、顺序修改、计时修改:破坏完整性
  • 发送方否认、接收方否认:破坏抗抵赖性

其中接收方否认的情况不仅需要数字签名,还需要配合协议来解决。

消息认证和HASH函数

区别和关系

可用来产生认证符的函数分为三类:

  • 消息加密函数,用完整信息的密文作为对消息的认证。
  • 消息认证码MAC,MAC是消息和密钥的函数,产生一个固定长度的值作为认证标识。
  • 散列函数(Hash Function),是一个公开的函数,它将任意长的信息映射成一个固定长度的信息。

一句话概括就是Hash函数属于消息认证中的一部分。

消息加密

消息的自身加密可以作为一个认证的度量。对称密钥模式和公开密钥模式有所不同。

  • 对称加密:如果明文具有一定的语法结构,接收方可以判断解密后明文的合法性,从而确认消息来自发送方而且中间未受到篡改。如果明文为二进制文件,则难以判断解密后的消息是正确的明文。
  • 公钥加密:既能实现保密性,又能完成认证和签名。一次通信中要进行四次复杂的公钥算法。

消息认证码

可以参考之前的博文:第四讲 对称密码的使用方法

需要区分注意的是,认证码对明文或密文进行MAC都是可以的。因为有密钥的保护,所以即便是对密文进行MAC也不会被篡改,只是这种方式在仲裁的时候必须保留密文,不太好。
而对于Hash函数而言,只能对明文或摘要进行Hash,对密文的Hash是没有任何意义的,可以被随意篡改。

散列函数(Hash)

  • 将一个长度可变的消息M转换为一个固定长度的输出,称之为散列码或摘要
  • 与MAC的区别:没有使用密钥,函数输入参数只有一个
  • 可以检测出消息是否发生变化
  • 和加密结合可以用于认证

消息认证和数字签名

※消息认证与数字签名的区别

认证包括消息认证与身份认证两类:

  • 消息认证:针对消息,主要验证消息的来源以及完整性
  • 身份认证:针对通信方,主要验证通信方的身份,通讯对端身份的唯一性和合法性
    数字签名:是一种实现身份认证+消息认证的方法。
    消息认证认证来源,验证信息的完整性,即验证数据在传送或存储过程中未遭篡改、重放等。
    数字签名认证个体,验证信息发送者的身份,包括信源、信宿等的认证和识别。

※HASH函数的性质

  • 抗弱碰撞:明文的任何一点改变都会使Hash值发生变化。
  • 抗强碰撞:明文和Hash值是一一对应的。
    抗强碰撞自然抗弱碰撞。

这里的弱碰撞和强碰撞的区别在于,弱碰撞是已知一个消息去找碰撞,而强碰撞是在所有消息中找满足碰撞的一组消息。

  • 单向性

MD5算法的原理

  • 填充消息

为什么位数正好也要进行填充:防止碰撞。

  • 附加消息长度

  • 初始化缓冲区

  • 分组处理消息
    每次处理一个消息分组:512位。一个消息分组的处理过程:
    算法的核心是压缩函数,由四轮运算组成,每轮进行16步迭代。每轮使用不同的逻辑函数,记为F,G,H,I。
    T是事先产生的表格,包含64项,每项32位。512位信息在每轮被分为16个分组,每个分组为32位。
    image

  • 输出消息摘要

本质其实就是根据消息对着基础ABCD寄存器中的字符进行不断的计算,最终输出变化后的ABCD寄存器中的值。

MD5、SHA-1和RIPEMD-160的比较

image

MD5的攻击方法

  • 枚举法
  • 字典法
  • 彩虹表法

HASH攻击的意义:碰撞服务器存储的密码。

彩虹表法

image

值域和定义域的意思就是方便收尾相接互相作为输入输出。

为了解决不同的明文也会产生同样的结果的问题,对R(x)函数进行了改进。即,每次对R函数进行修改。
image

只存一系列函数处理的一头和一尾,一系列函数一般是H R1 H R2 H R3这样的顺序交叉进行处理,可以有效防止重复。

生日攻击的原理

  • 生日问题1:当你走进教室的时候,问教室里要有多少人使得存在跟你生日相同的人的概率超过50%?(弱碰撞性)
    解:求\(n\),使得\(q(n)=1-(\frac{364}{365})^n≥\frac{1}{2}\)
    解得\(n=253\)

  • 生日问题2:一个教室内,要有多少人才能使至少有二人的生日在同一天的概率超过50%?(强碰撞性)
    解:求\(k\),使得\((1-\frac{1}{365})(1-\frac{2}{365})…(1-\frac{k-1}{365})≈\frac{1}{2}\)
    解得\(k≈23\)
    image
    image
    说了这么多,其实生日攻击就是写出好的hash function最大的绊脚石。如果你把hash function的每个输入值想成是n个人中的一个,再把输出值想成是每个人的生日,那么生日问题就告诉我们,只需要很少的输入值,就会有很大的可能性有至少两个输出值完全相同,也就违反了hash function的条件之一。这就是生日攻击。
    生日攻击能够奏效就是因为这个值域太小,像我们的生日问题中值域只有365,所以只要70个人就能够找到相同生日的两个人。

可以参考:生日攻击是什么,有什么用?

posted @ 2021-12-06 11:34  Weisswire  阅读(1552)  评论(0编辑  收藏  举报