信息传输完整性 MAC及其变体的简述与原理

信息传输完整性

前几篇文章只讨论的是信息传输的保密性,以防止攻击者拿到明文为主,但是不能防御攻击者篡改明文。因此,此片文章主要讨论信息传输的完整性,能发现攻击者篡改明文,但是不能防御攻击者拿到明文。保密性与完整性在现实生活中各有所需,有时候需要兼顾,有时候也并不需要兼顾。
此片文章讲的内容可能会比较杂,内容将包含MAC,CRC,CBC-MAC,CMAC,NMAC,block-size的解决方案等内容,以简述为主。

CRC 循环冗余校验(Cyclic Redundancy Check)

CRC是根据所需要检验完整性的数据产生简短固定位数校验码的一种散列函数,如下图所示: 信息传输完整性 MAC及其变体的简述与原理_第1张图片
主要方式是在传输文件Message之后添加一个固定位数校验码tag来执行,但是并不能防止恶意的Attack。
如果Attacker使用中间人攻击,将Message替换,Attackers可以轻易的计算出恶意Message的tag,而接收方并不能判断这个Message是否是被替换后的。CRC为检测文件传输过程中的随机错误而设计,并非针对恶意Attack。因此我们需要另一种方法,叫MAC。

MAC 消息认证码(带密钥的hash函数)(Message Authentication Code)

MAC是一种基本机制,想法和CRC类似,只是有一点不同,就是需要Key进行加密。这里的Key加密最大的作用并不是防止明文泄露,而是让接收方能察觉密文被修改,让攻击方无法修改传递中的消息。
如CRC的图,多一个Key将会有大不同:tag<-MAC(key,m),V(key,m,tag)=Yes/No,接收方便能轻易判断了。
当然,相应的tag也不能太短,过短的话,依旧能被暴力破解法在有限的时间内破解掉。

主要应用:

1.CBC-MAC:主要应用于银行系统。
2.HMAC:主要应用于网络传输通道,例如:SSL,IPSec,SSH等。

NMAC:

个人感觉像是CBC-MAC的简化版,所以在此先介绍一下,NMAC是基于AES算法演变而成的,因此也继承的块加密的理念,如下图所示:
信息传输完整性 MAC及其变体的简述与原理_第2张图片
核心依旧是将明文分成块m[0]到m[n],每一个块与Key进行加密,加密后作为下一个Key再与下一个进行加密,直到块加密完后,再次使用Key1进行最后的加密,从而生成最后的tag。

最后次加密:

最后次加密在整幅图中看起来很奇怪,但是这是安全性最重要的一步。除去最后次加密的操作过程叫级联函数,而级联函数则是不安全的。如果不进行最后次加密,攻击者则可以创造一个m[n+1],并于上一步产出的Key进行相同的操作,以达到附加明文给接收者的结果,此种攻击称为扩展攻击。而最后次加密则是为了防止扩展攻击最重要的步骤。

CBC-MAC:

又称为ECBC,作为MAC主要应用的一种,CBC-MAC也是基于AES算法演变而成的,相较于NMAC而言复杂了点,如下图所示:
信息传输完整性 MAC及其变体的简述与原理_第3张图片
核心依旧是将明文分成块m[0]到m[n],每一个块与Key进行加密,加密后与下一块做⊕,再进行加密,直到块加密完后,再次使用Key1进行最后的加密,从而生成tag。
除去最后步加密后的叫做原CBC,而同样,原CBC也是不安全的,只是相较于NMAC攻击者所要做的稍微复杂点。

Block-Size 补充块大小:

使用块加密作为核心总会遇到关于块大小的问题,因为每个文件不是正好能被分成块的,最后的一块总是不完整的,因此需要补足。


1.补充0

将最后一块所缺少的补充上0,这是一种方法,但是极其的不安全。因为这就意味着Pad(m)=pad(m||0*n)具有相同的tag,导致的结果举个例子就是,1000美元等价于100美元。

2.补充1000...

将1000...补充至尾部,使其成为一个Block,因此为100...结尾不存在补充0所有的问题。但是对于尾部不缺少位的文件而言,也得另加一块100...,如果不这样做,也是一种不安全的做法。会导致m[n]以100...结尾和m[0]被补充了100...有着相同的tag。

3.CMAC

是最聪明的方法,核心如下图所示:
信息传输完整性 MAC及其变体的简述与原理_第4张图片
CMAC会使用三个Key,第一个用于F(k,m)的计算,当Block需要补足的时候使用K1进行最后的加密,当Block不需要补足的时候使用K2进行最后的加密。

你可能感兴趣的:(密码学,信息安全)