|
Деление в алгоритме CRC |
|
|
|
Sep 7 2012, 11:59
|
Знающий
   
Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059

|
Итак дано: CRC-5 x^5+x^2+1 Исходные данные: 0xD1 Из определения, CRC есть остаток от деления данных на полином. Значит CRC = 0xD1 % (x^5+x^2+1) Делю в столбик CODE 11010001 100101 -------- 100010 100101 ------------ 1111 остаток 1111 = 0xF Проверяю онлайн калькулятором http://ghsi.de/CRC/index.php?Polynom=100101&Message=B1ответ 0x16 (hexadecimal) 10110 (binary) В чем ошибка ? В онлайн калькуляторе судя по приведенным ими листингам кода начальное значение CRC равно 0
|
|
|
|
|
Sep 7 2012, 12:19
|
Гуру
     
Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261

|
Цитата(Костян @ Sep 7 2012, 15:59)  Итак дано: CRC-5 x^5+x^2+1 Исходные данные: 0xB1 Делю в столбик Код 11010001 100101 -------- 100010 100101 ------------ 1111 В чем ошибка ? 0xB1 = 10110001, а у Вас делимое: 0xD1 = 11010001
|
|
|
|
|
Sep 7 2012, 13:10
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Костян @ Sep 7 2012, 14:59)  В чем ошибка ? В том, что деление полиномов и деление чисел - несколько разные операции. Деление чисел выполняется сдвигом и вычитанием, деление полиномов - сдвигом и вычитанием по модулю 2, которое идентично сложению по модулю 2 (оно же "Исключающее ИЛИ", XOR). Поэтому формула CRC = 0xD1 % (x^5+x^2+1) не верна. Это первое. Второе: перед делением полиномов делимое сдвигается влево на кол-во разрядов делителя. И тогда все сходится: CODE 11010001000000 100101 -------- 100010 100101 111100 100101 110010 100101 101110 100101 10110
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 7 2012, 13:51
|
Знающий
   
Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059

|
QUOTE Поэтому формула CRC = 0xD1 % (x^5+x^2+1) не верна. Это первое. согласен QUOTE (Сергей Борщ @ Sep 7 2012, 11:10)  Второе: перед делением полиномов делимое сдвигается влево на кол-во разрядов делителя. Спасибо, разобрался  . Только сдвиг идет не на кол-во разрядов делителя, а на степень полинома, что меньше на 1 сдвиг. В Вашем делении в столбик последний 0 лишний. И этот сдвиг идет только при вычислении CRC. Классическая схема деления полиномов не предполагает сдвига, если я все правильно понимаю.
|
|
|
|
|
Sep 7 2012, 14:38
|
Знающий
   
Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059

|
QUOTE (MrYuran @ Sep 7 2012, 12:07)  На самом деле это называется умножением в поле Галуа  А вычисляется сдвигом и сложением по модулю 2 (XOR) не совсем. Операция нахождения CRC - есть деление на многочлен в поле Галуа. Откуда взялось умножение то ? А при кодирование и декодировании выполняется только операция деления (при кодировании находится остаток от деления, при декодировании идет проверка, что остаток равен нулю)
|
|
|
|
|
Sep 7 2012, 14:54
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Костян @ Sep 7 2012, 18:38)  не совсем. Операция нахождения CRC - есть деление на многочлен в поле Галуа. Откуда взялось умножение то ? А при кодирование и декодировании выполняется только операция деления (при кодировании находится остаток от деления, при декодировании идет проверка, что остаток равен нулю) Ну это смотря с какой стороны зайти. Ну да ладно, пусть будет деление. А я попутно интересную статью нагуглил, очень может пригодиться.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 10 2012, 07:32
|
Знающий
   
Группа: Свой
Сообщений: 740
Регистрация: 24-07-06
Из: Minsk
Пользователь №: 19 059

|
QUOTE (MrYuran @ Sep 7 2012, 12:54)  А я попутно интересную статью нагуглил, очень может пригодиться. это обшеизвестно, что crc не противостоит взлому, достаточно только ход байтов переставить и получим тот же CRC
|
|
|
|
|
Jun 13 2013, 07:55
|

Эксперт
    
Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183

|
QUOTE (ADA007 @ Jan 5 2013, 16:00)  В продолжение данной темы.... Может ли кто-нибудь представить здесь матиматическое решения даной задачи? т.е. как бы это решалось в виде формулы 0xD1 = x^7+x^2+1 0x25 = x^5+x^2+1 и это надо поделить друг на друга... как из (x^7+x^2+1)*x^N mod x^5+x^2+1 получить x^4+x^2+x^1 ? Так и делить, уравновешиванием... как числа мы делим уголком, уравновешивая старший разряд, в данном случае старший разряд полинома Например, (x^7+x^2+1) - (x^5+x^2+1)*(x^2) = -x^4 +1 = x^4 + 1 остаток 0xD1 - это другое - x^7 + x^6 + x^4 + 1 Но как верно замечено выше - обычно делить не надо, достаточно умножать, поскольку у каждого элемента X в конечном поле существует обратный элемент 1/X, вот на него достаточно и умножить , чтобы разделить на Х. А умножение на полином - это свертка
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|