我怎么能猜出校验算法?(How could I guess a checksum algorithm

2019-07-20 03:47发布

让我们假设我有一些数据包,并在最后一个16位的校验和。 我想猜出校验算法。

一开始,从转储数据我可以看到,在包的净荷一个字节的变化完全改变了校验,所以我可以假设它是不是某种简单的XOR或总和。

然后我试图CRC16的几个变化 ,但没有多少运气。

这个问题可能是对密码学比较偏,但我真的很感兴趣的任何容易理解的统计工具来找出CRC,这可能是。 我甚至可能会转向绘制不同的CRC算法 ,如果一切都失败了。

研究背景故事:我有某种校验的串行RFID协议。 我可以重播消息没有问题,并解释结果(不校验和检查),但由于设备将丢弃他们在地板上我不能发送修改的分组。

使用现有的软件,我可以改变RFID芯片的有效载荷。 不过,唯一的序列号是不变的,所以我没有检查每一个可能的组合能力。 Allthough我可以产生一个递增值转储,但不足以使穷举搜索适用于这个问题。

数据转储文件可如果问题本身是不够的:-)

需要参考文档? 无痛GUIDE TO CRC错误检测算法是伟大的参考,我问的问题在这里发现后。

最后,在接受的答案比它的CCITT非常有用的提示后,我用这个CRC计算器 ,和异或运算生成校验和与已知校验得到0xFFFF的这使我得出结论最终XOR是CCITT的0×0000的0xFFFF的instread。

Answer 1:

有许多的因素需要考虑的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也是在某些系统上使用。

在另一方面,如果这是超高频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

这里是你的答案!!!!

通过你的日志工作过,铁通是CCITT之一。 第一个字节0xd6被排除在CRC。



Answer 2:

你必须想尽一切可能的校验和算法,看看哪一个产生相同的结果。 但是,也不能保证被列入校验哪些内容。 例如,一些算法跳过空格,这导致不同的结果。

我真的不明白为什么有人想要知道,虽然。



Answer 3:

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

ECC代码往往是他们保护原始数据的大小的相当大的一部分,这取决于他们要处理的错误率。 如果邮件的大小大于约16字节以上,2个字节的ECC也不足以是有益的。 因此,如果消息是大,你最有可能正确,其某种的CRC。



Answer 4:

我想在这里破解一个类似的问题,我发现了一个漂亮整洁的网站,将在它的文件并运行校验和与47分不同的算法和显示结果。 如果用来计算校验和的算法是任何这些算法,你只会发现它有一个简单的文本搜索所产生的检查和列表中。

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



文章来源: How could I guess a checksum algorithm?
标签: checksum crc