【问题标题】:Reverse engineering CRC16 algorithm from CRC16 and data set从 CRC16 和数据集逆向工程 CRC16 算法
【发布时间】:2014-11-27 12:32:47
【问题描述】:

我正在使用一个文档记录不完善的系统,其中我需要修改的结构中需要 CRC16。 除非我提供正确的校验和,否则修改不会生效。

技术支持表明他们使用的是标准 CRC16,但使用 CRC16 CCITT 不会给我结果。

我有一小段数据和它应该有的校验和。

有人可以帮我找到与我的数据集匹配的正确 CRC16 参数(多项式、初始值)吗?

另一件事。在有问题的平台上,每个地址用 16 位字来组织地址,所以我尝试了原始字节顺序和反转字节顺序。

Data Set #  1
crc         0xb19f
data @b306: 7a b1 74 44 9f 84 74 5b  
length      8 bytes

Data Set # 2
crc        0x447b
data @0036 00 43 e2 05 5b 03 00 02 00 16 00 00 00 00 00 00
           00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           12 c0 00 00 00 07 f7 ff 3f e5 ff ff 3f ff 75 30
           3a 98 00 01 00 9d 00 0f 00 09 00 0a 00 00 00 00
           00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           00 00 00 00 00 00 00 00 00 00 00 00 00 0a 80 0f
           47 44 09 6d 0a 35 09 c4 f0 00 00 40 10 00 00 01
           07 d0 27 10 00 00 ff 38 00 5a ff 06 0a fd 00 05
length     128 bytes

知道我现在所知道的,当我选择不提供太多技术支持的组织时,我选择了糟糕的选择,我现在知道了。

[编辑:] 处理器是〜8051,但不确定字节顺序。我的测试代码理所当然地测试了这两种字节序。

[编辑:] 我发现这个其他问题很有帮助: CRC16 and data communications

【问题讨论】:

  • 首先,CRC16 与 CRC16 CCITT 不同 - 那么您为什么希望它能够工作呢?其次,this page 表示损坏的实现很常见,因此您可能希望从找到的任何正确实现中找到一两个产生不同结果的结果,并查看它们中的任何一个是否与您的产品使用的相匹配。第三,为什么要使用 [c++]、[c] 和 [embedded] 标签? -1 不诚实地吸引观众!
  • @Tony D,对 C++ 和 C 标签感到抱歉,我删除了它们。至于嵌入式,这是一个诚实的嵌入式平台,我不能说出它的名字,因为我害怕因为提供如此糟糕的支持而羞辱他们。
  • @Bamaco:我的 -1 消失了(虽然嵌入可能是真的,但表面上与所提出的问题无关),但如果他们在整个软件中广泛使用这种 CRC 方法,命名它们可能成为获得实际经验和帮助的最实用的方式......
  • @Bamaco 是的 - 我对你有感觉 - 情况很糟糕。最终可能不得不以某种方式从他们那里“社会工程”出精确的 CRC 代码/算法......祝你好运!
  • 尝试将您的数据输入到在线 CRC 计算器中,例如 this one。如果您可以将格式正确的数据剪切并粘贴到该字段中,那么它将自动计算各种 CRC 算法。

标签: embedded reverse-engineering crc


【解决方案1】:

您自己的答案中链接的代码似乎有很多不相关的代码,但是 16 位 CRC 函数提到了两个多项式:

x^16+x^5+x^2+1.
x^16+x^12+x^5+1

但是提到这些的评论表明作者没有意识到一个只是另一个的反向版本,这可能是文档混淆的原因。无论哪种方式,它都是 CRC-16-CCITT 多项式(用于 X.25、V.41、HDLC、XMODEM、蓝牙、SD 等;称为 CRC-CCITT)。这并不是说它当然是正确实现的,或者评论甚至是正确的。

它看起来像是来自多个来源的参差不齐的代码集合。您不得不怀疑供应商依赖于未知来源和明显混淆的代码和算法!

顺便提一下,同一代码中的 32 位 CRC 使用 CRC-32 多项式(如 ISO 3309、ANSI X3.66、FIPS PUB 71、FED-STD-1003、ITU-T V.42、以太网、 SATA、MPEG-2、Gzip、PKZIP、POSIX cksum、PNG、ZMODEM)。


后期编辑:

我找到了它,使用这个网站:http://www.zorc.breitbandkatze.de/crc.html 并进行了大量的试验和错误。不幸的是,该站点以 ASCII 格式获取数据,因此我使用 http://www.rapidtables.com/convert/number/hex-to-ascii.htm 将 8 字节样本转换为文本(生成“z±tDt[” - 请注意,该字符串包含一些非打印字符,但从站点复制并粘贴它们似乎包括它们,因为它报告 8 个字节,而这里的字符串是 6 - 不要从这篇文章复制和粘贴)。

产生数据样本中给出的结果的任何配置如下:

设置如下:

  • 点击CRC-CCITT,
  • 将“初始值”设置为FFFF,单击“转换!” (转换为 84CF 值的“非直接”),
  • 将“最终异或”设置为 FFFF,
  • 检查“反向数据字节”,
  • 以 ASCII 格式输入数据,
  • 点击“计算!”按钮。

【讨论】:

  • 您的屏幕截图显示初始值为 0x84CF,但下面的文本显示为 0xFFFF。
  • @Bamaco :按照步骤操作。我通过选择 CRC-CCITT 到达 84CF,它将字段设置为 FFFF,转换后变为 84CF。重点是表明价值是如何得出的——不是魔术!它可能不是最直观的界面,但它提供了比我发现的任何其他在线 CRC 工具更多的选项。要查看所有控件的实际作用,您可以查看 Java 脚本,该站点有一个指向支持所有相同选项的 C 代码的链接。
【解决方案2】:

原来我收到了嵌入式芯片厂商的回复。

The code links here

在我看来不像标准的 CRC16,reveng 无法确定正在使用的 CRC 算法我并不感到惊讶。

【讨论】:

  • 感谢@Ross,我已经编辑了无用的答案并将其替换为实际答案。
猜你喜欢
  • 2015-06-23
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 2012-05-20
相关资源
最近更新 更多