加密的目的是为了让消息内容不被其他人知道。
认证的目的:为了保证消息内容完整性、消息内容真实性、消息来源的真实性、实体身份的真实性。因而需要认证。
双方互相信任(企业内部)
如:检查文件是否被更改过。
双方互相不信任(商业伙伴)
如:查验对方的文件是否真实
M= 输入消息
Hash() 生成消息认证码的哈希函数
K=共享密钥
MAC=消息认证码
则 MAC= Hash ( K , m ),
即通过 杂凑函数,基于信息内容 和 共享密钥,生成MAC码。
校验: 将 明文 m 和 MAC (m) 一起发送给对方。
作用 同时实现了加密和认证 两个效果。
M= 输入消息
Hash() 生成消息认证码的哈希函数
MDC = 篡改检测码
MDC = hash(m)
即通过 杂凑函数,仅基于信息内容,生成MDC码。
校验: 检测方需要与发送方进行其他方式的信息互通,以告知正确的MDC码是什么,检测方接受信息后,比较MDC码是否正确。
作用 实现了认证 效果。
利用AES等强分组密码,按CBC工作模式进行加密,生成MAC。
利用共享密钥+明文 共同Hash
分为 加密 明文+Hash , 和 加密Hash 不加密明文,两种模式
私钥签名,公钥加密。
(应该就是生日悖论的问题)
生日悖论
任找23人,从中选取两人具有相同生日的成功概率至少为 0.5 。
⇒ 模数较小(域空间较小)时,碰撞可能性较大。(强碰撞下,杂凑函数的防御性很大程度降低( 2n/2 复杂度下 可以成功碰撞 )。
大概意思是讲:
做个算法(代码) 框架,用来使用任意的杂凑函数。
在这个算法框架中,留一个位置用于嵌入任意杂凑函数,这样只需更换杂凑函数即可。
需要保证的事情是:这个框架的杂凑强度等价于 内嵌的杂凑函数的强度。
性质: HMAC的安全性取决于向前的杂凑函数的安全性。
基于CBC密文分组链接模式和CTR计数器模式实现的MAC算法。随便链个博客
CCM是Cipher Block Chaining Message Authentication Code (CBC-MAC)和Counter模式(CTR)的组合。可以同时实现认证信息和对数据加密。
基于CTR计数器模式和GMAC原理实现的MAC算法。其中GMAC是一种长得很像CBC模式的MAC。随便链个博客
(即哈希,但与算法上的哈希有细节区分。)
是将任意长度的数字串M映射成一个较短的定长输出数字串H的函数,该函数用 hash()表示。
注:Hash映射一般都是多对1的,所以难以求逆。
称 H = h( M ) 为 M的杂凑值。
两个效果:压缩、纠错。压缩:源自于定长输出;纠错:源自于杂凑函数灵敏度。
如果杂凑函数h()为单向函数,则称为单向杂凑函数。
如果 给定 M,并已知H = h(M),在此前提下,难以找到 M’ 使得 h(M’) = H,则称h为弱单向杂凑函数。
如果任意输入 M1 ≠ M2, 都无法使得 h(M1) = h(M2) ,则称h为强单向杂凑函数。
补充说明(个人理解):
上述对于强弱的定义源自于课本原文,本人认为该定义的原文措辞逻辑不够完整,可能造成误解,所以作出下列补充:
下记录
A条件: “如果 给定M,并已知H = h(M),难以找到 M’ 使得 h(M’) = H ”
B条件: “如果任意输入 M1 ≠ M2, 都无法使得 h(M1) = h(M2) ”
理解1: 条件A 和 条件B 都是在描述,不会发生哈希冲突的程度。
理解2: B是一个比A更苛刻的条件,即 A ∈ B。 也就是说,满足B的哈希函数,一定也满足A;但满足A的哈希函数不一定满足B。重新理解: 弱杂凑即指:满足A 但不满足B,所以是弱。强杂凑指:满足B(也满足A)。
武汉大学密码学公开课对这部分的描述 : “扛弱碰撞杂凑函数” && “扛强碰撞杂凑函数”
输入: 512bit / 组
输出: 每轮128b
轮运算: 四轮运算,每轮16步迭代,每轮所使用的逻辑函数不同。
Step 1. 将输入信息M,进行分组,分为 L * b 组。[ 对残缺组进行附加和填充 ]
Step 2. 类似于CBC 模式,对 每组信息进行 h[i] = hash( h[i-1] , m[i] )。 [ 与 CBC不同的是,过程中产生的 C[i] 可以直接丢弃,因为只需要最后的压缩值 ]
核心: 类似于 CBC 分组链接模式
h[i] = hash ( h[i-1] , m[i] ), 取 h[L] 为最终 Hash值。
输入: 512位/组,162位链值;
输出: 160位链值;
轮运算: 四轮运算,每轮20次迭代,每轮运算使用的逻辑函数和加法不同。
缺点:逻辑函数都是线性函数。
吸水: 将明文M分组,每一组与上一组进行按位异或,然后作等长置换
挤压:逆置换 + 按位异或
压缩函数, 类似SHA-1
输入: 512位/组,162位链值;
输出: 256 bit
发送:将 Hash(m) 与 m 一同加密,为 ( C(hash), C(m) )
接受:解密 得 ( hash , m’ ) ,比较 Hash(m’) == hash?: True, False