Циклический избыточный код ( CRC ) — это код обнаружения ошибок, обычно используемый в цифровых сетях и устройствах хранения данных для обнаружения случайных изменений цифровых данных. [1] [2] Блоки данных, поступающие в эти системы, получают короткое контрольное значение , прикрепленное на основе остатка полиномиального деления их содержимого. При извлечении вычисление повторяется, и в случае несовпадения контрольных значений можно предпринять корректирующие действия против повреждения данных. CRC можно использовать для исправления ошибок (см. bitfilters ). [3]
CRC так называются, потому что контрольное значение (проверка данных) является избыточным (оно расширяет сообщение без добавления информации ), а алгоритм основан на циклических кодах . CRC популярны, потому что их просто реализовать в двоичном оборудовании , легко анализировать математически и они особенно хороши для обнаружения распространенных ошибок, вызванных шумом в каналах передачи. Поскольку контрольное значение имеет фиксированную длину, функция , которая его генерирует, иногда используется как хэш-функция .
CRC основаны на теории циклических кодов исправления ошибок . Использование систематических циклических кодов, которые кодируют сообщения путем добавления контрольного значения фиксированной длины, с целью обнаружения ошибок в сетях связи, было впервые предложено У. Уэсли Петерсоном в 1961 году. [4] Циклические коды не только просты в реализации, но и имеют то преимущество, что они особенно хорошо подходят для обнаружения пакетных ошибок : непрерывных последовательностей ошибочных символов данных в сообщениях. Это важно, поскольку пакетные ошибки являются распространенными ошибками передачи во многих каналах связи , включая магнитные и оптические устройства хранения данных. Обычно n -битный CRC, примененный к блоку данных произвольной длины, обнаружит любой одиночный пакет ошибок не длиннее n бит, а доля всех более длинных пакетов ошибок, которые он обнаружит, составляет приблизительно (1 − 2 − n ) .
Спецификация кода CRC требует определения так называемого генераторного полинома . Этот полином становится делителем в полиномиальном длинном делении , которое берет сообщение в качестве делимого и в котором частное отбрасывается, а остаток становится результатом. Важное предостережение заключается в том, что полиномиальные коэффициенты вычисляются в соответствии с арифметикой конечного поля , поэтому операция сложения всегда может быть выполнена побитово-параллельно (нет переноса между цифрами).
На практике все обычно используемые CRC используют конечное поле из двух элементов, GF(2) . Два элемента обычно называются 0 и 1, что удобно соответствует архитектуре компьютера.
CRC называется n -битным CRC, когда его контрольное значение имеет длину n бит. Для заданного n возможны несколько CRC, каждая с другим полиномом. Такой полином имеет наивысшую степень n , что означает, что он имеет n + 1 членов. Другими словами, полином имеет длину n + 1 ; его кодирование требует n + 1 бит. Обратите внимание, что большинство спецификаций полиномов либо отбрасывают MSb , либо LSb , поскольку они всегда равны 1. CRC и связанный полином обычно имеют имя в форме CRC- n -XXX, как в таблице ниже.
Простейшая система обнаружения ошибок, бит четности , на самом деле является 1-битным CRC: она использует порождающий полином x + 1 (два члена) [5] и имеет название CRC-1.
Устройство с поддержкой CRC вычисляет короткую двоичную последовательность фиксированной длины, известную как контрольное значение или CRC , для каждого блока данных, который должен быть отправлен или сохранен, и добавляет ее к данным, формируя кодовое слово .
При получении или считывании кодового слова устройство либо сравнивает его контрольное значение с недавно вычисленным из блока данных, либо, что эквивалентно, выполняет CRC для всего кодового слова и сравнивает полученное контрольное значение с ожидаемой константой остатка .
Если значения CRC не совпадают, то блок содержит ошибку данных.
Устройство может предпринять корректирующие действия, например, перечитать блок или запросить его повторную отправку. В противном случае данные считаются безошибочными (хотя с некоторой малой вероятностью они могут содержать необнаруженные ошибки; это заложено в природе проверки ошибок). [6]
CRC специально разработаны для защиты от распространенных типов ошибок на каналах связи, где они могут обеспечить быструю и разумную гарантию целостности доставленных сообщений. Однако они не подходят для защиты от преднамеренного изменения данных.
Во-первых, поскольку аутентификации нет, злоумышленник может редактировать сообщение и пересчитывать CRC без обнаружения подмены. При хранении вместе с данными CRC и криптографические хэш-функции сами по себе не защищают от преднамеренного изменения данных. Любое приложение, которому требуется защита от таких атак, должно использовать механизмы криптографической аутентификации, такие как коды аутентификации сообщений или цифровые подписи (которые обычно основаны на криптографических хэш- функциях).
Во-вторых, в отличие от криптографических хэш-функций, CRC является легко обратимой функцией, что делает ее непригодной для использования в цифровых подписях. [7]
В-третьих, CRC удовлетворяет соотношению, аналогичному соотношению линейной функции (или, точнее, аффинной функции ): [8]
где зависит от длины и . Это можно также сформулировать следующим образом, где и имеют одинаковую длину
В результате, даже если CRC зашифрован с помощью потокового шифра , который использует XOR в качестве операции объединения (или режима блочного шифра , который фактически превращает его в потоковый шифр, такой как OFB или CFB), как сообщение, так и связанный с ним CRC можно манипулировать без знания ключа шифрования; это был один из известных недостатков конструкции протокола Wired Equivalent Privacy (WEP). [9]
Чтобы вычислить n -битный двоичный CRC, выстройте биты, представляющие входные данные, в строку и поместите ( n + 1 )-битный шаблон, представляющий делитель CRC (называемый « полиномом »), под левым концом строки.
В этом примере мы закодируем 14 бит сообщения с помощью 3-битного CRC с полиномом x 3 + x + 1. Полином записывается в двоичном виде в виде коэффициентов; полином 3-й степени имеет 4 коэффициента ( 1 x 3 + 0 x 2 + 1 x + 1 ). В этом случае коэффициенты равны 1, 0, 1 и 1. Результат вычисления имеет длину 3 бита, поэтому он называется 3-битным CRC. Однако для явного указания полинома вам понадобится 4 бита.
Начните с сообщения, которое нужно закодировать:
11010011101100
Сначала он дополняется нулями, соответствующими длине бита n CRC. Это делается для того, чтобы полученное кодовое слово имело систематическую форму. Вот первый расчет для вычисления 3-битного CRC:
11010011101100 000 <--- входной сигнал дополнен справа на 3 бита1011 <--- делитель (4 бита) = x³ + x + 1------------------01100011101100 000 <--- результат
Алгоритм действует на биты, расположенные непосредственно над делителем на каждом шаге. Результатом этой итерации является побитовое XOR полиномиального делителя с битами над ним. Биты, не расположенные над делителем, просто копируются непосредственно под него для этого шага. Затем делитель сдвигается вправо, чтобы выровняться с наивысшим оставшимся 1 битом на входе, и процесс повторяется до тех пор, пока делитель не достигнет правого конца входной строки. Вот полное вычисление:
11010011101100 000 <--- входной сигнал дополнен справа на 3 бита1011 <--- делитель01100011101100 000 <--- результат (обратите внимание, что первые четыре бита — это XOR с делителем под ним, остальные биты не изменяются) 1011 <--- делитель ...00111011101100 000 101100010111101100 000 101100000001101100 000 <--- обратите внимание, что делитель перемещается, чтобы выровняться со следующей 1 в делимом (так как частное для этого шага было равно нулю) 1011 (другими словами, не обязательно сдвигается на один бит за итерацию)00000000110100 000 101100000000011000 000 101100000000001110 000 101100000000000101 000 101 1-----------------00000000000000 100 <--- остаток (3 бита). Алгоритм деления останавливается здесь, так как делимое равно нулю.
Поскольку самый левый бит делителя обнулял каждый входной бит, которого он касался, по завершении этого процесса единственными битами во входной строке, которые могут быть ненулевыми, являются n бит в правом конце строки. Эти n бит являются остатком шага деления и также будут значением функции CRC (если выбранная спецификация CRC не требует некоторой постобработки).
Достоверность полученного сообщения можно легко проверить, выполнив приведенный выше расчет еще раз, на этот раз с добавлением контрольного значения вместо нулей. Остаток должен быть равен нулю, если нет обнаруживаемых ошибок.
11010011101100 100 <--- ввод с контрольным значением1011 <--- делитель01100011101100 100 <--- результат 1011 <--- делитель ...00111011101100 100......00000000001110 100 101100000000000101 100 101 1------------------00000000000000 000 <--- остаток
Следующий код Python описывает функцию, которая вернет начальный остаток CRC для выбранного ввода и полинома с 1 или 0 в качестве начального заполнения. Обратите внимание, что этот код работает со строковыми вводами, а не с необработанными числами:
def crc_remainder ( input_bitstring , polynomial_bitstring , initial_filler ): """Вычисляет остаток CRC строки битов с использованием выбранного полинома. initial_filler должен быть равен '1' или '0'. """ polynomial_bitstring = polynomial_bitstring . lstrip ( '0' ) len_input = len ( input_bitstring ) initial_padding = ( len ( polynomial_bitstring ) - 1 ) * initial_filler input_padded_array = list ( input_bitstring + initial_padding ) while '1' in input_padded_array [: len_input ]: cur_shift = input_padded_array . индекс ( '1' ) для i в диапазоне ( len ( polynomial_bitstring )): input_padded_array [ cur_shift + i ] \ = str ( int ( polynomial_bitstring [ i ] != input_padded_array [ cur_shift + i ])) return '' . join ( input_padded_array )[ len_input :] def crc_check ( input_bitstring , polynomial_bitstring , check_value ): """Вычислить проверку CRC строки битов с использованием выбранного полинома.""" polynomial_bitstring = polynomial_bitstring . lstrip ( '0' ) len_input = len ( input_bitstring ) initial_padding = check_value input_padded_array = list ( input_bitstring + initial_padding ) while '1' in input_padded_array [: len_input ]: cur_shift = input_padded_array . индекс ( '1' ) для i в диапазоне ( len ( polynomial_bitstring )): input_padded_array [ cur_shift + i ] \ = str ( int ( polynomial_bitstring [ i ] != input_padded_array [ cur_shift + i ])) return ( '1' not in'.join ( input_padded_array ) [ len_input : ] )
>>> crc_remainder ( '11010011101100' , '1011' , '0' ) '100' >>> crc_check ( '11010011101100' , '1011' , '100' ) Истина
This section needs additional citations for verification. (July 2016) |
Математический анализ этого процесса, похожего на деление, показывает, как выбрать делитель, гарантирующий хорошие свойства обнаружения ошибок. В этом анализе цифры битовых строк берутся как коэффициенты полинома от некоторой переменной x — коэффициенты, которые являются элементами конечного поля GF(2) (целые числа по модулю 2, т. е. либо ноль, либо единица), а не более привычные числа. Набор двоичных полиномов представляет собой математическое кольцо .
Выбор полинома генератора является наиболее важной частью реализации алгоритма CRC. Полином должен быть выбран для максимизации возможностей обнаружения ошибок при минимизации общей вероятности коллизий.
Самым важным атрибутом полинома является его длина (наибольшая степень (экспонента) +1 любого члена полинома), поскольку она напрямую влияет на длину вычисляемого контрольного значения.
Наиболее часто используемые длины полиномов составляют 9 бит (CRC-8), 17 бит (CRC-16), 33 бита (CRC-32) и 65 бит (CRC-64). [5]
CRC называется n- битным CRC, когда его контрольное значение равно n -битам. Для заданного n возможны несколько CRC, каждая с другим полиномом. Такой полином имеет наивысшую степень n , и, следовательно, n + 1 членов (полином имеет длину n + 1 ). Остаток имеет длину n . CRC имеет имя в форме CRC- n -XXX.
Конструкция полинома CRC зависит от максимальной общей длины защищаемого блока (данные + биты CRC), желаемых функций защиты от ошибок и типа ресурсов для реализации CRC, а также желаемой производительности. Распространенное заблуждение заключается в том, что «лучшие» полиномы CRC выводятся либо из неприводимых полиномов , либо из неприводимых полиномов, умноженных на множитель 1 + x , что добавляет коду возможность обнаруживать все ошибки, влияющие на нечетное количество бит. [10] В действительности все факторы, описанные выше, должны входить в выбор полинома и могут привести к приводимому полиному. Однако выбор приводимого полинома приведет к определенной доле пропущенных ошибок из-за того, что факторное кольцо имеет делители нуля .
Преимущество выбора примитивного полинома в качестве генератора для кода CRC заключается в том, что результирующий код имеет максимальную общую длину блока в том смысле, что все 1-битные ошибки в пределах этой длины блока имеют разные остатки (также называемые синдромами ) и, следовательно, поскольку остаток является линейной функцией блока, код может обнаружить все 2-битные ошибки в пределах этой длины блока. Если — степень примитивного полинома генератора, то максимальная общая длина блока равна , и связанный код способен обнаруживать любые однобитные или двухбитные ошибки. [11] Однако, если мы используем полином генератора , где — примитивный полином степени , то максимальная общая длина блока равна , и код способен обнаруживать одиночные, двойные, тройные и любое нечетное количество ошибок.
Полином , допускающий другие факторизации, может быть выбран таким образом, чтобы сбалансировать максимальную общую длину блока с желаемой мощностью обнаружения ошибок. Коды BCH являются мощным классом таких полиномов. Они включают в себя два приведенных выше примера. Независимо от свойств сводимости генераторного полинома степени r , если он включает в себя термин "+1", код сможет обнаруживать шаблоны ошибок, которые ограничены окном из r смежных бит. Эти шаблоны называются "всплесками ошибок".
Концепция CRC как кода обнаружения ошибок усложняется, когда реализатор или комитет по стандартам используют его для проектирования практической системы. Вот некоторые из сложностей:
Эти осложнения означают, что существует три распространенных способа выразить многочлен как целое число: первые два, которые являются зеркальными отображениями в двоичном коде, являются константами, найденными в коде; третий — число, найденное в работах Купмана. В каждом случае один член опускается. Таким образом, многочлен можно записать как:
В таблице ниже они показаны следующим образом:
Имя | Нормальный | Перевернутый | Обратный обратный |
---|---|---|---|
CRC-4 | 0x3 | 0xС | 0x9 |
CRC в фирменных протоколах можно запутать, используя нетривиальное начальное значение и конечный XOR, но эти методы не добавляют криптографической стойкости алгоритму и могут быть подвергнуты обратному проектированию с использованием простых методов. [12]
Многочисленные разновидности циклических проверок избыточности были включены в технические стандарты . Ни в коем случае один алгоритм или один алгоритм каждой степени не подходит для всех целей; Купман и Чакраварти рекомендуют выбирать полином в соответствии с требованиями приложения и ожидаемым распределением длин сообщений. [13] Количество различных используемых CRC сбило разработчиков с толку, и авторы пытались решить эту проблему. [10] Сообщается о трех полиномах для CRC-12, [13] о двадцати двух противоречивых определениях CRC-16 и о семи для CRC-32. [14]
Полиномы, которые обычно применяются, не являются наиболее эффективными из возможных. С 1993 года Купман, Кастаньоли и другие исследовали пространство полиномов размером от 3 до 64 бит, [13] [15] [16] [17] находя примеры, которые имеют гораздо лучшую производительность (с точки зрения расстояния Хэмминга для заданного размера сообщения), чем полиномы более ранних протоколов, и публикуя лучшие из них с целью улучшения способности обнаружения ошибок будущих стандартов. [16] В частности, iSCSI и SCTP приняли один из результатов этого исследования, полином CRC-32C (Кастаньоли).
Разработка 32-битного полинома, наиболее часто используемого органами стандартизации, CRC-32-IEEE, стала результатом совместных усилий Римской лаборатории и Отдела электронных систем ВВС Джозефа Хаммонда, Джеймса Брауна и Шьян-Шян Лю из Технологического института Джорджии и Кеннета Брейера из корпорации Mitre . Самые ранние известные появления 32-битного полинома были в их публикациях 1975 года: Технический отчет 2956 Брейера для Mitre, опубликованный в январе и выпущенный для публичного распространения через DTIC в августе, [18] и отчет Хаммонда, Брауна и Лю для Римской лаборатории, опубликованный в мае. [19] Оба отчета содержали вклады другой группы. В декабре 1975 года Брейер и Хаммонд представили свою работу в докладе на Национальной телекоммуникационной конференции IEEE: полином IEEE CRC-32 является порождающим полиномом кода Хэмминга и был выбран за его эффективность обнаружения ошибок. [20] Тем не менее, полином Кастаньоли CRC-32C, используемый в iSCSI или SCTP, соответствует его производительности для сообщений от 58 бит до 131 кбит и превосходит его в нескольких диапазонах размеров, включая два наиболее распространенных размера интернет-пакетов. [16] Стандарт ITU-T G.hn также использует CRC-32C для обнаружения ошибок в полезной нагрузке (хотя он использует CRC-16-CCITT для заголовков PHY ).
Вычисление CRC-32C реализовано на аппаратном уровне как операция ( CRC32
) набора инструкций SSE4.2 , впервые представленного в микроархитектуре Nehalem процессоров Intel . Архитектура ARM AArch64 также обеспечивает аппаратное ускорение для операций CRC-32 и CRC-32C.
В таблице ниже перечислены только полиномы различных используемых алгоритмов. Вариации конкретного протокола могут налагать предынверсию, постинверсию и обратный порядок бит, как описано выше. Например, CRC32, используемый в Gzip и Bzip2, использует один и тот же полином, но Gzip использует обратный порядок бит, а Bzip2 — нет. [14] Обратите внимание, что четные полиномы четности в GF(2) со степенью больше 1 никогда не являются примитивными. Четный полином четности, отмеченный как примитивный в этой таблице, представляет собой примитивный полином, умноженный на . Самый старший бит полинома всегда равен 1 и не отображается в шестнадцатеричных представлениях.
Имя | Использует | Полиномиальные представления | Паритет [21] | Примитивный [22] | Максимальное количество бит полезной нагрузки по расстоянию Хэмминга [23] [16] [22] | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Нормальный | Перевернутый | Взаимный | Обратный обратный | ≥ 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 [24] | ||||
CRC-1 | большинство аппаратных средств; также известно как бит четности | 0x1 | 0x1 | 0x1 | 0x1 | даже | ||||||||||||||||
CRC-3- GSM | мобильные сети [25] | 0x3 | 0x6 | 0x5 | 0x5 | странный | да [26] | – | – | – | – | – | – | – | – | – | – | – | – | – | 4 | ∞ |
CRC-4-МСЭ | МСЭ-Т G.704, стр. 12 | 0x3 | 0xС | 0x9 | 0x9 | странный | ||||||||||||||||
CRC-5-EPC | RFID-технология второго поколения [27] | 0x09 | 0x12 | 0x05 | 0x14 | странный | ||||||||||||||||
CRC-5-МСЭ | МСЭ-Т G.704, стр. 9 | 0x15 | 0x15 | 0x0B | 0x1A | даже | ||||||||||||||||
CRC-5-USB | Пакеты USB- токенов | 0x05 | 0x14 | 0x09 | 0x12 | странный | ||||||||||||||||
CRC-6- CDMA2000 -A | мобильные сети [28] | 0x27 | 0x39 | 0x33 | 0x33 | странный | ||||||||||||||||
CRC-6- CDMA2000 -B | мобильные сети [28] | 0x07 | 0x38 | 0x31 | 0x23 | даже | ||||||||||||||||
CRC-6-DARC | Радиоканал передачи данных [29] | 0x19 | 0x26 | 0x0D | 0x2С | даже | ||||||||||||||||
CRC-6- GSM | мобильные сети [25] | 0x2F | 0x3D | 0x3Б | 0x37 | даже | да [30] | – | – | – | – | – | – | – | – | – | – | 1 | 1 | 25 | 25 | ∞ |
CRC-6-МСЭ | МСЭ-Т G.704, стр. 3 | 0x03 | 0x30 | 0x21 | 0x21 | странный | ||||||||||||||||
CRC-7 | телекоммуникационные системы, ITU-T G.707, ITU-T G.832, MMC , SD | 0x09 | 0x48 | 0x11 | 0x44 | странный | ||||||||||||||||
CRC-7-МВБ | Сеть железнодорожной связи , IEC 60870-5 [31] | 0x65 | 0x53 | 0x27 | 0x72 | странный | ||||||||||||||||
CRC-8 | DVB-S2 [32] | 0xD5 | 0xAB | 0x57 | 0xEA [13] | даже | нет [33] | – | – | – | – | – | – | – | – | – | – | 2 | 2 | 85 | 85 | ∞ |
CRC-8- AUTOSAR | автомобильная интеграция, [34] OpenSafety [35] | 0x2F | 0xF4 | 0xE9 | 0x97 [13] | даже | да [33] | – | – | – | – | – | – | – | – | – | – | 3 | 3 | 119 | 119 | ∞ |
CRC-8- Bluetooth | беспроводное подключение [36] | 0xA7 | 0xE5 | 0xCB | 0xD3 | даже | ||||||||||||||||
CRC-8- CCITT | ITU-T I.432.1 (02/99); ATM HEC , ISDN HEC и разграничение ячеек, SMBus PEC | 0x07 | 0xE0 | 0xC1 | 0x83 | даже | ||||||||||||||||
CRC-8- Даллас / Максим | 1-проводная шина [37] | 0x31 | 0x8С | 0x19 | 0x98 | даже | ||||||||||||||||
CRC-8-DARC | Радиоканал передачи данных [29] | 0x39 | 0x9C | 0x39 | 0x9C | странный | ||||||||||||||||
CRC-8- GSM -B | мобильные сети [25] | 0x49 | 0x92 | 0x25 | 0xА4 | даже | ||||||||||||||||
CRC-8- SAE J1850 | AES3 ; ОБД | 0x1D | 0xB8 | 0x71 | 0x8E | странный | ||||||||||||||||
CRC-8-WCDMA | мобильные сети [28] [38] | 0x9Б | 0xD9 | 0xB3 | 0xCD [13] | даже | ||||||||||||||||
КПР-10 | АТМ; МСЭ-Т I.610 | 0x233 | 0x331 | 0x263 | 0x319 | даже | ||||||||||||||||
CRC-10- CDMA2000 | мобильные сети [28] | 0x3D9 | 0x26F | 0x0DF | 0x3EC | даже | ||||||||||||||||
CRC-10- GSM | мобильные сети [25] | 0x175 | 0x2BA | 0x175 | 0x2BA | странный | ||||||||||||||||
КПР-11 | ФлексРэй [39] | 0x385 | 0x50E | 0x21D | 0x5C2 | даже | ||||||||||||||||
КПР-12 | телекоммуникационные системы [40] [41] | 0x80F | 0xF01 | 0xE03 | 0xC07 [13] | даже | ||||||||||||||||
CRC-12- CDMA2000 | мобильные сети [28] | 0xF13 | 0xC8F | 0x91F | 0xF89 | даже | ||||||||||||||||
CRC-12- GSM | мобильные сети [25] | 0xD31 | 0x8CB | 0x197 | 0xE98 | странный | ||||||||||||||||
CRC-13-BBC | Сигнал времени, Радиотелекоммутатор [42] [43] | 0x1CF5 | 0x15E7 | 0x0BCF | 0x1E7A | даже | ||||||||||||||||
CRC-14-DARC | Радиоканал передачи данных [29] | 0x0805 | 0x2804 | 0x1009 | 0x2402 | даже | ||||||||||||||||
CRC-14- GSM | мобильные сети [25] | 0x202D | 0x2D01 | 0x1A03 | 0x3016 | даже | ||||||||||||||||
CRC-15- CAN | 0xC599 [44] [45] | 0x4CD1 | 0x19A3 | 0x62CC | даже | |||||||||||||||||
CRC-15- MPT1327 | [46] | 0x6815 | 0x540Б | 0x2817 | 0x740A | странный | ||||||||||||||||
CRC-16-Чакраварти | Оптимально для полезных нагрузок ≤64 бит [31] | 0x2F15 | 0xA8F4 | 0x51E9 | 0x978A | странный | ||||||||||||||||
CRC-16- ARINC | Приложения ACARS [47] | 0xA02B | 0xD405 | 0xA80B | 0xD015 | странный | ||||||||||||||||
CRC-16-CCITT | X.25 , V.41 , HDLC FCS , XMODEM , Bluetooth , PACTOR , SD , DigRF и многие другие; известный как CRC-CCITT | 0x1021 | 0x8408 | 0x811 | 0x8810 [13] | даже | ||||||||||||||||
CRC-16- CDMA2000 | мобильные сети [28] | 0xC867 | 0xE613 | 0xCC27 | 0xE433 | странный | ||||||||||||||||
CRC-16- DECT | беспроводные телефоны [48] | 0x0589 | 0x91A0 | 0x2341 | 0x82C4 | даже | ||||||||||||||||
CRC-16- T10 - DIF | SCSI- ДИФ | 0x8BB7 [49] | 0xEDD1 | 0xDBA3 | 0xC5DB | странный | ||||||||||||||||
CRC-16- DNP | DNP, IEC 870 , M-Bus | 0x3D65 | 0xA6BC | 0x4D79 | 0x9EB2 | даже | ||||||||||||||||
CRC-16- IBM | Bisync , Modbus , USB , ANSI X3.28, SIA DC-07, многие другие; также известны как CRC-16 и CRC-16-ANSI | 0x8005 | 0xA001 | 0x4003 | 0xC002 | даже | ||||||||||||||||
CRC-16- OpenSafety -A | безопасность полевой шины [35] | 0x5935 | 0xAC9A | 0x5935 | 0xAC9A [13] | странный | ||||||||||||||||
CRC-16- OpenSafety -B | безопасность полевой шины [35] | 0x755B | 0xDAAE | 0xB55D | 0xBAAD [13] | странный | ||||||||||||||||
CRC-16- Profibus | сети полевых шин [50] | 0x1DCF | 0xF3B8 | 0xE771 | 0x8EE7 | странный | ||||||||||||||||
Флетчер-16 | Используется в контрольных суммах Adler-32 A и B | Часто путают с CRC, но на самом деле это контрольная сумма; см. контрольную сумму Флетчера. | ||||||||||||||||||||
CRC-17-CAN | CAN FD [51] | 0x1685B | 0x1B42D | 0x1685B | 0x1B42D | даже | ||||||||||||||||
CRC-21-CAN | CAN FD [51] | 0x102899 | 0x132281 | 0x064503 | 0x18144C | даже | ||||||||||||||||
КПР-24 | ФлексРэй [39] | 0x5D6DCB | 0xD3B6BA | 0xA76D75 | 0xAEB6E5 | даже | ||||||||||||||||
CRC-24- Radix-64 | OpenPGP , RTCM 104v3 | 0x864CFB | 0xDF3261 | 0xBE64C3 | 0xC3267D | даже | ||||||||||||||||
CRC-24- WCDMA | Используется в ОС OS-9 RTOS . Остаток = 0x800FE3. [52] | 0x800063 | 0xC60001 | 0x8C0003 | 0xC00031 | даже | да [53] | – | – | – | – | – | – | – | – | – | – | 4 | 4 | 8388583 | 8388583 | ∞ |
КПР-30 | CDMA | 0x2030B9C7 | 0x38E74301 | 0x31CE8603 | 0x30185CE3 | даже | ||||||||||||||||
КПР-32 | ISO 3309 ( HDLC ), ANSI X3.66 ( ADCCP ), FIPS PUB 71, FED-STD-1003, ITU-T V.42 , ISO/IEC/IEEE 802-3 ( Ethernet ), SATA , MPEG-2 , PKZIP , Gzip , Bzip2 , POSIX cksum , [54] PNG , [55] ZMODEM и многие другие | 0x04C11DB7 | 0xEDB88320 | 0xDB710641 | 0x82608EDB [16] | странный | да | – | 10 | – | – | 12 | 21 | 34 | 57 | 91 | 171 | 268 | 2974 | 91607 | 4294967263 | ∞ |
CRC-32C (Кастаньоли) | iSCSI , SCTP , полезная нагрузка G.hn , SSE4.2 , Btrfs , ext4 , Ceph | 0x1EDC6F41 | 0x82F63B78 | 0x05EC76F1 | 0x8F6E37A0 [16] | даже | да | 6 | – | 8 | – | 20 | – | 47 | – | 177 | – | 5243 | – | 2147483615 | – | ∞ |
CRC-32K (Купман {1,3,28}) | Отлично подходит для длины кадра Ethernet, плохая производительность для длинных файлов [ требуется ссылка ] | 0x741B8CD7 | 0xEB31D82E | 0xD663B05D | 0xBA0DC66B [16] | даже | нет | 2 | – | 4 | – | 16 | – | 18 | – | 152 | – | 16360 | – | 114663 | – | ∞ |
CRC-32K 2 (Купман {1,1,30}) | Отлично подходит для длины кадра Ethernet, плохая производительность для длинных файлов [ требуется ссылка ] | 0x32583499 | 0x992C1A4C | 0x32583499 | 0x992C1A4C [16] | даже | нет | – | – | 3 | – | 16 | – | 26 | – | 134 | – | 32738 | – | 65506 | – | ∞ |
CRC-32Q | авиация; AIXM [56] | 0x814141AB | 0xD5828281 | 0xAB050503 | 0xC0A0A0D5 | даже | ||||||||||||||||
Адлер-32 | Часто путают с CRC, но на самом деле это контрольная сумма; см. Adler-32 | |||||||||||||||||||||
CRC-40- GSM | Канал управления GSM [57] [58] [59] | 0x0004820009 | 0x9000412000 | 0x2000824001 | 0x8002410004 | даже | ||||||||||||||||
CRC-64- ECMA | ECMA-182 стр. 51, XZ Utils | 0x42F0E1EBA9EA3693 | 0xC96C5795D7870F42 | 0x92D8AF2BAF0E1E85 | 0xA17870F5D4F51B49 | даже | ||||||||||||||||
CRC-64-ИСО | ISO 3309 ( HDLC ), Swiss-Prot / TrEMBL ; считается слабым для хеширования [60] | 0x000000000000001B | 0xD800000000000000 | 0xB000000000000001 | 0x8000000000000000D | странный | ||||||||||||||||
Механизм циклического избыточного кода (CRC) используется для защиты данных и обеспечения защиты целостности от битов ошибок при передаче данных от отправителя к получателю.
избыточный код (CRC) — эффективный метод обеспечения низкой вероятности необнаруженных ошибок при передаче данных с использованием контрольной суммы, получаемой в результате деления полиномов.
Представленные методы предлагают очень простой и эффективный способ изменения ваших данных таким образом, чтобы они вычислялись до CRC, который вы хотите или, по крайней мере, знаете заранее.