【问题标题】:tricky crc algorithm棘手的CRC算法
【发布时间】:2008-11-12 10:39:31
【问题描述】:

我正在尝试找到适用于以下结果的 crc。字节串由2个字节组成(即0xCE1E),crc为单字节(即0x03)

字节CRC CE1E 03 CE20 45 CE22 6F 0000 C0 0001 D4 FFFF 95

谁能帮忙?

【问题讨论】:

  • 您的输入字符串在我看来更像是 2 字节字符串,即 16 位。如果不是这种情况,你应该用空格和(也许)缺少的零来写它们,例如0C 0E 01 0E -> 03.
  • 你只有有线数据,没有可以逆向工程的可执行文件吗?

标签: crc


【解决方案1】:

首先,4 个十六进制数字不是 4 个字节。由于您的所有示例都显示 4 个十六进制数字 - 2 个字节 - 我假设您的意思是 2 个字节。

只有 65,536 个不同的哈希值,这就是你要做的。

对从 0000 到 FFFF 的所有 65,536 个值执行散列函数。将结果制成表格。该表是的功能。它将输入值映射到输出值。

虽然很蹩脚,但它总是正确的,它不是特别大(65K 字节),而且在你完成计算后它真的很快。

你不能很容易地对哈希函数进行逆向工程。好的状态机是复杂的状态机,它以某种“公平”的方式使用所有输入位,因此对于仅相差几位的输入值,输出值会有很大的不同。

如果您将 0000 与 0001、0002、0004、0008、0010、0020、0040、0080、0100、0200、0400、0800、1000、2000、4000 和 8000 进行比较,您或许能够找出每个位的含义有助于散列。但我对此表示怀疑。

【讨论】:

    【解决方案2】:

    假设它们是两个字节(16 位)的值,我在一些在线 CRC 生成器上尝试了一些,但没有得到你的结果。所以看起来不是常用的CRC算法。

    您对可能的算法有任何线索吗?或者这是一个家庭作业,你应该对 CRC 算法/参数进行逆向工程?

    总结:需要更多信息。

    【讨论】:

    • 嗨,我没有任何线索,只是它给出了一个 8 位结果(crc 或校验和?),它来自一个小型发射器 pcb,它像 dallas 1-wire 协议一样传输数据。数据格式为:0C 0E 01 0E 03 其中前四个字节是数据,最后一个字节是 crc(或校验和)。
    【解决方案3】:

    CRC 是简单的除法,就像您在小学学习长手除法一样,只是加减法被替换为 XOR。所以你需要做的是求解GF(2)中的以下方程:

    CE1E % p = 03
    CE20 % p = 45
    CE22 % p = 6F
    0000 % p = C0
    0001 % p = D4
    FFFF % p = 95
    

    不存在 0000%p = c0 的多项式 p。 (对于 p 的所有值,0 模 p 为 0。)所以也许它是 (x+input) % p = crc。在您的情况下,x 必须是 c0。如果这是真的,那么 (x+0001)%p 必须是 c1。看起来它根本不是CRC。如果您确定并且相信答案是线性的,请制作一个由 0 和 1 组成的可逆矩阵,并求解由矩阵乘以输入 = 输出得出的方程组。不过,您需要更多输入。

    【讨论】:

      【解决方案4】:

      http://www.geocities.com/SiliconValley/Pines/8659/crc.htm#r2

      在我没有经验的眼里,你必须实现一个通用的 crc 算法并用几个 polys 进行尝试(首先尝试那篇文章中提到的“流行”算法)。

      edit:进一步阅读后,您似乎也必须考虑反向多边形。

      【讨论】:

        猜你喜欢
        • 2011-05-01
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 2014-10-04
        • 1970-01-01
        • 2016-11-06
        • 2015-03-12
        相关资源
        最近更新 更多