Binary 通过附加到消息来匹配CRC代码

Binary 通过附加到消息来匹配CRC代码,binary,embedded,checksum,crc,error-detection,Binary,Embedded,Checksum,Crc,Error Detection,我有一个二进制字符串(如下十六进制所示),正在使用CRC-16-CCITT。我希望我的所有CRC都达到一个设定值0x1D0F。我知道可以通过在原始消息的末尾追加2个字节来使CRC与此值匹配,但我不确定如何确定追加的值需要是什么 例如 0x01 0000 0000 13D8 附加值是0x13D8 通过将此13D8添加到消息中,CRC将为我提供所需的0x1D0F 对于如何计算该0x13D8值的任何帮助,我们将不胜感激 如果它可以在代码中整洁地完成,那将是一个额外的收获 理论非常简单,但当然要正确实施

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

例如

0x01 0000 0000 13D8

附加值是0x13D8

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

对于如何计算该0x13D8值的任何帮助,我们将不胜感激


如果它可以在代码中整洁地完成,那将是一个额外的收获

理论非常简单,但当然要正确实施需要一些注意

您可以在消息的任意位置选择未定义的16位(包括末尾的两个字节或分散在任意位置的16个独立位)。叫他们席,我0…15。然后使用逐位CRC算法对消息进行处理,生成和更新席上16个线性方程组的系数,表示CRC的16个比特。 然后得到一个简单的矩阵方程Ax+b=c。Ax+b=c的运算不是通常的乘法和加法,而是单位和异或运算

现在你可以使用通常的方法来求逆矩阵A,这实际上更容易使用and和xor(加法和减法现在都是一样的,只是异或),计算b^c,然后将其乘以逆矩阵。现在你有了值在席位中以获得所需的CRC。< /P>

一个额外的简化是,你不需要实际的消息,只需要席的长度和位置,然后将上面的所有其他的消息位都做为零。这是因为如果您有两条长度相同的消息P和Q,那么crc(P)^crc(Q)=crc(P^Q)。(这适用于核心crc算法,忽略crc的前后处理。)

更新:


您可以下载,这解决了修改消息以生成特定CRC的问题。

如果您无法找到它,至少您只需尝试最多2^16个值即可获得正确的值。Wikipedia的CRC文章链接到,所介绍的方法提供了一种非常简单有效的方法来修改数据,以便将其计算为您想要的或至少提前知道的CRC。这不是一个非常困难的任务,因为CRC不是一个密码散列算法[…]所以你不应该把CRC看作某种消息认证码……它很容易伪造。< /代码>你为什么想要一个固定的CRC值?只是好奇这里的用例是什么,似乎你正在使事情变得比需要的更复杂。这是家庭作业吗?