我怎么能猜出校验和算法?

时间:2008-09-29 16:56:37

标签: checksum crc

我们假设我有一些最后有16位校验和的数据包。我想猜猜使用了哪种校验和算法。

首先,从转储数据中我可以看到数据包有效负载中的一个字节更改完全改变了校验和,因此我可以假设它不是某种简单的XOR或总和。

然后我尝试了several variations of CRC16,但没有太多运气。

这个问题可能更倾向于加密,但我真的对任何易于理解的统计工具感兴趣,以找出这可能是哪种CRC。如果其他一切都失败了,我甚至可能会转向drawing different CRC algorithms

Backgroud故事:我有串行RFID协议,带有某种校验和。我可以毫无问题地重播消息,并解释结果(没有校验和检查),但我无法发送修改后的数据包,因为设备将它们丢弃在地板上。

使用现有软件,我可以改变RFID芯片的有效载荷。但是,唯一的序列号是不可变的,因此我无法检查每个可能的组合。虽然我可以生成递增1的值转储,但不足以使详尽的搜索适用于此问题。

如果问题本身不够,

dump files with data可用: - )

需要参考文档吗? A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS是我在此处提问后找到的很好的参考资料。

最后,在接受了答案的非常有用的暗示之后,它比CCITT,我 used this CRC calculator和xored生成的校验和,已知校验和得到0xffff,这使我得出结论,最终xor是CCITT的0x0000的0xffff instread。

4 个答案:

答案 0 :(得分:18)

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了。第一个字节0xd6从CRC中排除。

答案 1 :(得分:1)

您必须尝试每种可能的校验和算法,并查看哪一个生成相同的结果。但是,无法保证校验和中包含哪些内容。例如,某些算法会跳过空格,从而导致不同的结果。

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

答案 2 :(得分:1)

它可能不是CRC,可能是像Reed-Solomon这样的纠错码。

ECC代码通常是他们保护的原始数据大小的一小部分,具体取决于他们想要处理的错误率。如果消息的大小超过大约16个字节,则2个字节的ECC将不足以使用。因此,如果消息很大,那么你最有可能纠正它的某种CRC。

答案 3 :(得分:0)

我试图在这里破解类似的问题,我找到了一个非常整洁的网站,它会带你的文件并用47种不同的算法运行校验和并显示结果。如果用于计算校验和的算法是这些算法中的任何一种,您只需在通过简单文本搜索生成的校验和列表中找到它。

网站为https://defuse.ca/checksums.htm