我有一个二进制字符串(在下面的十六进制中显示),我正在使用CRC-16-CCITT。我希望我的所有CRC都能出现在一个设置值0x1d0f。我知道可以使CRCS通过在原始信息的结束时附加2个字节,但我不确定如何找出所需的值是什么。

前。

0×010000 0000 0000 00000000 0000 0000 000013D8

附加值是0x13d8

通过将此13d8添加到消息上,CRC给了我所需的0x1d0f。

如何计算如何计算这个0x13d8值。

如果它可以整齐地在代码中完成,那么奖金!

有帮助吗?

解决方案

理论很简单,但当然它需要一些谨慎实施。

您可以在消息中的任何位置(包括末端的两个字节或在您喜欢的地方分散的两个字节)中选择任何16位,或者在您喜欢的任何位置)未定义。调用它们 xi for i= 0..15 。然后使用比特逐个CRC算法来处理消息,但是在 xi 中生成和更新16个线性方程的系数,表示CRC的16位。

然后有一个简单的矩阵方程 ax + b= c AX + B= C 的操作不是通常的乘法和添加,而是单位以及独占或操作。< / p> 现在,您使用常用方法反转矩阵 a ,其实际上更容易与 xor (现在添加和减法两者都是相同的,只是独占或者),计算 b ^ c 并将其乘以反向。现在,您有值放入 x / em>位以获得所需的CRC。

额外的简化是您不需要实际消息,只是 xi 的长度和位置,然后使用设置为零的消息的所有其他比特。这是因为如果您有两条消息 P 和相同长度的 Q ,则 CRC(P)^ CRC(Q)= CRC(P ^ Q) 。 (这适用于核心CRC算法,忽略CRC的预先处理和后处理。)

更新:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top