Перейти к содержанию
    

Нахождение полинома CRC

Доброе утро.

По поводу единичек в каждом разряде. До устройства пока не добрался, но проверил на стандартном полиноме CRC16CCITT 1021hex. Вот данные:

 

двоичные данные.......HEX.......CRC..............Разность:

(2 байта)................................p1021.......XOR.....алгебраическая

 

0000000000000000......0000......1D0F

0000000000000001......0001......0D2E......1021......0FE1

0000000000000010......0002......3D4D......2042......DFC2

0000000000000100......0004......5D8B......3063......BF84

0000000000001000......0008......9C07......8108......8108

0000000000010000......0010......0F3E......1231......0DD1

0000000000100000......0020......396D......2462......E3A2

0000000001000000......0040......55CB......48C4......C744

0000000010000000......0080......8C87......9188......9088

0000000100000000......0100......2E3E......3331......EED1

0000001000000000......0200......7B6D......6662......A1A2

0000010000000000......0400......D1CB......CCC4......4B44

0000100000000000......0800......94A6......89A9......8869

0001000000000000......1000......1E7C......0373......FE93

0010000000000000......2000......1BE9......06E6......0126

0100000000000000......4000......10C3......0DCC......0C4C

1000000000000000......8000......0697......1B98......1678

 

Как я правильно понял, CRC для данных 0003hex будет сумма разностей для нулевого и первого бита.

 

Правильное CRC, расчитанное программой для данных 0003hex будет 2D6Chex.

По варианту, предложенному Вами, CRC будет 3063hex, при сложении XOR, и EFA3hex при алгебраическом.

 

Извеняюсь за первое сообщение, не проследил за табуляцией.

Изменено пользователем uk8adi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто знает разработчиков того устройства, они могли применить и нестандартный полином, и может быть что-нибудь еще.

Лично я применяю начальное значение CRC отличное от нуля. Попробуйте просчитать свою нулевую посылку по стандартным полиномам с начальным значением отличным от нуля.

 

Еще у Скляра в "Цифровой связи" на стр. 933 описан метод взлома системы шифрования на регистре с обратными связями - оно не поможет?

 

Как я понял, вычислить начальное значение (init по описанию CRC) для нулевой посылки и после применять ее для дальнейшего расчета других данных.

Это было сделано, и расчитанные CRC отличались от принятых, причем довольно сильно и без видимой мною системы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте полином D027 в комбинации со стартовым значением. Какое пока сказать не знаю.

Предлагаю попробовать прогнать комбинацию FFFF00000000

 

Подсчитано с полиномом D027 и стартовым значением FFFF00000000 (стандартное для CRC16 CCITT):

.............................принятые...расчитанные

........................................CRC

303333333330..........6B3D..........EB11

303333333331..........BB16..........FB36

303333333332..........1B43..........CB5F

303333333333..........CB68..........DB78

303333333334..........8BC1..........AB8D

303333333335..........5BEA..........BBAA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

>> Подсчитано с полиномом D027 и стартовым значением FFFF00000000

Не, я имею ввиду, прогнать эту комбинацию по полиному.

А какое стартовое значение нам поможет определить единичка со всеми нулями.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

uk8adi, Неверно

 

1. я говорил, что от всех частных CRCi надо было отнять CRC0, конечно по модулю

тут я что-то уже запутался, т.к. было это дело давно,

но что надо от чего-то отнять CRC0, помню точно

наверное, от конечного результата

 

2. Пусть

:) - сложение по модулю

:( - вычитание по модулю

 

CRC для данных 0003hex будет равно

CRC1 :) CRC2 :( CRC0

или

0D2E :) 3D4D :( 1D0F = 2D6C

 

3. чтобы найти правильный полином, надо для каждого полинома CRC-16 (и все-таки найти их все)

получить XOR -разницу с нашими частными CRCi

если это будет величина постоянная, то полином мы угадали

останется только найти предустановку регистра

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. Пусть

:) - сложение по модулю

:( - вычитание по модулю

 

CRC для данных 0003hex будет равно

CRC1 :) CRC2 :( CRC0

или

0D2E :) 3D4D :( 1D0F = 2D6C

 

Работает! Проверил на стандартном полиноме. Сейчас пойду к железке и наработаю таблицу.

Сообщу о результатах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

2. Пусть

:) - сложение по модулю

