我们假设我有一些最后有16位校验和的数据包.我想猜猜使用了哪种校验和算法.
首先,根据转储数据,我可以看到数据包有效载荷中的一个字节更改完全改变了校验和,因此我可以假设它不是某种简单的XOR或总和.
然后我尝试了CRC16的几种变体,但没有太多运气.
这个问题可能更倾向于加密,但我真的对任何易于理解的统计工具感兴趣,以找出这可能是哪个CRC.如果其他一切都失败了,我甚至可能会转向绘制不同的CRC算法.
Backgroud故事:我有串行RFID协议,带有某种校验和.我可以毫无问题地重播消息,并解释结果(没有校验和检查),但我无法发送修改后的数据包,因为设备将它们丢弃在地板上.
使用现有的软件,我可以改变RFID芯片的有效载荷.但是,唯一的序列号是不可变的,因此我无法检查每个可能的组合.虽然我可以生成递增1的值的转储,但不足以使详尽的搜索适用于此问题.
如果问题本身不够,可以使用包含数据的转储文件 :-)
需要参考文献? CRC错误检测算法的无意义指南是我在这里提问之后找到的很好的参考.
最后,在接受了答案的非常有用的提示之后,我 使用了这个CRC计算器,并使用已知校验和的xored生成校验和得到0xffff,这使我得出结论,最终xor是CCITT的0x0000的0xffff instread.
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中排除.