Это полностью зависит от того, что вы подразумеваете под «сообщением». Если вы можете добавить четыре байта бреда к одному из сообщений. (Т.е. четыре байта, которые не имеют смысла в контексте сообщения.) Тогда оно становится тривиальным в прямом смысле этого слова.
Мышление в терминах битов, проходящих через конечный автомат CRC32.
CRC32 основан на регистре сдвига с обратной связью Галуа, каждый бит в его состоянии будет заменен на 32 бита из данных полезной нагрузки. При индукции каждого бита позиции, указанные полиномом, будут исключены с последовательностью, наблюдаемой в конце регистра сдвига. На эту последовательность не влияют входные данные до тех пор, пока сдвиговый регистр не будет заполнен.
В качестве примера представим, что у нас есть сдвиговый регистр, заполненный начальным состоянием 10101110, полиномом 10000011 и заполнением неизвестными битами, X.
Polynomial * ** |feedback (End of SR.)
State 10101110 0
State X1010111 1
State XX101000 0
State XXX10100 0
State XXXX1010 0
State XXXXX101 1
State XXXXXX01 1
State XXXXXXX1 1
State XXXXXXXX 0
Обратная связь не относится к X, пока SR не будет заполнен!
Таким образом, чтобы сгенерировать сообщение с заранее определенной контрольной суммой, вы берете новое сообщение, генерируете его CRC и обрабатываете следующие 32 бита обратной связи. Это вы можете сделать в 32 шагах функции CRC. Затем вам необходимо рассчитать влияние этой обратной связи на содержимое регистра сдвига.
Сокращение для этого - заполнить ваше сообщение четырьмя нулевыми байтами, а затем посмотреть контрольную сумму. (Контрольная сумма - это состояние SR в конце, которое, если дополнено четырьмя нулевыми байтами, является влиянием обратной связи и пустых байтов.)
Исключительно ИЛИ, которые влияют на требуемое значение контрольной суммы, замените четырехбайтовый трейлер этим вычисленным значением и восстановите контрольную сумму. Вы можете сделать это с любой программой, которая генерирует CRC32, редактор шестнадцатеричных кодов и калькулятор, который может обрабатывать шестнадцатеричные значения.
Если вы хотите сгенерировать два сообщения, которые имеют полный смысл и не содержат конечного мусора, все становится немного сложнее. Укажите количество разделов, в которых вы можете написать правдоподобные альтернативы, с одинаковой длиной.
На примере английской прозы.
«Я думаю, что это может работать»
а также
«Я верю в этот подход»
Имеют схожие значения и одинаковую длину.
Определение достаточного количества примеров в вашем сообщении - хитрый бит (если только вы не хотите обманывать пробелами!) CRC 32 является линейным, если данные имеют правильное смещение в сообщении. Таким образом, CRC ([messagea] [padding]) ^ CRC ([padding] [messageb]) = CRC ([messagea] [messageb])
Существуют некоторые предостережения с выравниванием слов, с которыми вам нужно справиться. Как общий совет, вы хотите расширить отрывки на «фиксированные» части сообщения. Как правило, вы хотите иметь альтернативы для n * 1,5 пассажей, где n - это размер CRC.
Теперь вы можете вычислить CRC, который имеет скелетное сообщение, впечатление, которое будет иметь каждый альтернативный отрывок, и затем составить таблицу, сравнивая влияние, которое окажет каждая альтернатива для каждого отрывка. Затем вам нужно выбрать альтернативы, которые изменят CRC скелета, чтобы соответствовать CRC, который вы хотите. Эту проблему на самом деле довольно забавно решить. Прежде всего найдите любые альтернативы, которые однозначно изменяют немного, если этот бит должен измениться для вашего CRC, выберите эту альтернативу и сложите ее влияние в CRC, а затем снова обойдите. Это должно уменьшить пространство для решения, которое вам нужно искать.
Это довольно сложная задача для кодирования, но это приведет к возникновению коллизий за очень короткий промежуток времени.