:( - вычитание по модулю

 

CRC для данных 0003hex будет равно

CRC1 :) CRC2 :( CRC0

или

0D2E :) 3D4D :( 1D0F = 2D6C

 

Работает! Проверил на стандартном полиноме. Сейчас пойду к железке и наработаю таблицу.

Сообщу о результатах.

Если не получится попробуйте еще полином 0x8408 (CRC-XMODEM) вкупе со сдвигом в другую сторону

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что и куда двигаем. Не понятно. Пожалуйста, поподробнее.

Изменено пользователем uk8adi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что и куда двигаем. Не понятно. Пожалуйста, поподробнее.
Меняется порядок обработки битов. Можно я на примере?

//==============================================================//
//          Calculate one byte of CCITT CRC-16                  //
//==============================================================//
void CRC_CRC16 (uint8_t Data, uint16_t &CRC) {
    CRC ^= (uint16_t)(Data) << 8;
    uint8_t i = 8;
    do {
        if (CRC & 0x8000) { CRC <<= 1; CRC ^= 0x1021; }
        else CRC <<= 1;
    }while(--i);
}
//==============================================================//
//          Calculate one byte of XModem CRC                    //
//==============================================================//
void CRC_XMODEM (uint8_t Data, uint16_t &CRC) {
    CRC ^= Data;
    uint8_t i = 8;
    do {
        if (CRC & 0x01) { CRC >>= 1; CRC ^= 0x8408; }
        else CRC >>= 1;
    } while(--i);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа!

Сделал эту таблицу, с одной единичкой в каждом бите.

Работает все прекрасно!

 

ВСЕМ СПАСИБО!

 

 

Но как всетаки вытащить образующий полином, я не понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но как всетаки вытащить образующий полином, я не понял.
ну.. это волшебство..

 

возможно

это устройство так же табличным методом формирует циклическую проверку.

конечно, какой-то полином изначально используется для построения таблицы,

но в таблице могут быть переставлены строки (т.е. переставлены частные CRCi для каждой единички),

 

поэтому опубликуйте полученную таблицу,

может кто-нибудь Вам скажет полином

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но как всетаки вытащить образующий полином, я не понял.
ну.. это волшебство..

 

 

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

Изменено пользователем DuHast

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

Потом производится хитрая перестановка и сложение строк матрицы (линейная комбинация строк). Обычно это делается для придания коду нужных спектральных характеристик, когда какие-то кодовые слова (КС) передаются чаще других.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

А вот

хитрая перестановка и сложение строк матрицы (линейная комбинация строк).

приведёт только к получению матрицы(не пораждающей) в строках которой будут кодовые слова того же кода, но никак не пораждающая матрица другого кода. Похоже Вы ошибаетесь, или я Вас не так понял.

Изменено пользователем DuHast

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

 

Снятая и частично вычисленная таблица:

 

000000000000...........0003

000000000001...........D028

000000000002...........707D

000000000004...........E0FF

000000000008...........11D0

000000000010...........23A6

000000000020...........474A

000000000040...........8E92

000000000080...........CD09

000000000100...........4A3C

000000000200...........947E

000000000400...........F8D1

000000000800...........218C

000000001000...........431E

000000002000...........863A

000000004000...........DC59

000000008000...........689C

000000010000...........D13E

000000020000...........7251

000000040000...........E4A7

000000080000...........1960

000000100000...........32C6

000000200000...........658A

000000400000...........CB12

000000800000...........4609

000001000000...........8С17

000002000000...........С800

000004000000...........402D

000008000000...........805F

000010000000...........D090

000020000000...........710D

000040000000...........E21F

000080000000...........1410

000100000000...........2826

000200000000...........504A

000400000000...........A092

000800000000...........9109

001000000000...........F23C

002000000000...........3455

004000000000...........68AF

008000000000...........D15B

010000000000...........7298

020000000000...........E536

040000000000...........1A41

080000000000...........3487

100000000000...........690B

200000000000...........D213

400000000000...........7408

800000000000...........E816

 

Заметил еще одну вещь. Сегмент данных проверяется на четность (количество едениц), если четно, то еще прибавляется 0003.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...