我如何猜测校验和算法?

时间:2020-03-06 14:53:06  来源:igfitidea点击:

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

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

然后,我尝试了几种CRC16的变体,但运气不佳。

这个问题可能更偏向于密码学,但是我对任何易于理解的统计工具来找出这可能是CRC感兴趣。如果其他所有方法都失败了,我什至可能会转向绘制不同的CRC算法。

背景故事:我有带有某种校验和的串行RFID协议。我可以毫无问题地重放消息,并解释结果(不进行校验和检查),但是由于设备将其丢在地板上,所以我无法发送修改后的数据包。

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

如果问题本身还不够,则可以使用带有数据的转储文件:-)

需要参考文件吗? CRC错误检测算法的无忧指南是很好的参考,我在这里提出问题后就找到了。

最后,在接受答案的提示比CCITT有用的提示后,我
使用此CRC计算器,并将生成的校验和与已知的校验和进行异或者运算,得到0xffff,这使我得出结论:最终的异或者是CCITT的0x0000的0xffff读入。

解决方案

我们将不得不尝试所有可能的校验和算法,并查看哪个算法会产生相同的结果。但是,不能保证校验和中包含哪些内容。例如,某些算法会跳过空格,这会导致不同的结果。

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

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

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

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标签,则有一些5位CRC和一些16位CRC方案。这些都记录在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中排除。