2008-09-29 49 views
14

让我们假设我有一些数据包的末尾有16位校验和。我想猜测使用哪种校验和算法。我如何猜测校验和算法?

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

然后我试着several variations of CRC16,但没有多少运气。

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

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

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

dump files with data可如果问题本身是不够的:-)

需要参考文档?A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS是我在问这里后发现的很好的参考资料。

最后,我 used this CRC calculator,并进行异或生成校验与已知校验得到0xFFFF的这使我得出结论最终XOR是CCITT的0×0000的0xFFFF的instread在接受的答案非常有用的提示比它的CCITT后。

+0

你可以得到你想要的任何数据的校验和? – 2008-09-29 16:59:12

+0

不,我不能。我可以使用与设备交谈的现有应用程序更改部分数据并生成校验和,但这不是整个数据包。 – dpavlin 2008-09-29 17:14:04

+0

CCITT的标准指定与0x0000的XOR?那不总是一个没有操作? – unwind 2008-10-20 08:12:18

回答

17

有许多的因素需要考虑的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被排除在外。

1

你将不得不尝试每种可能的校验和算法,看看哪一个产生相同的结果。但是,不能保证校验和中包含哪些内容。例如,有些算法会跳过空白,导致不同的结果。

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

+1

我可以看到为什么有人会希望它 - 如果他们是逆向工程的文件格式,以生成这些文件。我已经完成了。 – 2008-09-29 17:04:34

+1

正确。我有一些校验和的串行RFID协议。我可以毫无问题地重放消息,并解释结果(无校验和检查),但由于设备将它们放在地板上,所以我无法发送修改的数据包。 – dpavlin 2008-09-29 17:06:31

1

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

ECC代码通常是其保护的原始数据大小的一小部分,具体取决于它们要处理的错误率。如果消息的大小大于大约16个字节,则2个字节的ECC不足以有用。所以如果消息很大,你很可能正确的是它的某种CRC。

0

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

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