Открыть сервис

Циклический избыточный код

Циклический избыточный код (англ. Cyclic Redundancy Check, CRC) — это алгоритм вычисления контрольной суммы, предназначенный для обнаружения случайных или намеренных ошибок в цифровых данных. CRC относится к классу необратимых (однонаправленных) хеш-функций, но в отличие от криптографических хешей, его основная задача — выявление ошибок передачи или хранения, а не обеспечение криптостойкости. Контрольная сумма, полученная в результате применения CRC, представляет собой короткое фиксированное число (обычно 8, 16, 32 или 64 бита), которое добавляется к блоку данных. Приёмник повторно вычисляет CRC по полученным данным и сравнивает её с присланным значением: несовпадение указывает на наличие ошибки.

История создания

Происхождение CRC связано с развитием помехоустойчивого кодирования. В 1961 году Уэсли Питерсон (США) опубликовал работу, в которой формализовал теорию циклических кодов. Практическая реализация CRC стала возможна благодаря работам итальянского математика и инженера Эдуардо Чиара (Ennio Ciarli) в начале 1960-х годов. В 1963 году фирма IBM разработала стандарт CRC-16 для использования в протоколах передачи данных. К середине 1970-х годов CRC был принят в качестве стандартного метода контроля целостности в сетях передачи данных, магнитных и оптических носителях. Современные реализации CRC-32 стали неотъемлемой частью форматов ZIP, PNG, Ethernet и многих других.

Математическая основа

CRC основан на теории циклических кодов — подкласса линейных блочных кодов. Математически CRC работает в поле Галуа GF(2). Исходные данные представляются в виде многочлена с коэффициентами 0 и 1 (полинома сообщения). Фиксированный многочлен-генератор (делитель) степени n задаёт алгоритм вычисления остатка от деления. Контрольная сумма — это степень полинома остатка, не превышающая n-1. Основные понятия:

Процесс вычисления: M(x) * x^m делится на G(x); остаток от деления (его битовое представление) и есть передаваемое значение CRC. Алгоритм реализуется аппаратно с помощью сдвигового регистра с линейной обратной связью (LFSR) или программно с использованием таблиц предварительно вычисленных остатков (табличный метод Саревата).

Принцип обнаружения ошибок

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

CRC гарантированно обнаруживает:

Вероятность пропуска ошибки (ложного положительного исхода) при картине случайных битовых ошибок составляет приблизительно 2^{-m}.

Классификация и стандарты

По длине контрольной суммы CRC делятся на:

Стандартные генераторные полиномы:

Преимущества и недостатки

Преимущества:

Недостатки:

Применение

CRC широко применяется в различных областях информационных технологий:

Интересные факты

Сравнение с другими кодами

ПараметрCRCКонтрольная сумма (XOR/Simple Sum)Код Рида — СоломонаКриптохеш (SHA-256)
Длина выхода8–64 бит (стандарт)n бит (равна длине слова)2t*_n_ (символов)256 бит
Обнаружение ошибокДо 64 бит (для CRC-64) пачекВсе ошибки нечётной кратности (XOR) ограниченноt исправлений, t+1 обнаруженийЛюбое изменение с вероятностью 2^-256
Исправление ошибокНетНетДо t ошибокНет
Быстродействие аппаратное1 такт на бит1 такт на слово~10-20 тактов на символ~50 тактов на 64 байта
КриптостойкостьНизкая (лёгкая коллизия)НизкаяНизкаяВысокая (стойкая к коллизиям)

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

Источники

  1. Питерсон В., Уэлдон Э. Коды, исправляющие ошибки. — М.: Мир, 1976.
  2. Блейхут Р. Теория и практика кодов, контролирующих ошибки. — М.: Мир, 1986.
  3. S. D. Brown, Z. G. Vranesic «Fundamentals of Digital Logic with Verilog Design». — McGraw-Hill, 2007. (Глава 18: Циклические избыточные коды).
  4. IEEE Std 802.3-2020 – IEEE Standard for Ethernet. (Раздел 3.2.9: CRC-32).
  5. ANSI TIA/EIA-232-F – Стандарт на интерфейс RS-232 (использует CRC-16 для определённых режимов).
  6. A. J. Menezes, P. C. van Oorschot, S. A. Vanstone «Handbook of Applied Cryptography». — CRC Press, 1996. (Глава 11: Проверка целостности с помощью CRC).
  7. Ross Williams «A Painless Guide to CRC-16, CRC-32, and CRC-64». — 1993. (Оригинальная работа по программному вычислению CRC на языке C).
  8. R. M. Goodman, A. M. Andrews «Cyclic Redundancy Checks: A Comprehensive Guide». — 2000. (Обзор алгоритмов CRC).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →