E2E Profile01分析
一、前言在车载CAN总线功能安全开发中AUTOSAR E2EEnd-to-End Protection端到端保护用于防止报文篡改、丢帧、重放攻击。本文记录定制版 Profile01区别于标准AUTOSAR闲置未使用位强制置1行业特殊定制要求DataID 仅参与CRC运算不写入报文CRC8参数多项式0x1D、初始值0x00、结果异或0x00本文附带完整可直接运行CAPL源码 实测报文演算案例。二、算法基础参数参数项配置值算法类型CRC8多项式0x1DSAE J1850初始值0x00结果异或值0x00输入反转False输出反转FalseDataID0x2233仅运算、不组包实现方式查表法高效、车载标配三、定制关键规则未使用位强制置1本项目最大特殊点报文预留闲置位在CRC计算之前必须强制置1不可保留原始默认值。指定闲置置1位工程定义Byte1 高4位→ 固定置1Byte2 高3位→ 固定置1Byte4 低1位→ 固定置1Byte5 高2位→ 固定置1Byte6 低5位→ 固定置1作用防止无效闲置位随机波动导致CRC校验失败。四、CRC计算数据流向核心流程4.1 报文格式Byte0CRC8校验和最终计算填入Byte1~Byte7应用数据4.2 参与CRC运算的数据序列运算顺序 DataID(2字节) 置1处理后的报文Byte1~Byte7⚠️ 注意Byte0不参与CRC计算DataID仅参与运算不会发送到总线上。五、实测案例演算真实报文5.1 原始测试报文报文00 FC FA 4B 75 E9 DF 005.2 闲置位强制置1处理本报文原本闲置位全部已经为1置1处理后数据不变FC FA 4B 75 E9 DF 005.3 送入CRC的完整9字节22 33 FC FA 4B 75 E9 DF 005.4 最终计算结果CRC8校验和 0xA05.5 最终合法报文A0 FC FA 4B 75 E9 DF 00六、完整CAPL工程源码可直接复制运行6.1 全局变量variables { const word E2E_DataID 0x2233; // 仅参与CRC不发送 }6.2 闲置位强制置1函数void E2E_FillUnusedBit(byte data[]) { data[1] data[1] | 0xF0; //Byte1 高4位置1 data[2] data[2] | 0xE0; //Byte2 高3位置1 data[4] data[4] | 0x01; //Byte4 低1位置1 data[5] data[5] | 0xC0; //Byte5 高2位置1 data[6] data[6] | 0x1F; //Byte6 低5位置1 }6.3 CRC8查表法算法byte CRC8_Profile01(byte data[], dword len) { byte crc 0x00; dword i; const byte crcTable[256] { 0x00,0x1D,0x3A,0x27,0x74,0x69,0x4E,0x53, 0xE8,0xF5,0xD2,0xCF,0x9C,0x81,0xA6,0xBB, 0xCD,0xD0,0xF7,0xEA,0xB9,0xA4,0x83,0x9E, 0x25,0x38,0x1F,0x02,0x51,0x4C,0x6B,0x76, 0x87,0x9A,0xBD,0xA0,0xF3,0xEE,0xC9,0xD4, 0x6F,0x72,0x55,0x48,0x1B,0x06,0x21,0x3C, 0x4A,0x57,0x70,0x6D,0x3E,0x23,0x04,0x19, 0xA2,0xBF,0x98,0x85,0xD6,0xCB,0xEC,0xF1, 0x13,0x0E,0x29,0x34,0x67,0x7A,0x5D,0x40, 0xFB,0xE6,0xC1,0xDC,0x8F,0x92,0xB5,0xA8, 0xDE,0xC3,0xE4,0xF9,0xAA,0xB7,0x90,0x8D, 0x36,0x2B,0x0C,0x11,0x42,0x5F,0x78,0x65, 0x94,0x89,0xAE,0xB3,0xE0,0xFD,0xDA,0xC7, 0x7C,0x61,0x46,0x5B,0x08,0x15,0x32,0x2F, 0x59,0x44,0x63,0x7E,0x2D,0x30,0x17,0x0A, 0xB1,0xAC,0x8B,0x96,0xC5,0xD8,0xFF,0xE2, 0x26,0x3B,0x1C,0x01,0x52,0x4F,0x68,0x75, 0xCE,0xD3,0xF4,0xE9,0xBA,0xA7,0x80,0x9D, 0xEB,0xF6,0xD1,0xCC,0x9F,0x82,0xA5,0xB8, 0x03,0x1E,0x39,0x24,0x77,0x6A,0x4D,0x50, 0xA1,0xBC,0x9B,0x86,0xD5,0xC8,0xEF,0xF2, 0x49,0x54,0x73,0x6E,0x3D,0x20,0x07,0x1A, 0x6C,0x71,0x56,0x4B,0x18,0x05,0x22,0x3F, 0x84,0x99,0xBE,0xA3,0xF0,0xED,0xCA,0xD7, 0x35,0x28,0x0F,0x12,0x41,0x5C,0x7B,0x66, 0xDD,0xC0,0xE7,0xFA,0xA9,0xB4,0x93,0x8E, 0xF8,0xE5,0xC2,0xDF,0x8C,0x91,0xB6,0xAB, 0x10,0x0D,0x2A,0x37,0x64,0x79,0x5E,0x43, 0xB2,0xAF,0x88,0x95,0xC6,0xDB,0xFC,0xE1, 0x5A,0x47,0x60,0x7D,0x2E,0x33,0x14,0x09, 0x7F,0x62,0x45,0x58,0x0B,0x16,0x31,0x2C, 0x97,0x8A,0xAD,0xB0,0xE3,0xFE,0xD9,0xC4 }; for(i 0; i len; i) { crc crcTable[crc ^ data[i]]; } return crc; }6.4 E2E组包主函数void E2E_Profile01_Pack(byte data[], dword dlc) { byte crcBuf[64]; byte crc8; int idx 0; int i; E2E_FillUnusedBit(data); //闲置位强制置1 crcBuf[idx] (E2E_DataID 8) 0xFF; crcBuf[idx] E2E_DataID 0xFF; for(i1; idlc; i) //不包含Byte0 { crcBuf[idx] data[i]; } crc8 CRC8_Profile01(crcBuf, idx); data[0] crc8; //CRC填入Byte0 }6.5 IL层自动发送回调dword applILTxPending(long aId, dword aDlc, byte data[]) { dword ret 1; if(aId 0x11F) { E2E_Profile01_Pack(data, aDlc); } return ret; }七、总结本算法为定制版E2E Profile01最大特征闲置位强制置1、DataID隐式参与运算CRC8参数严格固定0x1D、初值0x00、无结果异或