数据列 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 2024-05-13 14:31:10 +08:00 首先,楼主发现的三件事情是同一件事情……
假设 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)是怎么观察出的,有什么思路和技巧吗 |