Как я могу угадать алгоритм контрольной суммы?

Предположим, что у меня есть некоторые пакеты с 16-разрядной контрольной суммой в конце. Я хотел бы догадаться, какой алгоритм контрольной суммы используется.

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

Затем я попробовал несколько вариантов CRC16, но без особого успеха.

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

История Backgroud: у меня есть серийный RFID-протокол с какой-то контрольной суммой. Я могу воспроизводить сообщения без проблем и интерпретировать результаты (без проверки контрольной суммы), но я не могу отправлять измененные пакеты, потому что устройство бросает их на пол.

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

файлы дампов с данными доступны, если самого вопроса недостаточно: -)

Нужна справочная документация? НЕПРАВИЛЬНОЕ РУКОВОДСТВО ДЛЯ АЛГОРИТМОВ ОБНАРУЖЕНИЯ ОШИБКИ CRC - отличная ссылка, которую я нашел после того, как задал вопрос здесь.

В конце концов, после очень полезного намека на принятый ответ, чем на CCITT, я использовал этот CRC-калькулятор, и xored сгенерированная контрольная сумма с известной контрольной суммой, чтобы получить 0xffff, которая привела меня к выводу, что окончательный xor является 0xffff instread CCITT 0x0000.

Ответы

Ответ 1

Для CRC существует ряд переменных:

Polynomial
No of bits (16 or 32)
Normal (LSB first) or Reverse (MSB first)
Initial value
How the final value is manipulated (e.g. subtracted from 0xffff), or is a constant value

Типичные CRC:

LRC:    Polynomial=0x81; 8 bits; Normal; Initial=0; Final=as calculated
CRC16:  Polynomial=0xa001; 16 bits; Normal; Initial=0; Final=as calculated
CCITT:  Polynomial=0x1021; 16 bits; reverse; Initial=0xffff; Final=0x1d0f
Xmodem: Polynomial=0x1021; 16 bits; reverse; Initial=0; Final=0x1d0f
CRC32:  Polynomial=0xebd88320; 32 bits; Normal; Initial=0xffffffff; Final=inverted value
ZIP32:  Polynomial=0x04c11db7; 32 bits; Normal; Initial=0xffffffff; Final=as calculated

Первое, что нужно сделать, это получить некоторые образцы, изменив, скажем, последний байт. Это поможет вам определить количество байтов в CRC.

Является ли это "самодельным" алгоритмом. В этом случае это может занять некоторое время. В противном случае попробуйте стандартные алгоритмы.

Попробуйте изменить либо msb, либо lsb последнего байта, и посмотрите, как это изменит CRC. Это даст указание направления.

Чтобы сделать его более трудным, существуют реализации, которые управляют CRC, чтобы он не повлиял на коммуникационный носитель (протокол).

Из вашего комментария о RFID, это означает, что CRC связан с коммуникациями. Обычно CRC16 используется для связи, хотя CCITT также используется в некоторых системах.

С другой стороны, если это отметка UHF RFID, то есть несколько схем CRC - 5 бит и 16 бит. Они документированы в стандартах ISO и в листах данных IPX.

IPX:  Polynomial=0x8005; 16 bits; Reverse; Initial=0xffff; Final=as calculated
ISO 18000-6B: Polynomial=0x1021; 16 bits; Reverse; Initial=0xffff; Final=as calculated
ISO 18000-6C: Polynomial=0x1021; 16 bits; Reverse; Initial=0xffff; Final=as calculated
    Data must be padded with zeroes to make a multiple of 8 bits
ISO CRC5: Polynomial=custom; 5 bits; Reverse; Initial=0x9; Final=shifted left by 3 bits
    Data must be padded with zeroes to make a multiple of 8 bits
EPC class 1: Polynomial=custom 0x1021; 16 bits; Reverse; Initial=0xffff; Final=post processing of 16 zero bits

Вот ваш ответ!!!!

Проработав ваши журналы, CRC является CCITT. Первый байт 0xd6 исключается из CRC.

Ответ 2

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

Я действительно не понимаю, почему кто-то хочет это знать.

Ответ 3

Возможно, это не CRC, это может быть код с исправлением ошибок, например, Рид-Соломон.

Коды ECC часто составляют значительную часть размера исходных данных, которые они защищают, в зависимости от частоты ошибок, которую они хотят обрабатывать. Если размер сообщений больше, чем около 16 байт, 2 байта ECC недостаточно, чтобы быть полезным. Поэтому, если сообщение велико, вы, скорее всего, правы, что его некоторая CRC.

Ответ 4

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

Веб-сайт https://defuse.ca/checksums.htm