Обратный инжиниринг алгоритма CRC16 из CRC16 и набора данных

Я использую плохо документированную систему, в которой требуется CRC16 в структуре, которую мне нужно изменить. Изменение не вступит в силу, если я не укажу правильную контрольную сумму.

Техническая поддержка указала, что они использовали стандартный CRC16, но использование CRC16 CCITT не дало бы мне результата.

У меня есть небольшой фрагмент данных и контрольная сумма, которая должна быть.

Может ли кто-нибудь помочь мне найти правильные параметры CRC16 (многочлен, начальное значение), которые будут соответствовать моему набору данных?

Еще одна вещь. На рассматриваемой платформе адреса организованы с 16-битными словами для каждого адреса, поэтому я попробовал как исходный порядок байтов, так и обратный порядок байтов.

Data Set #  1
crc         0xb19f
data @b306: 7a b1 74 44 9f 84 74 5b  
length      8 bytes

Data Set # 2
crc        0x447b
data @0036 00 43 e2 05 5b 03 00 02 00 16 00 00 00 00 00 00
           00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           12 c0 00 00 00 07 f7 ff 3f e5 ff ff 3f ff 75 30
           3a 98 00 01 00 9d 00 0f 00 09 00 0a 00 00 00 00
           00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           00 00 00 00 00 00 00 00 00 00 00 00 00 0a 80 0f
           47 44 09 6d 0a 35 09 c4 f0 00 00 40 10 00 00 01
           07 d0 27 10 00 00 ff 38 00 5a ff 06 0a fd 00 05
length     128 bytes

Зная то, что я знаю сейчас, я думаю, что ошибся, когда выбрал организацию, которая не предоставляет много технической поддержки, теперь я это знаю.

[EDIT:] Процессор ~ 8051, но не уверен насчет порядка байтов. Мой тестовый код проверяет оба типа порядка следования байтов, как само собой разумеющееся.

[EDIT:] Я нашел этот другой вопрос полезным: CRC16 и передача данных


person Bamaco    schedule 02.10.2014    source источник
comment
Я бы попытался зациклить все возможные значения инициализации для CRC16 для наборов данных. Вычисление одной и той же CRC 65536 раз не займет много времени на современном ПК.   -  person tebe    schedule 02.10.2014
comment
Во-первых, CRC16 — это не то же самое, что CRC16 CCITT — так почему вы ожидаете, что он будет работать? Во-вторых, на этой странице говорится, что неработающие реализации являются обычным явлением, поэтому вы можете найти один или два, которые генерируют разные результаты из любой правильной реализации, которую вы найдете, и посмотрите, соответствует ли какой-либо из них тому, что использует ваш продукт. В-третьих, зачем теги [c++], [c] и [embedded]? -1 за нечестное привлечение аудитории!   -  person Tony Delroy    schedule 02.10.2014
comment
@Tony D, извините за теги C++ и C, я их удалил. Что касается встроенных, то это честно, встроенная платформа, которую я не могу назвать, опасаясь пристыдить их за такую ​​​​плохую поддержку.   -  person Bamaco    schedule 02.10.2014
comment
@Bamaco: тогда мой -1 исчез (хотя встроенный может быть правдой, хотя и якобы не имеет отношения к заданному вопросу), но если они широко использовали этот подход CRC во всем своем программном обеспечении, присвоение им имен может быть наиболее практичным способом получить актуальную опыт и помощь....   -  person Tony Delroy    schedule 02.10.2014
comment
@Tony D, во-первых, о CRC16 CCITT, это самый стандарт, о котором я знаю. Если есть лучший стандарт, я не смог найти его, прочитав страницу википедии по этому вопросу.   -  person Bamaco    schedule 02.10.2014
comment
@Bamaco: из документа, на который я ссылаюсь выше: Зачем фокусироваться на 16-битном CRC-CCITT (полином 0x1021), а не на CRC16 (полином 0x8005), который, по-видимому, имеет более широкое применение? - этого достаточно, чтобы скажи мне, что это разные звери с разными выходами.   -  person Tony Delroy    schedule 02.10.2014
comment
@Tony D, подход CRC широко не используется в их программном обеспечении. Он просто используется в каком-то заголовке в EEPROM. Образ EEPROM, сгенерированный из выходных данных компилятора, проверяется основным процессором, к которому у меня нет доступа, с кодом ПЗУ. Единственная ссылка на CRC в этой системе находится в этих заголовках.   -  person Bamaco    schedule 02.10.2014
comment
@Bamaco Ага, сочувствую тебе - некрасивая ситуация. Возможно, в конечном итоге придется каким-то образом извлечь из них точный код CRC / алгоритм социальной инженерии .... Удачи!   -  person Tony Delroy    schedule 02.10.2014
comment
Какой процессор? Это должно, по крайней мере, сказать вам endianess.   -  person Chris Stratton    schedule 02.10.2014
comment
@ChrisStratton, я отредактировал свой первоначальный вопрос, чтобы отразить тот факт, что процессор ~ 8051.   -  person Bamaco    schedule 02.10.2014
comment
Попробуйте ввести свои данные в онлайн-калькулятор CRC, например этот. Если вы можете вырезать и вставлять данные в соответствующем формате в поле, оно автоматически рассчитает различные алгоритмы CRC.   -  person kkrambo    schedule 02.10.2014
comment
@kkrambo, я пробовал результат раньше, учитывая оба типа порядка следования байтов, и у меня не было хороших результатов, извините.   -  person Bamaco    schedule 02.10.2014
comment
Вы можете попробовать использовать reveng.sourceforge.net, похоже, он делает именно то, что вы просите. Я не пробовал это на ваших данных, так как это требует компиляции источника (и я на Chromebook), но некоторое время назад у меня была аналогичная проблема, и я могу попробовать.   -  person Clifford    schedule 02.10.2014
comment
Спасибо @Clifford, я нахожу месть немного сложной, но я добавляю ссылку для тех, кто может наткнуться на этот вопрос, для справки. CRC16 и передача данных   -  person Bamaco    schedule 03.10.2014
comment
@Bamaco: месть может быть сложной задачей, но это и твоя проблема. Возможно, стоит проявить настойчивость. Вы даже можете написать автору по электронной почте за советом.   -  person Clifford    schedule 03.10.2014
comment
@Clifford, мне удалось отомстить, но это не дало ответов. Не удалось найти CRC. С тех пор я получил ответ с некоторым кодом, и я разместил ответ со ссылкой на него.   -  person Bamaco    schedule 03.10.2014
comment
@Бамако: Круто; возможно, вы могли бы опубликовать командную строку reveng, которую вы использовали?   -  person Clifford    schedule 03.10.2014
comment
@Clifford, я публиковал это раньше, но я смог выполнить команду только с аргументом строки, я не смог заставить ее принимать чтение строк из отдельных файлов. Это было так уродливо и бесполезно, что я получил -1 за публикацию такой ужасной штуковины. См. связанный вопрос, например, аргументы в пользу мести.   -  person Bamaco    schedule 03.10.2014


Ответы (2)


Код, связанный с вашим собственным ответом, кажется, содержит много несвязанного кода, но 16-битная функция CRC упоминает два полимониала:

x^16+x^5+x^2+1.
x^16+x^12+x^5+1

но комментарий, в котором они упоминаются, предполагает, что автор не понял, что один является просто обратной версией другого, что может быть причиной путаницы в документации. В любом случае это полином CRC-16-CCITT (используемый в X.25, V.41, HDLC, XMODEM, Bluetooth, SD и многих других; известный как CRC-CCITT). Это не значит, что это реализовано правильно, конечно, или что комментарий даже правильный.

Это похоже на рваный набор кода из нескольких источников. Вы должны задаться вопросом о поставщике, полагающемся на код и алгоритмы неизвестного происхождения и очевидную путаницу!

Между прочим, 32-битная CRC в том же коде использует полином CRC-32 (используемый в ISO 3309, ANSI X3.66, FIPS PUB 71, FED-STD-1003, ITU-T V.42, Ethernet, SATA, MPEG). -2, Gzip, PKZIP, POSIX cksum, PNG, ZMODEM).


Позднее редактирование:

Я нашел его на этом сайте: http://www.zorc.breitbandkatze.de/crc.html и много проб и ошибок. К сожалению, сайт принимает данные в формате ASCII, поэтому я преобразовал 8-байтовый образец в текст, используя http://www.rapidtables.com/convert/number/hex-to-ascii.htm (что дает "z±tDt[" - обратите внимание, что строка содержит некоторые непечатаемые символы, но копирование и вставка они с сайта, по-видимому, включают их, поскольку он сообщает 8 байтов, тогда как строка здесь равна 6 - не копируйте и не вставляйте из этого сообщения).

В любом случае конфигурация, которая дает результат, указанный в вашем образце данных, выглядит следующим образом:

Снимок экрана www.zorc.breitbandkatze.de/crc.htmlНастройка выглядит следующим образом:

  • щелкните CRC-CCITT,
  • с «начальным значением», установленным на FFFF, нажмите «Преобразовать!» (в «непрямой», который преобразует значение 84CF),
  • установить "final XOR" на FFFF,
  • проверить "обратные байты данных",
  • вводите данные в ASCII,
  • нажмите "Рассчитать!" кнопка.
person Clifford    schedule 03.10.2014
comment
На снимке экрана показано начальное значение 0x84CF, но в тексте ниже указано 0xFFFF. - person Bamaco; 03.10.2014
comment
@Bamaco: следуйте инструкциям. Я получил 84CF, выбрав CRC-CCITT, который устанавливает поле в FFFF, которое при преобразовании становится 84CF. Суть в том, чтобы указать, как было получено значение, а не магия! Возможно, это не самый интуитивно понятный интерфейс, но он предоставляет больше возможностей, чем любой другой найденный мной онлайн-инструмент CRC. Чтобы увидеть, что на самом деле делают все элементы управления, вы можете посмотреть сценарий Java, и на сайте есть ссылка на код C, который поддерживает все те же параметры. - person Clifford; 04.10.2014

Оказывается, я получил ответ от производителя встроенного чипа.

Ссылки на код здесь

Для меня это не похоже на стандартный CRC16, и я не удивлен, что reveng не смог определить алгоритм CRC в использовать.

person Bamaco    schedule 03.10.2014
comment
Спасибо @Ross, я отредактировал бесполезный ответ и заменил его реальным ответом. - person Bamaco; 03.10.2014