Message Integrity消息完整性,MAC、HMAC、NMAC、CMAC、Wegman-Carter MAC

Message Integrity消息完整性

消息完整性通常对信息进行摘要,形成较短的内容,再结合加密算法生成标识内容。主要包含(顺序的比如:)CRC,HASH、MAC,NMAC,ECBC、CMAC,(并行的比如)Wegman-Carter MAC等内容。

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


CRC是根据所需要检验完整性的数据产生简短固定位数校验码的一种散列函数,如下图所示:


主要方式是在传输文件Message之后添加一个固定位数校验码tag来执行,但是并不能防止恶意的Attack。

二、Hash(散列函数)

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

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

密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。安全性依赖于Hash函数,故也称带密钥的Hash函数。消息认证码是基于密钥和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。

由 Alice 根据消息 m 和签名 k 生成 tag,验证着可以根据这个 tag 进行消息完整性的验证。具体过程可以参考下图:

                     

四、HMAC(Hash-based message authentication code)

算法公式:HMAC(K,m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m))

通过两次hash两个不同的key来生成。 还没有发现有任何的方法来产生碰撞。如下图所示:

步骤:First-Hash: H(Ko XOR Ipad || (data to auth)) 

           Second-Hash: H(Ko XOR Opad || First-Hash)

  H 代表所采用的HASH算法(如SHA-256) 

  K 代表认证密码

  B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小 【SHA-1和SHA-256 B = 64,SHA-384和SHA-512 B = 128 】

  Ko 代表HASH算法的密文 【在密钥K后面添加0来创建一个字长为B的字符串。(例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00) 

  Opad 用0x5a重复B次 
  Ipad 用0x36重复B次

应用:

HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中

1. 客户端向服务器发出一个验证请求

2. 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)

3. 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。

4. 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户 

安全性:

HMAC算法更象是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的HASH算法

1. 使用的密钥是双方事先约定的,第三方不可能知道。能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。

2. HMAC与一般的加密重要的区别在于它具有“瞬时”性,即认证只在当时有效

五、 ECBC MAC

ECBC MAC是以AES为核心算法,具有分组序号的初始向量,如下图所示:

                        

核心依旧是将明文分成块m[0]到m[n],每一个块与Key进行加密,加密后与下一块做⊕,再进行加密,直到块加密完后,再次使用Key1进行最后的加密,从而生成tag。
除去最后步加密后的叫做原CBC,而同样,原CBC也是不安全的。

NIST 通常称ECBC MAC为CMAC

六 、NMAC(Nested MAC):


NMAC不再简单的使用AES或者3DES,继承块加密的理念,如下图所示:

                          

核心依旧是将明文分成块m[0]到m[n],每一个块与Key进行加密,加密后作为下一个Key再与下一个进行加密,直到块加密完后,再次使用Key1进行最后的加密,从而生成最后的tag。

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

七、CMAC


CMAC也是以AES为核心算法,核心如下图所示:

CMAC会使用三个Key, key = (k,k1,k2),第一个用于F(k,m)的计算,当Block需要补足的时候使用K1进行最后的加密,当Block不需要补足的时候使用K2进行最后的加密。

八、PMAC(Parallel Message Authentication Code)


PMAC有别于前面的顺序的MAC方式,之前的ECBC和NMAC本质上都是线性的,但也有相同于前面的MAC方式,核心如下图所示:

值得注意的是P(k,i),是以增量(i ++)的方式进行. 因为,我们也很容易对原来的消息进行update.

      

九、Wegman-Carter MAC

One-Time MAC 对于任何的攻击者都是安全的,并且比PRF-based MACs要快得多. 在此基础上,又可以衍生出多次MAC.

综上所述:

对ECBC-MAC,CMAC,NMAC,PMAC,Carter-Wegman MAC做下总结。

ECBC -MAC,CMAC: 通常基于AES

NMAC:  一种常用的HMAC方法

PMAC: 一种并行的MAC方法

Carter-Wegman MAC:一种快速的单次MAC方法

猜你喜欢

转载自blog.csdn.net/SkyChaserYu/article/details/96994555
mac