数据列 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 |
1
geelaw 223 天前 1
首先,楼主发现的三件事情是同一件事情……
假设 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 表示高、低二位。 |
2
liemehoc OP @geelaw 感谢大佬光速回复
想请教下(data ^ checksum2).high = (data.high | data.low)是怎么观察出的,有什么思路和技巧吗 |