密码学学习整理三
2018-06-22 16:54
218 查看
密码学学习整理三
一. 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-1将消息分为512bit一组,整个消息长度小于2^64
消息认证码
-
消息在传输过程中是否发生改变或被恶意篡改,我们怎么能知道?
-
使用“数据完整性技术”当消息发生改变时,我们可以检查出来
-
不能,举例:某公司经网络发送一张订单m,为防范遭恶意篡改,先用Hash函数计算订单散列值H(m),再将之与订单一起发送 [m,H(m)]。接收方计算收到订单m’的散列值H(m’),若与收到的散列值相同,则确信订单未被篡改。问此方法是否行得通?为什么?不行,攻击者可先篡改订单,再计算假订单的散列值 (接收方无法识别)。关键问题:Hash函数没有密钥 (给定消息,任何人都可以计算)。
-
该方法对于定长消息是安全的
消息认证
消息认证,又称数据源认证,它的重要目标
保证传输消息的完整性(检查消息是否被改动过)主要技术
-
基于 Hash函数和加密 的认证
- 基于 MAC 的认证
基于MAC的认证 (续)
如果Bob计算得到的MAC与接收到的MAC一致,则说明:
Alice发送的消息未被篡改
* 因为攻击者不知道密钥,无法在篡改消息后产生相应的MAC
Alice不是冒充的
* 因为除收发双方外,没人知道密钥,攻击者无法冒充Alice发送合法的MAC
提供机密性的消息认证(方案一)明文M先被加密,再与MAC一起发送
提供机密性的消息认证(方案二)明文M与MAC被一起加密
通常,我们希望直接对明文进行认证,因此 方案2 的使用方式更为常用
相关文章推荐
- 密码学学习整理二
- jQuery学习整理1
- jQuery学习整理 (10)jQueryUI常用功能实战
- VUE 整理学习
- Kotlin 学习资料整理
- Spring学习笔记整理——AOP
- 一个老鸟发的公司内部整理的 Android 学习路线图
- jqGrid 学习笔记整理——终极篇(一)
- Hadoop Pig Hive NoSQL 学习相关资源整理
- Storm的数据处理编程单元:Bolt 学习整理
- 一个老鸟发的公司内部整理的 Android 学习路线图 Markdown 版本
- Java设计模式(学习整理)---单例模式
- 恶意代码--样本分析学习资料整理网络地址
- windows sdk API函数学习笔记整理--ini文件操作函数
- 学习OPENCV时的错误整理
- trait学习 笔记整理
- Java____内部类学习整理
- 工作学习整理
- 有关c#的学习笔记整理与心得
- JVM重要知识点整理和学习