use String::CRC32; my $initial_str = "foo bar"; my $desired_crc = 0x12345678; my $magic = forge_crc(value => $desired_crc ^ 0xffffffff) ^ crc32($initial_str) ^ 0xffffffff; my $forged_str = $initial_str . pack("V", $magic); printf "%x\n", crc32($forged_str); sub forge_crc { my (%opts) = @_; # default to the usual crc32 polynomial my $poly = $opts{poly} || 0xedb88320; my $size = $opts{size} || 32; my $highbit = 1 << ($size-1); my $reg = $opts{value}; $poly = ($poly << 1) ^ 1; for (1..$size) { $reg = ($reg & $highbit) ? ($reg << 1) ^ $poly : $reg << 1; } return $reg; } # forge_crc