反转CRC32

pat*_*pat 9 algorithm crc32 reverse reverse-engineering crc

我正在寻找一种方法来反转CRC32校验和.有解决方案,但它们要么写得很糟糕,要么非常技术性和/或在装配中.汇编(目前)超出了我的范围,所以我希望有人可以用更高级别的语言拼凑一个实现.Ruby是理想的,但我可以解析PHP,Python,C,Java等.

任何接受者?

Cad*_*oux 19

如果原始字符串是4个字节或更少,CRC32只能是可逆的.

  • @CadeRoux:不仅可以为将生成该 CRC32 的任何 32 位值构造四个字节的序列,而且如果选择该序列的任何 32 位(集中在四个字节,或分散在整个序列中),这 32 位值的每个组合将生成不同的 CRC32;确定用于这些位的值组合以产生所需的 CRC32 并不困难。 (3认同)
  • 如果您查看实现,对于 4 个字节,它将仅使用 XOR 运算进行 3 个 8 位移位,所以是的,它是可逆的:http://www.sanity-free.org/12/crc32_implementation_in_csharp.html (2认同)
  • 如果 CRC 是基于通常的原始多项式,那意味着它将为 2^32 个输入中的每一个返回唯一的密钥。 (2认同)

Foz*_*ozi 5

阅读名为"逆转CRC理论与实践"的文件.

这是C#:

public class Crc32
{
    public const uint poly = 0xedb88320;
    public const uint startxor = 0xffffffff;

    static uint[] table = null;
    static uint[] revtable = null;

    public void FixChecksum(byte[] bytes, int length, int fixpos, uint wantcrc)
    {
        if (fixpos + 4 > length) return;

        uint crc = startxor;
        for (int i = 0; i < fixpos; i++) {
            crc = (crc >> 8) ^ table[(crc ^ bytes[i]) & 0xff];
        }

        Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4);

        crc = wantcrc ^ startxor;
        for (int i = length - 1; i >= fixpos; i--) {
            crc = (crc << 8) ^ revtable[crc >> (3 * 8)] ^ bytes[i];
        }

        Array.Copy(BitConverter.GetBytes(crc), 0, bytes, fixpos, 4);
    }

    public Crc32()
    {
        if (Crc32.table == null) {
            uint[] table = new uint[256];
            uint[] revtable = new uint[256];

            uint fwd, rev;
            for (int i = 0; i < table.Length; i++) {
                fwd = (uint)i;
                rev = (uint)(i) << (3 * 8);
                for (int j = 8; j > 0; j--) {
                    if ((fwd & 1) == 1) {
                        fwd = (uint)((fwd >> 1) ^ poly);
                    } else {
                        fwd >>= 1;
                    }

                    if ((rev & 0x80000000) != 0) {
                        rev = ((rev ^ poly) << 1) | 1;
                    } else {
                        rev <<= 1;
                    }
                }
                table[i] = fwd;
                revtable[i] = rev;
            }

            Crc32.table = table;
            Crc32.revtable = revtable;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)