【发布时间】:2020-03-19 20:43:59
【问题描述】:
我正在努力对与 CRC-16 校验和相关的一段数据进行逆向工程。
我知道用于计算原始校验和的多项式是 0x8408 但仅此而已,我不知道初始值(如果有)、最终 XOR 值(如果有)、是否反映了输入或结果...
似乎有一个使用事物多项式的已知 CRC-16 生成器,CRC-16-CCITT 但尽管我已经尝试了一切,但我还是无法理解原始校验和是如何计算的.
这是我得到的数据及其各自的校验和。我还包括了一个位于数据和校验和之间的字节,它是增量的,我不知道它是否计算过。 (看最后两行,数据几乎一样,增量不一样但校验和相同)
| DATA |Inc|CRC|
|----------------------------------------------------------|---|---|
00 00 00 00 00 00 01 ef f7 fe ef ff fd ef fb fa fd a2 aa 21 01 f4 e0
00 00 00 00 00 00 01 ef f7 fd ef ff fd fe fb fa fd a2 aa 21 02 f4 d1
00 00 00 00 00 00 01 f7 fe fd fd ff fd df ff fb fd a2 aa 21 03 f4 cd
00 00 00 00 00 00 01 f7 fe fe fd ff f7 ef ff fa fd a2 aa 21 04 f4 c2
00 00 00 00 00 00 01 ef f7 fe ef ff fe ef fb fa fd a2 aa 21 05 f4 db
00 00 00 00 00 00 01 ef f7 fe ef ff fd ef fb fa fd a2 aa 21 06 f4 db
【问题讨论】:
-
你确定这是一个带有 poly 0x8408 的 CRC16 吗?如果你对最后两行进行异或,它会取消 crc 初始值并异或,你会得到 {00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 03 00 00},这不太可能是一个 CRC,因为两个 03 和 CRC == 0 意味着循环周期是 64 位(8 个字节),这太短了。如果不包括第二个 03,则会得到 {{00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00},对于非零数据,得到 CRC = 0。
-
@rcgldr 好吧,我不能说我 100% 确定这一点,因为我无法访问用于计算校验和的代码,但我得到了 poly 值,校验和的长度(2 个字节)及其在与该数据相关的软件的 SQL 表中的数据包中的位置。
-
@rcgldr 另外,在 SQL 表中,一些字段清楚地表明它是 CRC。另外,校验和的第一个字节是如何从不改变的,这对你来说是不是很奇怪? CRC算法不是设计用来使校验和不同,即使单个数据字节改变?
-
是的,通常 CRC 的两半都会随着数据的任何变化而变化。在最后两行中,附加的和是相同的,“校验和”是相同的,让我认为这是某种形式的校验和。
-
@rcgldr 所以你认为这不是 CRC 吗?这与我最初的问题有点不同,但有什么方法可以测试已知的校验和算法,然后找出使用的是哪一个?此外,无论如何,数据+“CRC”在由摩托罗拉 MPC CPU 驱动的嵌入式系统上结束。
标签: reverse-engineering checksum crc crc16