Это полностью зависит от того, что вы подразумеваете под «сообщением». Если вы можете добавить четыре байта тарабарщины к одному из сообщений. (Т.е. четыре байта, которые не имеют значения в контексте сообщения.) Тогда это становится тривиальным в прямом смысле этого слова.
Думая с точки зрения битов, проходящих через конечный автомат 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, а затем повторите круг. Это должно уменьшить пространство для решения, которое вам затем нужно искать.
Это довольно сложная вещь для написания кода, но она будет генерировать ваши коллизии за очень короткий промежуток времени.
person
scruffy_brit
schedule
05.10.2009