密码学学习整理三
一. Hash函数与消息认证码
-
Hash函数
-
定义
是一个将任意长度的消息映射成固定长度输出的函数
Hash函数是一个具有压缩功能的函数
- 设X是消息的集合,Y是散列值的集合
- 我们总是假设|X|≥|Y|,并且经常假设更强的条件|X|≥2|Y|
- 根据鸽巢原理:两个甚至多个消息会映射为同一个散列值
-
安全性
- 原像稳固:给定散列值y,要找到一个x,使得H(x)=y是计算上不可行的
- 第二原像稳固:给定消息x,找到另一个x’,使得H(x’)=H(x)是计算上不可行的
- 碰撞稳固:找到两个不同的消息 x和x’ ,使得H(x)=H(x’)是计算上不可行的
-
对Hash函数的攻击实际就是 寻找一对碰撞 的过程
-
如果Hash函数 H 设计得“好”,对给定x,要想求得相应的散列值,必须通过计算H(x)才行。如果想绕过 H,而采用其他方法计算出散列值是非常困难的。即使在已知若干散列值H(x1),H(x2),…的情况下,仍是困难的,因此有H(x1)+H(x2)≠H(x1+x2) ,H(x1)H(x2)≠H(x1x2)
-
生日攻击告诉我们:为了能达到n-bit的安全性,你所选择的Hash函数的散列值长度应该是2n。如果你想让攻击者成功破译的可能性低于1/280,那么应该使用散列值长度是160-bit的Hash函数
-
著名的Hash函数MD5,SHA-0,SHA-1,SHA-2,SHA-3
- MD5
- 输入:将信息分为512bit一组处理
- 输出:散列值长度为128bit
- 速度快,不依赖任何密码模块和假设条件,特别适合32位计算机软件实现
- SHA系列
- 输入:SHA-1将消息分为512bit一组,整个消息长度小于2^64
- 输出:SHA-1散列值长度为160bit
- 速度比MD5慢
- MD5
-
-
消息认证码
- 消息在传输过程中是否发生改变或被恶意篡改,我们怎么能知道?
- 使用“数据完整性技术”当消息发生改变时,我们可以检查出来
- Hash函数能否保证数据的完整性 ?
- 不能,举例:某公司经网络发送一张订单m,为防范遭恶意篡改,先用Hash函数计算订单散列值H(m),再将之与订单一起发送 [m,H(m)]。接收方计算收到订单m’的散列值H(m’),若与收到的散列值相同,则确信订单未被篡改。问此方法是否行得通?为什么?不行,攻击者可先篡改订单,再计算假订单的散列值 (接收方无法识别)。关键问题:Hash函数没有密钥 (给定消息,任何人都可以计算)。
- 可以看得出,如果设计一个带有密钥的算法,便可以解决这一问题,也就可以防范攻击者进行伪造 。消息认证码(MAC)算法便是这种带密钥的算法,它是实现数据完整性的重要工具 ,其产生的输出也相应地被称作MAC 。
- 安全性要求-抗伪造
- 在不知道密钥的情况下,给定任何消息,产生相应的MAC是计算上不可行的
- 即使已知很多消息及对应的MAC,对新消息产生MAC仍是计算上不可行的
- MAC构造-基于CBC模式构造
- 该方法对于定长消息是安全的
- 如果消息长度可变,即使密钥K没泄露,同样不安全
- CBC-MAC只有用于定长消息才能抗伪造
- ISO标准的CBC-MAC
- 消息在传输过程中是否发生改变或被恶意篡改,我们怎么能知道?
-
消息认证
-
消息认证,又称数据源认证,它的重要目标
- 保证传输消息的完整性(检查消息是否被改动过)
- 保证消息是由指定发送者发来的
-
主要技术
- 基于 Hash函数和加密 的认证
- 基于 MAC 的认证
-
基于MAC的认证 (续)
-
如果Bob计算得到的MAC与接收到的MAC一致,则说明:
-
Alice发送的消息未被篡改
* 因为攻击者不知道密钥,无法在篡改消息后产生相应的MAC
-
Alice不是冒充的
* 因为除收发双方外,没人知道密钥,攻击者无法冒充Alice发送合法的MAC
-
-
提供机密性的消息认证(方案一)明文M先被加密,再与MAC一起发送
-
提供机密性的消息认证(方案二)明文M与MAC被一起加密
-
通常,我们希望直接对明文进行认证,因此 方案2 的使用方式更为常用
-
-