前言
SecOC通过对PDU(Protocol Data Unit,协议数据单元)进行加密保护,保证车辆内部各个ECU之间通信的真实性、完整性、机密性。但对初学者而言,这些解释,字都认识,但着实有点难理解。
究竟一个加密后的PDU的格式是怎么样的?这篇文章,希望通过报文解析,加深下对SecOC 原理的理解。
Note: PDU,协议数据单元。在分层网络结构中,数据需按照一定协议逐层处理后才能生成进行网络传输。每一层加工完之后的信息可以认为是一个PDU。
报文
使用CANoe 截取量产车辆CAN 总线上报文,选其中一个SecOC加密后的PDU进行分析,如下图。PDU结构上包含4部分。
第一部分,CRC校验值。
发送方将即将要发送的报文进行处理,生成CRC校验值。接收方收到数据后,采用相同算法进行CRC计算,结果若与发送方发送的CRC相同,则校验通过。
CRC能够对数据的完整性进行校验,算法比较简单,逻辑是将需要校验的数据与校验标准式进行异或运算。大多数情况下,数据源不同,CRC的校验值也不同。当然,CRC 并不能识别出所有的传输错误,但算法简单,占用资源少,所以也被广泛使用。
图中报文,可以看出这段PDU采用E2E profile 5 进行计算。E2E profile 5 是什么?在AutoSAR的规范《Specification of SW-C End-to-End Communication Protection Library》中有相关的解释,感兴趣可以细看下。当然,不想读原文,推荐看下博文。
https://blog.csdn.net/qfmzhu/article/details/122334722)。
第二部分,是应用数据。
图中要传输的数据是电机转速,扭矩等应用信息。个人理解,这些信息对于整车比较关键,一旦被篡改对整车影响较大,所以需要安全加密。总线的通信矩阵可以查看哪些PDU进行了加密。当然,哪些信息需要加密,是需要在开发阶段定义。
第三部分,SQC,PDU 发送的计数器。
占用一个字节。初始值为0,最大值255,发送端每发送一次PDU,计算器加1。个人理解,该计数器代表报文发送的时序,SQC的连续性有助于确认报文发送过程是否错乱。下图是实际的SQC的数值。需要注意的是,总线休眠/ECU reset,SQC从0开始,即使SQC 未达到255。
第四部分,新鲜度值和认证信息。
SecOC加密的关键信息,包含新鲜度值和认证信息。从安全等级考虑,数据本身会比较长,并有一定的结构形式,实际报文中只是按照一定的规则截取其中一部分,以降低总线带宽占用。
-
新鲜度值,在AutoSAR里有相关的说明,可以有不同的方案生成。但总的来说,新鲜度值和报文发送时的时间标志位相关,有了这些标志位,可以唯一确定这个报文。
-
认证信息,一般指的是MAC(Message Authentication Code),消息认证码。MAC的计算过程如下,期间会结合整车密钥、信息源内容及新鲜度值等相关数据生成对应的MAC值。 其中,Secret Key是整车相关的密钥,各个主机厂所采用的形式及计算方法不同。但以个人理解,Secret Key 应与单个车辆本身强相关,如VIN 码。另外,需要有一套密钥管理系统,负责密钥的管理和发放。当然这个密钥的管理,应该要覆盖生产过程、售后维修,以确保密钥被控制器安全存储并使用。
总结
以上,是按照个人理解,对一个SecOC 加密后的PDU 进行的解读,希望能有助于理解SecOC的加密过程和具体形式。
推荐看下下面的文章,SecOC 的内容写的很专业!!
http://www.360doc.com/content/22/0427/20/50578091_1028609701.shtml