我怎么能猜到校验和算法?
Posted
技术标签:
【中文标题】我怎么能猜到校验和算法?【英文标题】:How could I guess a checksum algorithm? 【发布时间】:2010-09-14 01:24:15 【问题描述】:假设我有一些最后带有 16 位校验和的数据包。我想猜一下使用的是哪种校验和算法。
首先,从转储数据中,我可以看到数据包有效负载中的一个字节变化完全改变了校验和,因此我可以假设它不是某种简单的异或或求和。
然后我尝试了several variations of CRC16,但运气不佳。
这个问题可能更偏向于密码学,但我真的对任何易于理解的统计工具感兴趣,以找出这可能是哪种 CRC。如果一切都失败了,我什至可能会求助于drawing different CRC algorithms。
背景故事:我有带有某种校验和的串行 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 插入。
【问题讨论】:
你能得到你想要的任何数据的校验和吗? 不,我不能。我可以使用与设备对话的现有应用程序更改部分数据并生成校验和,但这不是整个数据包。 CCITT 的标准指定了一个与 0x0000 的异或?这不是一直没有操作吗? 【参考方案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 也用于某些系统。
另一方面,如果这是 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 中排除。
【讨论】:
我的头发正在慢慢脱落(再次)。我尝试对我的数据使用 CCITT,但它对我不起作用。您能否在zorc.breitbandkatze.de/crc.html 或lammertbies.nl/comm/info/crc-calculation.html 上分享实现的sn-p 和/或复制CRC 忽略我,最终异或是 0xffff 而不是 0x0000 与 ccitt... 【参考方案2】:它可能不是 CRC,它可能是像 Reed-Solomon 这样的纠错码。
ECC 代码通常占它们保护的原始数据大小的很大一部分,具体取决于它们要处理的错误率。如果消息的大小超过 16 个字节,2 个字节的 ECC 就不够用了。因此,如果消息很大,您很可能是正确的,它是某种 CRC。
【讨论】:
是的,但是消息远低于 256 字节,并且校验和是在相当简单的硬件设备上检查的,所以我现在最好的猜测是它是某种 CRC。 确切地说,我最长的消息是 70 个字节。在长度之前的数据包中有一个洞,可能会将可能的长度扩展到一个字节以上,但我还没有看到任何超过 70 个字节的真实消息。【参考方案3】:我正在尝试解决一个类似的问题,我发现了一个非常简洁的网站,它将获取您的文件并使用 47 种不同的算法对其运行校验和并显示结果。如果用于计算校验和的算法是这些算法中的任何一种,您只需在通过简单文本搜索生成的校验和列表中找到它。
网站是https://defuse.ca/checksums.htm
【讨论】:
有一个可以走另一条路的,如果可能的话?【参考方案4】:您必须尝试所有可能的校验和算法,看看哪一个会产生相同的结果。但是,无法保证校验和中包含哪些内容。例如,一些算法会跳过空格,这会导致不同的结果。
我真的不明白为什么有人想知道这一点。
【讨论】:
我可以理解为什么有人会想要它——如果他们正在对文件格式进行逆向工程以生成这些文件。我已经做到了。 正确。我有带有某种校验和的串行 RFID 协议。我可以毫无问题地重播消息并解释结果(没有校验和检查),但我无法发送修改过的数据包,因为设备将它们丢弃在地板上。以上是关于我怎么能猜到校验和算法?的主要内容,如果未能解决你的问题,请参考以下文章
VS2022如何设置代码智能提示,写完一行,能猜到下行然后提示出来,一个Tab就把提示的这行代写全?