[求助]分析猜测某校验算法

198 天前
 liemehoc

数据列 data 有 checksum1 、checksum2 两个校验值,需要分析猜测从 data 生成 checksum1 、checksum2 的算法。

已发现:

data checksum1 checksum2 data^checksum1 data^checksum2
0000 0000 0000 0000 0000
0005 0005 0500 0000 0505
000A 000A 0A00 0000 0a0a
0014 0014 1400 0000 1414
0028 0028 2800 0000 2828
0032 0032 3200 0000 3232
0037 0037 3700 0000 3737
003C 003C 3C00 0000 3c3c
0041 0041 4100 0000 4141
0046 0046 4600 0000 4646
004B 004B 4B00 0000 4b4b
0050 0050 5000 0000 5050
0055 0055 5500 0000 5555
005A 005A 5A00 0000 5a5a
005F 005F 5F00 0000 5f5f
0064 0064 6400 0000 6464
0069 0069 6900 0000 6969
006E 006E 6E00 0000 6e6e
007D 007D 7D00 0000 7d7d
0082 0082 8200 0000 8282
0087 0087 8700 0000 8787
008C 008C 8C00 0000 8c8c
0091 0091 9100 0000 9191
0096 0096 9600 0000 9696
009B 009B 9B00 0000 9b9b
00FF 00FF FF00 0000 ffff
0230 0032 3002 0202 3232
023A 023A 3800 0000 3a3a
023F 023F 3D00 0000 3f3f
0244 0046 4402 0202 4646
0249 004B 4902 0202 4b4b
0253 0253 5100 0000 5353
0258 005A 5802 0202 5a5a
025D 005F 5D02 0202 5f5f
0262 0262 6000 0000 6262
0267 0267 6500 0000 6767
026C 006E 6C02 0202 6e6e
0276 0276 7400 0000 7676
027B 027B 7900 0000 7b7b
0280 0082 8002 0202 8282
028A 028A 8800 0000 8a8a
0294 0096 9402 0202 9696
0320 0023 2003 0303 2323
03e8 00eb e803 0303 ebeb
07d0 00d7 d007 0707 d7d7
1388 009b 8813 1313 9b9b
2710 0037 1027 2727 3737
4ddd 4ddd 9000 0000 dddd
4ddf 4ddf 9200 0000 dfdf
4ded 4ded a000 0000 eded
4DEE 4CEF A201 0101 efef
4def 4def a200 0000 efef
4DF1 41FD B00C 0c0c fdfd
4DF2 40FF B20D 0d0d ffff
4DF3 41FF B20C 0c0c ffff
4DF6 44FF B209 0909 ffff
4DF7 45FF B208 0808 ffff
4DF8 48FD B005 0505 fdfd
4DFB 49FF B204 0404 ffff
4DFC 4CFD B001 0101 fdfd
4DFD 4DFD B000 0000 fdfd
4e00 004e 004e 4e4e 4e4e
4e01 004f 014e 4e4e 4f4f
4E02 024E 004C 4c4c 4e4e
4E06 064E 0048 4848 4e4e
4E07 064F 0148 4848 4f4f
4E0B 0A4F 0144 4444 4f4f
4E0C 0C4E 0042 4242 4e4e
4e10 005e 104e 4e4e 5e5e
4e11 005f 114e 4e4e 5f5f
4e16 4e16 5800 0000 1616
4e17 4e17 5900 0000 1717
4E1B 0A5F 1144 4444 5f5f
4E1C 0C5E 1042 4242 5e5e
4e20 006e 204e 4e4e 6e6e
4e21 006f 214e 4e4e 6f6f
ffff ffff 0000 0000 ffff
634 次点击
所在节点    问与答
4 条回复
geelaw
198 天前
首先,楼主发现的三件事情是同一件事情……

假设 data 、checksum1 、checksum2 永远是 4 位十六进制数,那么观察可以发现

[1] (data ^ checksum2).low = (data ^ checksum2).high = (data.high | data.low)
[2] checksum1.low = (data ^ checksum2).low
[3] (data ^ checksum1).low = (data ^ checksum1).high

于是计算方法是

checksum2
= data ^ (data ^ checksum2)
= data ^ ((data.high | data.low) * 0x0101)

checksum1
= data ^ (data ^ checksum1)
= data ^ ((data.low ^ checksum1.low) * 0x0101)
= data ^ (checksum2.low * 0x0101)

其中 high/low 表示高、低二位。
liemehoc
198 天前
@geelaw 感谢大佬光速回复
想请教下(data ^ checksum2).high = (data.high | data.low)是怎么观察出的,有什么思路和技巧吗
geelaw
198 天前
@liemehoc #2 首先的猜想是

1. 校验数据应该和数据整体有关系

然后观察数据

2. 高位是 00 时值为低位(表达简单的候选:加法、异或、或)
3. 高位是 0? 时最高位匹配(不能是加法,因为不进位)
4. FFFF 的结果是 FF (不能是异或)

想出候选之后验算一下。
liemehoc
198 天前
@geelaw 再次感谢,思路非常清晰

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1040244

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX