Что такое CRC
Циклический избыточный код рассматривает сообщение как одно длинное двоичное число и делит его на фиксированный полином; остаток и есть контрольная сумма. Инвертируйте любой один бит или любую серию битов короче CRC — и остаток изменится, поэтому CRC защищают кадры Ethernet, записи ZIP, чанки PNG, секторы дисков и последовательные протоколы. Они быстры и в аппаратной, и в программной реализации, но не являются криптографическими: кто угодно может подобрать данные с нужным CRC.
Почему существует столько «CRC-16»
Две реализации одной разрядности могут различаться пятью параметрами, и каждая комбинация — это другая контрольная сумма:
| Параметр | Значение |
|---|---|
| Полином | Делитель, записанный без старшего бита (0x1021 для CCITT, 0x04C11DB7 для CRC-32). |
| Init | Начальное значение регистра, 0 или все единицы. |
| Отражение входа | Обрабатывается ли каждый входной байт начиная с младшего бита (да для CRC-32, MODBUS; нет для CCITT-FALSE, XMODEM). |
| Отражение выхода | Переворачивается ли итоговый регистр побитно. |
| XOR out | Завершающий XOR, обычно 0 или все единицы. |
Стандартный способ опознать вариант — его контрольное значение: CRC строки ASCII 123456789. Таблица выше показывает его для каждой модели, а ввод по умолчанию — именно эта строка, так что если устройство выдаёт контрольную сумму для известных данных, вы можете сравнить её со всеми вариантами сразу.
Распространённые варианты
- CRC-32 (0x04C11DB7, отражённый): Ethernet, ZIP, gzip, PNG,
zlib.crc32,cksum -o 3. - CRC-32C (Castagnoli): iSCSI, SCTP, метаданные ext4, Btrfs, LevelDB; имеет аппаратную инструкцию на x86 и ARM, поэтому это быстрый выбор для новых разработок.
- CRC-16/MODBUS: Modbus RTU по последовательному порту; CRC-16/CCITT-FALSE: Bluetooth, многое из того, что называют «CRC-CCITT»; CRC-16/XMODEM: XMODEM,
binascii.crc_hqxв Python. - Adler-32: потоки zlib; быстрее CRC, но слабее на коротких входных данных.
Вопросы
CRC — это то же самое, что хеш?
Нет. CRC обнаруживает случайное повреждение и тривиально обращается или подделывается. Для целостности при наличии злоумышленника или для идентификации файлов используйте SHA-256. Для скорости на доверенном канале CRC подходит.
Моё устройство выдаёт другой CRC-16, чем эта страница.
Существует не меньше десятка вариантов CRC-16. Введите данные, для которых устройство посчитало контрольную сумму, и сравните его значение с каждой строкой таблицы; совпавшая строка покажет полином, init и отражение, которые использует устройство. Если ничего не совпало, попробуйте собственную модель и проверьте, не включает ли устройство в данные байт длины или адрес.
Какой порядок байтов у результата?
CRC показан как число. Когда он записывается в пакет, порядок определяет протокол: MODBUS передаёт сначала младший байт, XMODEM — старший. Сверьтесь со спецификацией или примером кадра.
Что такое CRC-32C и почему его используют базы данных?
Это CRC-32 с полиномом Кастаньоли, который лучше обнаруживает ошибки при размерах блоков, характерных для систем хранения, и реализован одной инструкцией CPU (SSE4.2 crc32, ARMv8 CRC32C), что делает его в несколько раз быстрее классического CRC-32.
Можно ли вычислять CRC инкрементально?
Да. Все эти CRC можно продолжать с предыдущего значения — именно так работает zlib.crc32(data, previous). Эта страница вычисляет весь ввод за один раз.