从CRC16和数据集逆向工程CRC16算法

时间:2014-10-02 13:42:40

标签: embedded reverse-engineering crc

我正在使用一个记录不完整的系统,在我需要修改的结构中需要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

2 个答案:

答案 0 :(得分: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 - 不要从这篇文章中复制和粘贴)。

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

Screenshot of www.zorc.breitbandkatze.de/crc.html 设置如下:

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

答案 1 :(得分:0)

事实证明我得到了嵌入式芯片制造商的回复。

The code links here

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