如何猜测校验和算法?

19
假设我有一些带有16位校验和的数据包。我想猜测使用了哪种校验算法。
首先,从转储数据中,我可以看到数据包有效载荷中的一个字节更改会完全更改校验和,因此我可以假设它不是某种简单的XOR或求和。
然后我尝试了几个CRC16的变体,但没有太多运气。
这个问题可能更倾向于密码学,但我真的很感兴趣找出任何易于理解的统计工具来找出这可能是哪个CRC。如果其他方法都失败了,我甚至可能会绘制不同的CRC算法
背景故事:我有一个带有某种校验和的串行RFID协议。我可以重放消息而不会出现问题,并且解释结果(不进行校验和检查),但是我无法发送修改后的数据包,因为设备会将其丢弃。
使用现有软件,我可以更改RFID芯片的有效载荷。但是,唯一的序列号是不可变的,因此我无法检查每个可能的组合。虽然我可以生成逐一递增的值的转储,但这对于此问题不适用。 数据转储文件可用,如果问题本身不够,请参考它们。

需要参考文档吗? 一个无痛的指南:CRC错误检测算法 是我在这里提问后发现的很好的参考资料。

最终,在接受的答案中得到非常有帮助的提示,即它是CCITT时,我使用了此CRC计算器,并将生成的校验和与已知的校验和进行异或运算,得到0xffff,从而得出结论,最终的xor为0xffff而不是CCITT的0x0000。


你能为任何想要的数据获取校验和吗? - Mike F
不,我不能。我可以更改部分数据并使用现有应用程序生成校验和,该应用程序与设备通信,但这不是整个数据包。 - dpavlin
CCITT的标准规定使用XOR和0x0000?那不是一直都没有操作吗? - unwind
4个回答

21

在计算CRC时需要考虑多个变量:

Polynomial
No of bits (16 or 32)
Normal (LSB first) or Reverse (MSB first)
Initial value
How the final value is manipulated (e.g. subtracted from 0xffff), or is a constant value

典型的循环冗余校验(CRC):

LRC:    Polynomial=0x81; 8 bits; Normal; Initial=0; Final=as calculated
CRC16:  Polynomial=0xa001; 16 bits; Normal; Initial=0; Final=as calculated
CCITT:  Polynomial=0x1021; 16 bits; reverse; Initial=0xffff; Final=0x1d0f
Xmodem: Polynomial=0x1021; 16 bits; reverse; Initial=0; Final=0x1d0f
CRC32:  Polynomial=0xebd88320; 32 bits; Normal; Initial=0xffffffff; Final=inverted value
ZIP32:  Polynomial=0x04c11db7; 32 bits; Normal; Initial=0xffffffff; Final=as calculated

首先要做的是通过改变最后一个字节来获取一些样本。这将帮助您确定CRC中的字节数。

这是否是“自制”的算法?如果是,可能需要一些时间。否则,请尝试标准算法。

尝试更改最后一个字节的MSB或LSB,看看这如何改变CRC。这将给出一个方向指示。

要使其更加困难,有些实现会操纵CRC,使其不影响通信介质(协议)。

从您对RFID的评论来看,这意味着CRC与通信有关。通常使用CRC16进行通信,但某些系统也使用CCITT。

另一方面,如果这是UHF RFID标记,则有几种CRC方案-5位和一些16位。这些在ISO标准和IPX数据表中有记录。

IPX:  Polynomial=0x8005; 16 bits; Reverse; Initial=0xffff; Final=as calculated
ISO 18000-6B: Polynomial=0x1021; 16 bits; Reverse; Initial=0xffff; Final=as calculated
ISO 18000-6C: Polynomial=0x1021; 16 bits; Reverse; Initial=0xffff; Final=as calculated
    Data must be padded with zeroes to make a multiple of 8 bits
ISO CRC5: Polynomial=custom; 5 bits; Reverse; Initial=0x9; Final=shifted left by 3 bits
    Data must be padded with zeroes to make a multiple of 8 bits
EPC class 1: Polynomial=custom 0x1021; 16 bits; Reverse; Initial=0xffff; Final=post processing of 16 zero bits

经过分析日志,CRC是CCITT协议。在计算CRC时第一个字节0xd6被排除。


我慢慢地又开始掉头发了。我尝试使用CCITT处理我的数据,但它对我不起作用。你能分享一段实现的代码片段和/或在http://www.zorc.breitbandkatze.de/crc.html或http://www.lammertbies.nl/comm/info/crc-calculation.html上重现CRC吗? - dpavlin
1
忽略我,最终异或值为0xffff而不是0x0000,这与CCITT不同...我将CCITT校验和与校验和本身进行异或运算,这使我朝着正确的方向前进了... - dpavlin

2
我正在尝试解决一个类似的问题,我找到了一个相当不错的网站,它可以对您的文件运行47种不同算法的校验和,并显示结果。如果用于计算您的校验和的算法是其中之一,您只需在生成的校验和列表中使用简单的文本搜索找到它即可。
该网站为https://defuse.ca/checksums.htm

有一个可以在可能的情况下反向操作的吗? - CQM

2

可能不是循环冗余校验码(CRC),而是像Reed-Solomon一样的纠错码。

纠错码通常占原始数据的相当大部分,具体取决于所需处理的错误率。如果消息的大小超过约16字节,则2个字节的纠错码将无法发挥作用。因此,如果消息很大,您最有可能是正确的,它是某种类型的CRC。


是的,但消息远低于256字节,并且校验和在相当简单的硬件设备上进行检查,因此我目前的最佳猜测是它是某种CRC。 - dpavlin
准确来说,我的最长消息是70个字节。在长度之前有一个空洞,可能会将可能的长度延长超过一个字节,但我还没有看到任何真实生活中超过70个字节的消息。 - dpavlin

0

你需要尝试每种可能的校验和算法,看哪一种会生成相同的结果。然而,并不能保证校验和中包含了哪些内容。例如,有些算法会跳过空格,这会导致不同的结果。

但我真的不明白为什么有人想知道这个。


3
我能理解为什么有人需要这个 - 如果他们在逆向工程一个文件格式以便生成那些文件。我做过这个。 - Paul Tomblin
2
正确。我有带有某种校验和的串行RFID协议。我可以重放消息而没有问题,并解释结果(不进行校验和检查),但我无法发送修改后的数据包,因为设备会将它们丢弃。 - dpavlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接