1

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

前任。

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

附加值为 0x13D8

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

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

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

4

1 回答 1

3

理论很简单,但是正确实施当然需要一些小心。

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

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

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

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

更新:

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

于 2012-07-25T16:13:09.783 回答