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

目录

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等等,这让我们在使用上会更加灵活。

相关推荐
稳联技术15 小时前
汽车焊机数据通信:Profinet转Canopen网关的神奇连接
服务器·网络·汽车
毕设木哥16 小时前
计算机专业毕业设计推荐-基于python的汽车汽修保养服务平台
大数据·python·计算机·django·汽车·毕业设计·课程设计
achirandliu16 小时前
汽车电子电气架构从12V提升至48V,带来那些好处? 包括那些改变?
架构·汽车·汽车电子电气架构·从12v升到48v
lupai17 小时前
盘点实用的几款汽车类接口?
大数据·人工智能·汽车
achirandliu18 小时前
汽车英文单词缩写汇总
汽车·汽车英文单词
Java追光着18 小时前
扣子智能体实战-汽车客服对话机器人(核心知识:知识库和卡片)
人工智能·机器人·汽车·智能体
车载诊断技术20 小时前
电子电气架构——中央计算的软件定义汽车架构
网络·架构·汽车·soa·电子电器架构
上海知从科技20 小时前
喜报 | 知从科技荣获 “AutoSec 安全之星 - 优秀汽车软件供应链安全方案奖”
科技·安全·汽车
亚远景aspice20 小时前
ISO 26262功能安全标准与汽车软件代码质量的关系探讨
安全·汽车
稳联技术20 小时前
Canopen-pn有线通信标准在汽车制造中至关重要
汽车·制造