сложный алгоритм CRC - PullRequest
3 голосов
/ 12 ноября 2008

Я пытаюсь найти CRC, который работает со следующими результатами. Строка байтов состоит из 2 байтов (т. Е. 0xCE1E), а crc представляет собой один байт (т. Е. 0x03)

byte crc
CE1E 03
CE20 45
CE22 6F
0000 C0
0001 D4
FFFF 95

Может кто-нибудь помочь?

Ответы [ 4 ]

4 голосов
/ 12 ноября 2008

Во-первых, 4 шестнадцатеричные цифры не 4 байта. Поскольку все ваши примеры показывают 4 шестнадцатеричные цифры - 2 байта - я предполагаю, что вы имеете в виду 2 байта.

Есть только 65 536 различных хеш-значений, вот что вы делаете.

Выполнить хэш-функцию для всех 65 536 значений от 0000 до FFFF. Табулируйте результаты. Эта таблица является функцией. Он отображает входное значение в выходное значение.

Несмотря на то, что он хромой, он всегда правильный, он не очень большой (65 Кбайт) и очень быстрый после того, как вы сделали вычисления.

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

Если вы сравните 0000 с 0001, 0002, 0004, 0008, 0010, 0020, 0040, 0080, 0100, 0200, 0400, 0800, 1000, 2000, 4000 и 8000, вы сможете определить, какой бит вносит свой вклад в хэш Но я сомневаюсь в этом.

2 голосов
/ 11 мая 2009

CRC - это просто деление, точно так же, как вы изучаете деление на длинные руки в начальной школе, за исключением того, что сложение и вычитание заменяются на XOR. Итак, вам нужно решить следующие уравнения в GF (2):

CE1E % p = 03
CE20 % p = 45
CE22 % p = 6F
0000 % p = C0
0001 % p = D4
FFFF % p = 95

Не существует полинома p, для которого 0000% p = c0. (0 по модулю p равно 0 для всех значений p.) Так что, возможно, это (x + input)% p = crc. В вашем случае х должно быть с0. Если это правда, то (x + 0001)% p должно быть c1. Похоже, это не CRC вообще. Если вы полны решимости и считаете, что ответ является линейным, составьте матрицу из нулей и единиц, которые являются обратимыми, и решите систему уравнений, которая получается из вашей матрицы умножить на вход = выход. Вам понадобится больше входных данных.

2 голосов
/ 12 ноября 2008

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

Есть ли у вас какие-либо подсказки о вероятном алгоритме? Или это домашнее задание, и вы должны перепроектировать алгоритм / параметры CRC?

Резюме: требуется больше информации.

0 голосов
/ 12 ноября 2008

http://www.geocities.com/SiliconValley/Pines/8659/crc.htm#r2

По моему неопытному взгляду, вам придется реализовать общий алгоритм crc и попробовать его с несколькими полисами (попробуйте сначала "популярные", упомянутые в этой статье).

edit : после дальнейшего прочтения кажется, что вам нужно учесть и обратный polys.

...