2026/10/29 11:04:15

CTF学习/crypto/曼彻斯特编码与差分曼彻斯特

CTF学习/crypto/曼彻斯特编码与差分曼彻斯特 曼彻斯特编码与差分曼彻斯特考点概念曼彻斯特编码相位编码是数字通信的线路编码每个比特用一个码片表示码片中间有电平跳变用上升沿/下降沿的位置区分 0 和 1常见约定01 表示 010 表示 1或相反。它自带时钟信息无需同步信号用于以太网等。差分曼彻斯特码片内仍有跳变但信息由码片起始处是否有跳变携带约定位开始翻转0不翻转1或相反。曼彻斯特以 hex 串或 01 序列形式给出常伴随波形、线路编码、Manchester提示。解题即把波形/二进制串按码片长度切分查约定上升沿/下降沿对应还原比特流再按 ASCII 分组。曼彻斯特运算规则每个比特占一个码片码片时长为一个位周期码片中点必发生一次电平跳变跳变方向携带信息。按托马斯约定 0 编为 01前半低电平后半高电平1 编为 10前半高后半低以太网 IEEE 802.3 约定与此相反解题时两种字典都要试。解码把密文位流两位一组切分01 译 0、10 译 1出现 00 或 11 即不是合法曼彻斯特码。差分曼彻斯特运算规则每码片中点仍有跳变用作同步信息不在码片内而在码片起始处判据是该码片起始电平相对前一码片结束电平是否发生跳变。按本节约定位开始翻转记 0、不翻转记 1反约定同样存在。编码端维护上一码片的结束电平逐位决定本码片起始电平随后强制中点翻转解码端逐片比较首电平与前片尾电平直接读出比特。以比特串 1011 完整演算两种编码。曼彻斯特取 0 对应 01、1 对应 10第一比特 1 得码片 10第二比特 0 得码片 01第三比特 1 得码片 10第四比特 1 得码片 10波形串接为 10 01 10 10即位串 10011010。解码回代切成 10、01、10、10查字典得 1、0、1、1还原 1011。差分曼彻斯特取位开始翻转记 0设前导电平为 0第一比特 1 不翻转起始电平 0中点跳到 1码片为 01结束电平 1第二比特 0 翻转起始电平从 1 跳到 0中点再跳到 1码片为 01结束电平 1第三比特 1 不翻转起始电平 1中点跳到 0码片为 10结束电平 0第四比特 1 不翻转起始电平 0中点跳到 1码片为 01结束电平 1波形串接为 01 01 10 01即位串 01011001。解码回代各码片首电平相对前片尾电平依次为相同、不同、相同、相同读出 1、0、1、1还原 1011。两种编码的合法码片中点全有跳变绝不会出现连续两个相同电平的码片识别特征序列特征01/10 交替出现、无连续 00 或 11 的码串曼彻斯特码片内必有跳变。 文件形式txt 中一段 hex如 5555555595555A... 之类或波形图Audacity 打开规律方波。 提示语题名/描述出现曼联、曼彻斯特、传感器、以太网、相位。 其它线路编码对照NRZ 高1 低0NRZI 电平翻转1 不变0均无码片内跳变约束。靶场题目传感器BUUCTF 传感器 1攻防世界 传感器 2攻防世界 robomunicationBUUCTFWriteup题目传感器BUUCTF 识别提示曼联即曼彻斯特联足球俱乐部索引到曼彻斯特编码密文 hex 只含 5、6、9、A 四种字符对应 0101、0110、1001、1010 四种 4 位模式每种都是两个合法码片的组合符合曼彻斯特码流按半字节记录的特征。解题每个 hex 字符转 4 位二进制并补齐前导零按 0101 折 11、0110 折 10、1010 折 00、1001 折 01 的规则压缩为半长位流题目另声明八位倒序传输协议把每 8 位逆序后拼字节得到完整报文 FFFFFED31F645055F9脚本s 5555555595555A65556AA696AA6666666955 FOLD {0101: 11, 0110: 10, 1010: 00, 1001: 01} s1, msg , for c in s: s1 FOLD[format(int(c, 16), 04b)] if len(s1) 8: msg format(int(s1[::-1], 2), 02X) s1 print(flag{%s} % msg) assert msg FFFFFED31F645055F9题目传感器 1攻防世界 识别传感器报文族再加已知 ID 可比对校验本组为差分曼彻斯特编码整串 hex 转位流后按码片切分比对首电平与前片尾电平即可解码密文含 3、E 等非 569A 字符是差分形式解题两条报文都做差分曼彻斯特解码前导电平取 0逐片比较第一条得字节流 B0 02 4D 88 93 CA 58 41 81即同步头 B0 后的报文结构 0024D 前缀、ID 8893CA58、类型 41、校验位 81与题给 ID 对上第二条解码得 B0 02 4D 88 45 AB F3 41 19读出 ID 为 8845ABF3脚本def diff_manchester_decode(hexs: str) - str: bits format(int(hexs, 16), 0%db % (len(hexs) * 4)) out, prev_end , 0 for i in range(0, len(bits), 2): chip bits[i:i 2] out 1 if chip[0] prev_end else 0 prev_end chip[1] return out ​ for name, hx in [(known, 3EAAAAA56A69AA55A95995A569AA95565556), (target, 3EAAAAA56A69AA556A965A5999596AA95656)]: b diff_manchester_decode(hx) print(name, .join(%02X % int(b[i:i 8], 2) for i in range(0, len(b), 8)))题目传感器 2攻防世界 识别解码现有报文后结构为 0024D、ID、41、校验位校验位恒 8 位推测是 CRC 类校验解题先把两条已知报文差分解码得到样本对02 4D 8893CA58 41 对应校验 8102 4D 8845ABF3 41 对应校验 19。再以两组样本对全参数暴力匹配 CRC8多项式 0 到 255初值两档输入输出反射各两档唯一命中标准 CRC-8多项式 0x07初值 0x00输入输出均不反转输入为去掉同步字节 B0 与校验字节的报文体。按结构重组 02 4D DEADBEEF 41 与 02 4D BAADA555 41 分别计算校验位分别为 B5 与 15脚本def crc8(data: bytes, poly: int, init: int, refin: bool, refout: bool) - int: crc init for b in data: if refin: b int(format(b, 08b)[::-1], 2) crc ^ b for _ in range(8): crc ((crc 1) ^ poly) 0xFF if crc 0x80 else (crc 1) 0xFF if refout: crc int(format(crc, 08b)[::-1], 2) return crc ​ samples [(bytes.fromhex(024D8893CA58 41.replace( , )), 0x81), (bytes.fromhex(024D8845ABF3 41.replace( , )), 0x19)] hit None for poly in range(256): for init in (0x00, 0xFF): for refin in (False, True): for refout in (False, True): if all(crc8(d, poly, init, refin, refout) c for d, c in samples): hit (poly, init, refin, refout) if hit is None: raise SystemExit(no CRC8 match) poly, init, refin, refout hit print(匹配参数: poly%s init%s refin%s refout%s % (hex(poly), hex(init), refin, refout)) for nid in (DEADBEEF, BAADA555): msg bytes.fromhex(024D nid 41) print(nid, -, format(crc8(msg, poly, init, refin, refout), 02X))题目robomunicationBUUCTF 识别播放或看波形整段只有两种时长规律的滴答声长短分别记 bi 与 bu是时域摩斯电码的典型节奏题名机器人通信也指向机器编码与曼彻斯特同属线路编码大类实际考点为音频摩斯。解题Audacity 打开逐段听写长的 bi 记为划、短的 bu 记为点整理出摩斯串解码得整句 hellowhatisthekeyitisboopbeep句尾明示 key 就在句内脚本MORSE { .-: A, -...: B, -.-.: C, -..: D, .: E, ..-.: F, --.: G, ....: H, ..: I, .---: J, -.-: K, .-..: L, --: M, -.: N, ---: O, .--.: P, --.-: Q, .-.: R, ...: S, -: T, ..-: U, ...-: V, .--: W, -..-: X, -.--: Y, --..: Z, } morse (.... . .-.. .-.. --- .-- .... .- - .. ... - .... . -.- . -.-- .. - .. ... -... --- --- .--. -... . . .--.) plain .join(MORSE[t] for t in morse.split()) print(plain, -, flag{%s} % plain[-8:]) assert plain HELLOWHATISTHEKEYITISBOOPBEEP assert plain[-8:] BOOPBEEP工具Audacity | Free, Open Source Audio Editor and Recorder脚本def manchester_encode(bits: str) - str: return .join(10 if b 1 else 01 for b in bits) ​ def manchester_decode(wave: str) - str: out [] for i in range(0, len(wave), 2): pair wave[i:i 2] if pair 10: out.append(1) elif pair 01: out.append(0) else: raise ValueError(非法码片: %r % pair) return .join(out) ​ def diff_manchester_encode(bits: str) - str: wave []; cur 0 for b in bits: if b 0: cur 1 if cur 0 else 0 wave.append(cur) wave.append(1 if cur 0 else 0) return .join(wave) ​ def diff_manchester_decode(wave: str) - str: bits []; prev 0 for i in range(0, len(wave), 2): start wave[i] bits.append(0 if start ! prev else 1) prev start return .join(bits) ​ text bflag{manchester_ok} bits .join(format(b, 08b) for b in text) cipher_hex hex(int(manchester_encode(bits), 2))[2:] wave bin(int(cipher_hex, 16))[2:].zfill(len(bits) * 2) flag bytes(int(manchester_decode(wave)[i:i 8], 2) for i in range(0, len(bits), 8)) print(曼彻斯特解码: %s % flag.decode()) assert flag text assert diff_manchester_decode(diff_manchester_encode(bits)) bits print(差分曼彻斯特自洽验证通过) print(SUCCESS: flag{manchester_ok})