当前位置:   article > 正文

汽车网络安全 -- MAC介绍:CMAC与CBC-MAC不能混为一谈_cmac校验

cmac校验

目录

1.什么是MAC

2.CMAC

3.HMAC

4.小结


1.什么是MAC

MAC全称Message authentication code,是经过特定算法后产生的一小段数据信息,用于校验某数据的完整性和真实性。在数据传递过程中,可检查其内容是否被更改过,不管更改的原因是来自意外或是蓄意攻击。同时可以作为数据来源的身份验证,确认数据的来源。常见的MAC算法包括CMAC和HMAC。

2.CMAC

CMAC全称Cipher-based message authentication codes,利用分组加密和私钥来生成MAC,用于验证消息的完整性和真实性,常见算法如AES-CMAC。

根据NIST 800-38B描述,CMAC算法的核心是CBC-MAC的一种变体OMAC1,该算法是为了解决CBC-MAC本身缺陷。

在2001年,John Black and Phillip Rogaway为了解决CBC-MAC缺陷,提出了改进措施,命名为XCBCa,但该改进措施所需密钥至少为3个,为此Tetsu Iwata and Kaoru Kurosawa 在2003年进一步提出One-key CBC MAC(OMAC),用于解决密钥长度问题。

CBC-MAC是最早的MAC算法,原理非常简单,就是使用CBC进行计算,取最后一个分区作为Tag,如下图:

图1 CBC-MAC

但该方式容易被攻击者构造新的数据\MAC,在消息长度不固定的情况下不安全。

CMAC仍旧基于CBC-MAC对消息数据进行处理,区别在于最后MAC生成时根据数据长度和派生的不同密钥进行处理,如下图所示:

图2 AES-CMAC的两种情况

  • Case 1:消息数据是数据块的整数倍,使用私密密钥k1生成MAC(T);
  • Case 2:消息数据不能整除,使用私密密钥k2生成MAC(T);

上图中,AES_KEY表示实际输入的K,K1、K2分别由AES_KEY进行派生,基本步骤如下:

两个使用到的常数:

const_Zero = 0x00000000000000000000000000000000

const_Rb(AES)  =     0x00000000000000000000000000000087

const_Rb(DES\3DES)  = 0x000000000000001B

  1. 使用AES_KEY对全0输入块加密得到变量L;
  2. K1生成:如果L的最高有效位为0,K1 = L << 1;                                                                                    如果L的最高有效位为1,K1 = const_Rb⊕( L << 1)。
  3. K2生成:如果K1的最高有效位为 0, K2 = K1 << 1;                                                                             如果K1的最高有效位为 1, K2 = const_Rb⊕( K1<< 1)。

特别是,针对数据不是数据块整数倍的情况,需要对最后一块进行填充,填充方式为

b (t) ||10...0,填充长度 = 数据块-len(t)。

需要注意的是,生成的MAC(也成TAG)长度是可以截取的,根据标准推荐,绝大部分应用应该至少保证8个字节长度的MAC,以抵御猜想攻击。

​​​​​​​3.HMAC

HMAC全称Keyed-Hashing for Message Authentication,同样是为了满足数据的完整性和真实性。

HMAC可以基于任何hash函数实现,例如SHA512、SHA-1、MD5等,而所谓Keyed-Hashing,是将密钥参与到Hash计算,而不是做任何加解密操作。

根据RFC 2104介绍,针对消息数据m的HMAC计算应采用如下公式:

MAC(m) = HMAC(K,m)= H( K1⊕opad) || H(K1⊕ ipad || m))

其中,

  • H():某Hash函数;
  • K:私钥;
  • K1:有私钥K派生出的密钥
  • 填充opad:outer pad,固定0x5c5c..5c 填充至hash算法分块大小;
  • 填充ipad:inner pad,固定0x3636...36填充至hash算法分开大小;

具体步骤如下:

  1. 判断Len(K) == B(Hash函数分块大小),如是,设置K1 = K,直接进入第3步;如不是,进入第2步;
  2. 如果Len(K) > B,则需要使用hash函数对K进行处理,得到L字节长度字符串(例如SHA256可以得到32byte摘要值),并在该L字符串后补0到B字节长度 L||00..00,整体作为K0;如果Len(K)<B,则直接填充00到B字节长度作为K0;
  3. 将K0与ipad进行异或得到值Si,作为m的头部分,记为Si || m;
  4. 对Si || m进行hash处理,得到摘要MAC1;
  5. 将K0与opad进行异或得到值So,作为MAC1的头部分,记为So || MAC1;
  6. 再对So || MAC1进行hash处理,得到最终摘要MAC(m)。

以SHA-256为例,每组分块为512bit,得到32byte摘要值,具体流程如下:

图 3 HMAC-SHA256过程

4.小结

可以看到HMAC、CMAC均可以保证数据的完整性和真实性,RFC2104 HMAC于1997年发布,CMAC于2006年发布,针对HMAC的测试向量更容易在网上找到,并且由于HMAC不涉及加解密,在效率上应该更快一点。

但是从实际角度看,汽车行业多用AES-CMAC,猜想应该是很多MCU最开始就是根据SHE规范设计的硬件加速引擎,里面就要求使用CMAC,其次就是针对CAN通信,使用AES-CMAC在分组填充上更为优化,毕竟标准can一帧数据才8byte。总体而言,随着汽车芯片对信息安全重视程度不断提高,HSM支持的算法将会越来越多,包括国密SM2\3\4等等,这让我们在使用上会更加灵活。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/947089
推荐阅读
相关标签
  

闽ICP备14008679号