【问题标题】:Matching a CRC code by appending to message通过附加到消息来匹配 CRC 码
【发布时间】:2012-07-24 01:17:33
【问题描述】:

我有一个二进制字符串(如下面的十六进制所示)并且正在使用 CRC-16-CCITT。我希望我所有的 CRC 都达到一个设定值 0x1D0F。我知道可以通过将 2 个字节附加到原始消息的末尾来使 CRC 匹配此值,但我不确定如何找出附加值需要是什么。

例如。

0x01 0000 0000 0000 0000 0000 0000 0000 0000 13D8

附加值为0x13D8

通过将此 13D8 添加到消息中,CRC 为我提供了所需的 0x1D0F。

任何有关如何计算此 0x13D8 值的帮助将不胜感激。

如果它可以在代码中巧妙地完成,那将是一个奖励!

【问题讨论】:

  • 如果你想不出来,至少你最多只需要尝试 2^16 个值就可以得到正确的值。
  • 维基百科的CRC文章链接到Reversing CRC – Theory and Practice,说The presented methods offer a very easy and efficient way to modify your data so that it will compute to a CRC you want or at least know in advance. This is not a very difficult task, as CRC is not a cryptographical hash algorithm [...] So you should never consider the CRC as some kind of message authentication code [...] – it can easily be forged.
  • 为什么需要一个固定的 CRC 值?只是好奇这里的用例是什么,似乎你正在做一些比它需要的更复杂的事情。这是一个家庭作业吗?

标签: binary embedded checksum crc error-detection


【解决方案1】:

理论很简单,但正确实施当然需要注意。

您可以选择消息中任意位置的任何 16 位(包括末尾的两个字节或分散在任意位置的 16 个单独的位)未定义。 i = 0..15 称它们为 xi。然后使用逐位CRC算法对报文进行处理,但是生成并更新xi中16个线性方程的系数,代表CRC的16位。

然后你有一个简单的矩阵方程Ax + b = cAx + b = c 的运算不是通常的乘法和加法,而是一位 andexclusive-or 运算。

现在你使用通常的方法来反转矩阵A,实际上使用andxor更容易(现在加法和减法两者相同,只是异或),计算 b ^ c 并将其乘以逆。现在您可以将值放入 xi 位以获得所需的 crc。

另一个简化是您不需要实际的消息,只需要 xi 的长度和位置,然后在消息的所有其他位设置为零的情况下执行上述操作.这是因为如果你有两条长度相同的消息PQ,那么crc(P) ^ crc(Q) = crc(P ^ Q) 。 (这适用于核心crc算法,忽略crc的预处理和后处理。)

更新:

您可以下载spoof.c,它解决了修改消息以产生特定CRC的问题。

【讨论】:

    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 2019-07-06
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多