solve for data, given a target crc
Project description
crcsolver
solve for data, given a target cyclic redundancy check (CRC)
Use
We'll target python's built-in crc32:
>>> import binascii
>>> binascii.crc32(b'penguin')
3854672160
Now suppose we lost the 'e'. We have b'p_nguin' and need to solve for that vowel. With bits indexed left-to-right across the input, the missing character is at bits [8,9,10,11,12,13,14,15].
>>> from crcsolver import solve
>>> solve(b'p_nguin', [8,9,10,11,12,13,14,15], 3854672160, binascii.crc32)
b'penguin'
The solve takes what data is known, a list of bits that are unknown, a target CRC result, and a CRC calculating function which it will call while finding a solution.
Any n-bit CRC is solvable with at least n bits of freedom, but might not have a solution with less. Here's a failed attempt to toggle the first 8 bits of b'XXXXXXXX' to the same CRC has b'penguin'. When there is no solution, solve() returns None:
>>> solve(b'XXXXXXXX', range(8), 3854672160, binascii.crc32)
>>>
With 32 bits of freedom, a solution exists:
>>> solve(b'XXXXXXXX', range(32), 3854672160, binascii.crc32)
b'\xe4\xaf\x96#XXXX'
Note the solver doesn't know what data looks nice or not. It will find the first solution, which may not be human readable. Verify:
>>> binascii.crc32(b'\xe4\xaf\x96#XXXX')
3854672160
Other examples are available in the source distribution under ./tests.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for crcsolver-1.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d1f8959eba5b454e9b7eeeeeb50b773ecf330b24d6e8e05a2dd8e92f42bd3af |
|
MD5 | b58a6b145588b72115977147040556d4 |
|
BLAKE2b-256 | c8c6a0dfcf5535bd831a42e0dbae4072863d1a3628938fa65752d366fb3e7a93 |