V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
liemehoc
V2EX  ›  问与答

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

  •  
  •   liemehoc · 171 天前 · 610 次点击
    这是一个创建于 171 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    已发现:

    • data 与 checksum1 按位异或后为 checksum2 的低字节位(见 data^checksum1 列)
    • data 与 checksum2 按位异或后为 checksum1 的低字节位(见 data^checksum2 列)
    • checksum1 与 checksum2 按位异或后为 data 的低字节位
    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
    4 条回复    2024-05-13 17:31:30 +08:00
    geelaw
        1
    geelaw  
       171 天前   ❤️ 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 表示高、低二位。
    liemehoc
        2
    liemehoc  
    OP
       171 天前
    @geelaw 感谢大佬光速回复
    想请教下(data ^ checksum2).high = (data.high | data.low)是怎么观察出的,有什么思路和技巧吗
    geelaw
        3
    geelaw  
       171 天前 via iPhone   ❤️ 1
    @liemehoc #2 首先的猜想是

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

    然后观察数据

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

    想出候选之后验算一下。
    liemehoc
        4
    liemehoc  
    OP
       171 天前
    @geelaw 再次感谢,思路非常清晰
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3904 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:58 · PVG 08:58 · LAX 17:58 · JFK 20:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.