Sorry I was not clear. All operations described below are done in GF(232).

P * x32 mod crc_poly is the remainder of (P shifted 32 bits to the right) after dividing by the CRC polynomial, which is how CRCs are computed).

inverse(x32) is the multiplicative inverse of x32 mod crc_poly. Multiplicative inverse means x32 * inverse(x32) mod crc_poly = 1.

Maybe there is another way but here is an example:

M1 = 'The quick brown fox jumps over the lazy dog'

M2 = 'Another string'

CRC32(M1) = 414fa339

CRC32(M2 || 00004 bytes) = 80bd6d26

XOR them together and undo the bitreverse: K = f8734f83 (note that XORing two bit inverted values will cancel the bit inverse)

The multiplicative inverse of x32 = cbf1acda.

Now P = K * inverse(x32) mod crc_poly

= f8734f83 * cbf1acda mod 104C11DB7

= 5d9fe0f5.

Reverse each byte since CRC32 works with LSB of each byte first: baf907af.

Verify that CRC32(M2 || baf907af) = 414fa339.

bontchev

Sorry, I'm still lost.

M1 = 'The quick brown fox jumps over the lazy dog'

M2 = 'Another string'

CRC32(M1) = 414fa339

CRC32(M2 || 00004 bytes) = 80bd6d26

So far, so good.

XOR them together and undo the bitreverse: K = f8734f83 (note that XORing two bit inverted values will cancel the bit inverse)

Sorry, where did f8734f83 come from? 414FA339 XOR 80BD6D26 is C1F2CE1F. Even if we invert that, we get 3E0D31E0.

Edit: Given that I have misunderstood what you meant by "invert" (see below), we have:

C1F2CE1F hex is 11000001 11110010 11001110 00011111 binary. Reversing the order of bits (considering them as a continuous stream of bits, not on a byte basis), we get 11111000 01110011 01001111 10000011, which is F8734F83 hex. Is that what you meant by "undo the bit reverse"?

The multiplicative inverse of x32 = cbf1acd

How did you get that from the numbers so far?

= f8734f83 * cbf1acda mod 104C11DB7

Where did 104C11DB7 come from? Is that the generator polynomial for this particular CRC-32?

= 5d9fe0f5.

I don't get it...

According to my hex calculator, F8734F83 * CBF1ACDA is C5EDFC5BC6F0B98E. Mod 104C11DB7 results in 115CF38C? Am I misunderstanding what you mean by the operations "*" and "mod"?

Reverse each byte since CRC32 works with LSB of each byte first: baf907af.

Again, I don't follow. If you invert each bit of 5D9FE0F5, you get A2601F0A...

Oh, wait, I think I got this part. By "reverse" you mean re-order; not flip the contents. So, we have

5D9FE0F5, which is 01011101 10011111 11100000 11110101 binary. You reverse the order of bits in each byte, resulting in 10111010 11111001 00000111 10101111, which is BAF907AF hex.

supersaw7

I should really improve my explaining skills

reverse = reverse the order of the bits, bit inverse = bitwise not.

0x104C11DB7 is the CRC32 polynomial, with the explicit x32 coefficient (most tables omit that).