MSu*_*rum 24 hash checksum crc error-detection crc16
我有一个旧的,不再制造的带有串口的电子设备.我正在尝试对此设备中使用的数据包CRC /校验和/散列进行逆向工程.
任何有敏锐眼光,有敏锐数学技能的人都可以破解这个东西?
这是我到目前为止所知道的......
验证我的数据包样本观察到上述网络链接中概述的"叠加原则".这表明它们具有数学XOR关系.
开始感觉很好......但之后又难过了.无法确定CRC-16多项式.这些数据包哈希很可能不与CRC相关,而是一些家庭酿造方案.
通过Ross N. Williams阅读"CRC错误检测算法的无痛指南"
不幸的是,我无法访问任何设备源/二进制代码
还运行测试以查看是否使用了其他哈希,例如Fletcher的校验和
以下是我的数据包的各种样本.
0x47366B2EE00000000000751CEB5F3469543B585E2D
0x47366B2ED00000000000751CEB5F3469543B582A2C
0x47366B2EC80000000000751CEB5F3469543B580B2B
0x47366B2EC40000000000751CEB5F3469543B58BB2A
0x47366B2EC20040000000751CEB5F3469543B58DFE7
0x47366B2EC10000000000751CEB5F3469543B58A328
0x47366B2EC08000000000751CEB5F3469543B584127
0x47366B2EC04000000000751CEB5F3469543B588126
0x47366B2EC02000000000751CEB5F3469543B580525
0x47366B2EC01000000000751CEB5F3469543B580124
请注意以下有关这些数据包的信息......
(0X47)............................................... ......................(0x2D)
我不知道我的系统是大端还是小端,但是确定的字节是LSB优先的
请参阅数据包的0x47366B2E部分之后的数据字节.
只有模式我看到出现的是每个数据包上的最后一个字节递减一(2D,2C,...).(除了第5个数据包,我必须更改2位)
任何帮助表示赞赏!
如果它遵循简单的 XOR 关系 (checksum(A ^ B) == checksum(A) ^ checksum(B)) 那么就有一个简单的暴力解决方案!
插图。假设您有一个带有 K 位校验和的 1 字节值 - 其中 K 实际上并不重要,因此我们只需将校验和表示为 c(i)。
步骤1.实验:观察全零数据包的校验和c(-1)。
0b0000000 => c(-1)
Run Code Online (Sandbox Code Playgroud)
步骤 2. 实验:观察所有二进制序列的校验和 c(i),其中在位置i处有一个 1
0b00000001 => c(0)
0b00000010 => c(1)
0b00000100 => c(2)
0b00001000 => c(3)
0b00010000 => c(4)
0b00100000 => c(5)
0b01000000 => c(6)
0b10000000 => c(7)
Run Code Online (Sandbox Code Playgroud)
您观察到的校验和值形成了GF(2) 的线性基础,并且 XOR 关系现在允许您计算任何校验和。
现在,您可以通过将每个位位置的校验和加 1 来计算校验和,例如,假设您想要 0XF3 的校验和,其二进制为 0b11110011。自从
0b11110011 = (0) + 0x80 + 0x40 + 0x20 + 0x10 + 0x02 + 0x01
Run Code Online (Sandbox Code Playgroud)
然后通过异或关系,
checksum(0b11110011) = c(7) + c(6) + c(5) + c(4) + c(1) + c(0) + c(-1)
Run Code Online (Sandbox Code Playgroud)
即对于要输出的每一位,只需异或累加该位的已知校验和。
如果您进行此练习并通过实验写出基础向量的所有 152 个校验和,您可能还会在此过程中发现一个简单的模式,该模式解释了校验和如何来自基础向量。:) 如果是的话,最好将其发布回此处!(也许可以告诉我们我们正在逆转什么?)