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

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

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

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

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

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

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

需要参考文档吗? CRC 错误检测算法的轻松指南 这是我在这里提出问题后发现的很好的参考。

最后,在接受的答案比CCITT非常有帮助的提示之后,我使用这个 CRC 计算器, ,并用已知的校验和进行异或生成校验和以获得 0xffff,这使我得出结论,最终的异或是 0xffff 而不是 CCITT 的 0x0000。

有帮助吗?

解决方案

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 之外。

其他提示

您必须尝试每一种可能的校验和算法,看看哪一种会产生相同的结果。但是,无法保证校验和中包含哪些内容。例如,某些算法会跳过空格,从而导致不同的结果。

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

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

ECC 代码通常占其保护的原始数据大小的很大一部分,具体取决于它们要处理的错误率。如果消息的大小超过 16 字节,则 2 字节的 ECC 不足以发挥作用。因此,如果消息很大,您很可能认为它是某种 CRC。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top