棘手的CRC算法

3

我正在尝试找到与以下结果配合使用的crc。字节字符串由2个字节组成(即0xCE1E),而crc是单个字节(即0x03)。

字节 crc
CE1E 03
CE20 45
CE22 6F
0000 C0
0001 D4
FFFF 95

有人能帮忙吗?


你的输入字符串看起来更像是2字节字符串,即16位。如果不是这种情况,你应该用空格和(也许)缺失的零来编写它们,例如0C 0E 01 0E -> 03。 - unwind
你只有线路数据,没有可逆工程的可执行文件吗? - activout.se
4个回答

4

首先,4个十六进制位不是4个字节。由于您的所有示例都显示4个十六进制位(2个字节),因此我假设您指的是2个字节。

哈希值只有65,536种不同的值,以下是您需要执行的操作。

对0000到FFFF的所有65,536个值执行哈希函数。列出结果。那张表就是函数。它将输入值映射到输出值。

虽然较为简单,但它始终正确,不是非常大(65K字节),在完成计算后非常快速。

您不能很容易地反向工程哈希函数。好的哈希函数是使用所有输入比特以某种“公平”的方式的复杂状态机,因此仅相差几个比特的输入值的输出值明显不同。

如果将0000与0001、0002、0004、0008、0010、0020、0040、0080、0100、0200、0400、0800、1000、2000、4000和8000进行比较,您可能能够弄清楚每个位对哈希的贡献。但我觉得不太可能。


2
假设它们是两个字节(16位)的值,我已经在一些在线CRC生成器上尝试了一些,但没有得到你的结果。因此看起来它不是一个常用的CRC算法。
你有关于可能算法的线索吗?还是这是一项作业任务,你需要反向工程CRC算法/参数?
总结:需要更多信息。

嗨, 除了它提供一个8位结果(crc或校验和?)和来自一个小发射器PCB,像达拉斯1线协议一样传输数据,我没有任何线索。 数据的格式为:0C 0E 01 0E 03,其中前四个字节是数据,最后一个字节是crc(或校验和)。 - andrewo

2

CRC是一种简单的除法,就像你在小学学习长除法一样,只不过加减被替换成了异或。因此,您需要在GF(2)中解决以下方程:

CE1E % p = 03
CE20 % p = 45
CE22 % p = 6F
0000 % p = C0
0001 % p = D4
FFFF % p = 95

没有多项式p满足0000%p = c0。(对于所有值的p,模数为0的结果都是0。) 所以也许是(x+input) % p = crc。在你的情况下,x必须是c0。如果这是真的,那么(x+0001)%p必须是c1。看起来根本不是CRC。如果你决心并且相信答案是线性的,请制作一个可逆的零和一的矩阵,并解决由矩阵乘以输入得到的方程组。你需要更多的输入。


0

http://www.geocities.com/SiliconValley/Pines/8659/crc.htm#r2

以我的经验有限来看,您需要实现一个通用的循环冗余校验算法,并尝试使用几个多项式进行测试(首先尝试该文章中提到的“流行”多项式)。

编辑:进一步阅读后,似乎您还需要考虑反向多项式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接