CRC8逆向工程

逆向工程 CRC
2021-06-24 21:43:28

我正在创建一个 CAN 总线工作台测试解决方案,它复制整个车辆以测试单个模块。我有许多消息需要 CRC 字节才能有效。消息采用 little-endian 字节顺序,CRC 值保存在字节 0 中。我收集了带有不断变化的 4 位活动计数器及其 CRC 字节的有效消息,希望有人能提供帮助。我尝试过 CRC reveng,但要么不知道正确使用它,要么无法找到多项式,因为它在搜索时显示“未找到模型”。

作为参考,我发现文档表明所使用的多项式是标准的 SAE J1850 CRC8 多项式 x^8 + x^4 + x^3 + x^2 + 1,CRC-ID 十进制为 166(声明为用于低字节)。我也尝试过使用此处提供的在线计算器:http : //www.sunshine2k.de/coding/javascript/crc/crc_js.html,但无法获得正确的结果。

如果有人可以提供一些帮助,我将不胜感激。我想帮助澄清正确的多项式以及任何其他相关参数。以下是捕获的值列表:

字节 0 中的 CRC

这是上面的文字版。为清楚起见,我已将字节 0 中的 CRC 值与消息的其余部分分开。

57   0000C0F0C1FFFF
0A   0100C0F0C1FFFF
ED   0200C0F0C1FFFF
B0   0300C0F0C1FFFF
3E   0400C0F0C1FFFF
63   0500C0F0C1FFFF
84   0600C0F0C1FFFF
D9   0700C0F0C1FFFF
85   0800C0F0C1FFFF
D8   0900C0F0C1FFFF
3F   0A00C0F0C1FFFF
62   0B00C0F0C1FFFF
EC   0C00C0F0C1FFFF
B1   0D00C0F0C1FFFF
56   0E00C0F0C1FFFF
1个回答

使用相同的页面,并选择 CRC_SAE_J1850,然后切换到“自定义”并将“最终异或值”更改为 0x7a。

设置应该是:

  • 输入反射:否
  • 输出反射:否
  • 多项式:0x1d
  • 初始值:0xff
  • 最终异或值:0x7a

使用 Byte1-Byte7 作为输入。

鉴于:

  • crc_data[n] 是您提供的数据集数据中的 crc n
  • crc_sae_j1850[n] 是数据集的标准 CRC SAE J1850 值 n

我注意到对于任何i, j

crc_data[i] ^ crc_data[j] = crc_sae_j1850[i] ^ crc_sae_j1850[j]

例如对于i=0j=1

0x57 ^ 0x0a = 0xd2 ^ 0x8f
0x5d        = 0x5d

这意味着可以调整最终的异或值以获得所需的值:

new_final_xor = original_final_xor ^ crc_data[i] ^ crc_sae_j1850[i]
              = 0xff               ^ 0x57        ^ 0xd2
              = 0x7a