#!/usr/bin/env python3 # -*- coding:utf-8 -*- table = [] table_reverse = [] def init_tables(poly, reverse=True): global table, table_reverse table = [] # build CRC32 table for i in range(256): for j in range(8): if i & 1: i >>= 1 i ^= poly else: i >>= 1 table.append(i) assert len(table) == 256, "table is wrong size" # build reverse table if reverse: table_reverse = [] found_none = set() found_multiple = set() for i in range(256): found = [] for j in range(256): if table[j] >> 24 == i: found.append(j) table_reverse.append(tuple(found)) if not found: found_none.add(i) elif len(found) > 1: found_multiple.add(i) assert len(table_reverse) == 256, "reverse table is wrong size" if found_multiple: out('WARNING: Multiple table entries have an MSB in {0}'.format( rangess(found_multiple))) if found_none: out('ERROR: no MSB in the table equals bytes in {0}'.format( rangess(found_none))) def findReverse(desired): solutions = set() accum = ~0 stack = [(~desired,)] while stack: node = stack.pop() for j in table_reverse[(node[0] >> 24) & 0xFF]: if len(node) == 4: a = accum data = [] node = node[1:] + (j,) for i in range(3, -1, -1): data.append((a ^ node[i]) & 0xFF) a >>= 8 a ^= table[node[i]] solutions.add(tuple(data)) else: stack.append(((node[0] ^ table[j]) << 8,) + node[1:] + (j,)) return solutions def solve(wanted): a = findReverse(wanted) t = [] for e in a: s = "" for l in e: s += chr(l) t.append(s) return t init_tables(0xEDB88320) print solve(0x7d3693a)[0] + solve(0x88fee4e4)[0] + solve(0x88c8f80c)[0] + solve(0x9df7c381)[0] + solve(0x9d384067)[0] + solve(0x54181a2b)[0] + solve(0xF0E658F3)[0]