我有一个二进制字符串(如下面的十六进制所示),我正在使用CRC-16-CCITT。我希望我的所有CRC都达到设定值0x1D0F。我知道可以通过将2个字节附加到原始消息的末尾来使CRC与此值匹配,但我不确定如何找出附加值需要的内容。
实施例。
0x01 0000 0000 0000 0000 0000 0000 0000 0000 13D8
附加值是0x13D8
通过将13D8添加到消息上,CRC为我提供了所需的0x1D0F。
非常感谢任何有关如何计算此0x13D8值的帮助。
如果它可以在代码中巧妙地完成,那就是奖金!
答案 0 :(得分:3)
理论很简单,但当然需要注意正确实施。
您可以在消息中的任何位置选择任意16位(包括末尾的两个字节或散布的16个单独位)。将 xi 称为 i = 0..15 。然后使用逐位CRC算法处理消息,但生成并更新 xi 中16个线性方程的系数,表示crc的16位。
然后你有一个简单的矩阵方程 Ax + b = c 。 Ax + b = c 的操作不是通常的乘法和加法,而是单位和以及异或 - 操作。< / p>
现在你使用通常的方法来反转矩阵 A ,这实际上更容易用和和 xor (现在加法和减法)两者都是同一个东西,只是异或 - ,计算 b ^ c 并将其乘以逆。现在,您可以将值放入 xi 位以获得所需的crc。
另一个简化是您不需要实际消息,只需要 xi 的长度和位置,然后执行上述操作,并将消息的所有其他位设置为零。这是因为如果你有两条相同长度的消息 P 和 Q ,那么 crc(P)^ crc(Q)= crc(P ^ Q) 。 (这适用于核心crc算法,忽略了crc的前后处理。)
<强>更新强>
您可以下载spoof.c,它解决了修改消息以生成特定CRC的问题。