Потребовалось определить алгоритм нахождения контрольной суммы, имея массивы насниференных байт данных и контрольные суммы к ним. Изначально были перепробованы все наиболее известные алгоритмы CRC, и уже после этого, почти отчаявшись, была написана программа (скорее, переписана), которая нашла решение за несколько секунд. С этого и надо было начинать!
Исходный код был переведен из JavaScript вот отсюда (CRC Calculator (Javascript)), спасибо тебе, Bastian Molkenthin.
Использовались параметры:
- Width of CRC (8, 16 or 32 bit) – количество битов CRC, или степень многочлена
- Polynomial – порождающий полином
- Initial CRC value – стартовое значение регистра
- Final XOR value – число, с которым складывается по модулю 2 полученный результат
- Input reflected – флаг, определяющий, инвертируется ли порядок битов регистра при входе на элемент XOR
- Result reflected – флаг переворота битов регистра при входе на элемент XOR
Алгоритм работы программы:
1) имеем несколько массивов байт и контрольные суммы к ним
2) перебираем варианты возможных значений шести параметров нахождения контрольной суммы
3) проверяем каждый вариант (2), подсовывая несколько массивов байт (1) и сверяя полученную контрольную сумму с имеющейся
4) если на одном из вариантов (2) у всех массивов байт значения контрольных сумм совпали с исходными, значит подобраны подходящие параметры. BINGO!!!
Проект: Ссылка
Как с вами можно связаться ?
У данного метода есть ряд недостатков:
1. имея двоичные данные, мы не знаем где именно находится контрольная сумма
2. мы не знаем где начало отрезка данных, для которого считается контрольная сумма
Также ваш код имеет только 8битный вариант перебора, для 16 бит это будет уже очень и очень долго.
Спасибо!
1) давно было уже, но кажется у меня были двоичные данные, не включающие контрольную сумму
2) тогда такая задача не стояла, требовалось лишь как можно быстрее определить именно способ вычисления самой контрольной суммы
3) конечно, это же способ “в лоб”, перебором, а оптимизация уже не входит в рамки этой заметки