Калькулятор контрольной суммы CRC32

Вычисляйте контрольную сумму CRC-32 или CRC-32C текста, hex-байтов или целого файла, выводите её в hex, десятичном виде или Base64 и сравнивайте с ожидаемым значением. Файлы читаются локально и никуда не загружаются.

Все алгоритмы

Работает полностью в браузере. Данные никуда не загружаются.

Как пользоваться

  1. Введите или вставьте текст, переключите формат ввода на «Hex» для необработанных байтов или откройте файл, чтобы вычислить контрольную сумму его содержимого.
  2. Оставьте в параметре «Алгоритм» значение CRC-32 для архивов ZIP и gzip и изображений PNG или выберите CRC-32C для iSCSI, файловых систем ext4 и Btrfs и облачного хранилища Google Cloud Storage.
  3. Выберите формат вывода: «hex (нижний регистр)», «HEX (верхний регистр)», «Десятичный» или «Base64».
  4. Для проверки вставьте ожидаемую контрольную сумму в поле «Сравнить с» — в hex без 0x, в десятичном виде или в Base64.

Что такое контрольная сумма CRC32

Циклический избыточный код (CRC) рассматривает входные данные как один длинный двоичный многочлен, делит его на фиксированный порождающий многочлен и сохраняет остаток. У CRC-32 остаток занимает 32 бита и обычно записывается 8 шестнадцатеричными цифрами или беззнаковым числом от 0 до 4 294 967 295. Практически любое изменение данных меняет остаток.

CRC рассчитаны на ошибки, которые возникают в реальных кабелях, радиоканалах и дисках. CRC-32 обнаруживает любую пакетную ошибку длиной до 32 бит, а случайное повреждение остаётся незамеченным лишь примерно в одном случае из 4,3 миллиарда. Кроме того, CRC-32 очень быстро вычисляется, поэтому он встроен в ZIP, gzip, PNG и кадры Ethernet.

CRC-32 и CRC-32C

CRC-32CRC-32C (Castagnoli)
Многочлен0x04C11DB7, в отражённой форме 0xEDB883200x1EDC6F41, в отражённой форме 0x82F63B78
Контрольное значение для 123456789cbf43926e3069283
Где используетсяZIP, gzip, PNG, EthernetiSCSI, SCTP, метаданные ext4, Btrfs, Google Cloud Storage
Аппаратная поддержкаИнструкции CRC32 в ARMv8Инструкция x86 SSE4.2 crc32, ARMv8

Оба алгоритма начинают с 0xFFFFFFFF, обрабатывают биты каждого байта начиная с младшего и инвертируют итоговое значение; различается только многочлен, поэтому одни и те же данные дают два никак не связанных результата. Первый вариант — это то, что большинство инструментов называет «CRC32»; в каталогах он значится как CRC-32/ISO-HDLC. CRC-32C позже приняли протоколы хранения данных и сетевые протоколы за более надёжное обнаружение ошибок. Google Cloud Storage сообщает CRC-32C, а Amazon S3 — любой из двух вариантов; оба сервиса записывают значение как Base64 от четырёх байтов в порядке big-endian, и именно это показывает вывод в формате Base64.

Контрольная сумма, а не проверка безопасности

CRC защищает от случайностей, а не от атак. Это линейная функция, поэтому любой может изменить файл, а затем подогнать четыре байта так, чтобы его CRC-32 остался прежним. Значит, совпадение CRC ничего не говорит о преднамеренной подмене. Чтобы проверить скачанный файл, сравните хеш SHA-256 из доверенного источника; чтобы подтвердить, кто отправил сообщение, используйте HMAC.

Кроме того, 32 бита — слишком мало для идентификации данных. Уже среди примерно 77 000 случайных файлов вероятность того, что у каких-то двух совпадёт CRC-32, достигает 50%, поэтому не используйте его как уникальный идентификатор или ключ дедупликации. Там, где злоумышленника нет, гораздо лучшими отпечатками будут MD5 или SHA-256.

CRC32 в коде

# Python: в Python 3 zlib.crc32 возвращает беззнаковое число;
# "& 0xffffffff" нужен только в Python 2
import zlib
format(zlib.crc32(b'123456789'), '08x')    # 'cbf43926'

// Node.js 20.15+ и 22.2+
require('zlib').crc32('123456789').toString(16).padStart(8, '0')   // 'cbf43926'

// Go (import "hash/crc32")
crc32.ChecksumIEEE(data)                                   // CRC-32
crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli))    // CRC-32C

// Java: java.util.zip.CRC32, а начиная с Java 9 и java.util.zip.CRC32C

// PHP
sprintf('%08x', crc32('123456789'));   // 'cbf43926'
hash('crc32b', '123456789');           // 'cbf43926', тот же CRC-32
hash('crc32c', '123456789');           // 'e3069283'
hash('crc32', '123456789');            // '181989fc', другой CRC

Будьте внимательны с названиями в PHP: алгоритм хеширования crc32 — это не контрольная сумма ZIP, а CRC из bzip2, выводимый в обратном порядке байтов. Чтобы получить тот же результат, что в ZIP, gzip и этом инструменте, используйте crc32b или функцию crc32(). Команда Unix cksum использует ещё один вариант, который вдобавок учитывает длину файла, поэтому её число не совпадёт ни с одним из них.

Примеры

Исходные данные (UTF-8)CRC-32
Hello, World!ec4ac3d0
Base64.is915d7207
你好50a2b841

Часто задаваемые вопросы

Чему равен CRC32 строки «123456789»?
Эта строка — стандартные тестовые данные для алгоритмов CRC. Её CRC-32 равен cbf43926 (3421780262 в десятичном виде), а CRC-32C — e3069283. Если ваша реализация возвращает эти значения, она использует те же параметры, что и этот инструмент.
Почему мой CRC32 отличается от результата другого инструмента?
Проверьте четыре вещи: вариант алгоритма (CRC-32, CRC-32C, CRC из bzip2 и POSIX cksum дают разные результаты), входные байты (окончания строк, перевод строки в конце, кодировка текста), формат числа (некоторые языки возвращают знаковое 32-битное целое, из-за чего большие значения становятся отрицательными) и порядок байтов.
Почему байты CRC в моём файле ZIP или gzip идут в обратном порядке?
ZIP и gzip хранят CRC-32 в порядке little-endian, поэтому в hex-редакторе четыре байта выглядят переставленными в обратном порядке по сравнению с обычной записью. PNG хранит его в порядке big-endian. Этот инструмент, unzip -v и большинство других программ выводят старший байт первым.
Можно ли вычислить CRC32 большого файла?

Да. Нажмите «Открыть файл», и контрольная сумма будет вычислена по байтам файла на вашем устройстве без загрузки на сервер; подойдёт любой файл, который браузер может удержать в памяти. Затем результат можно сравнить со значением из файла SFV или из списка содержимого ZIP-архива.

Является ли CRC32 хеш-функцией?

Он отображает данные любой длины в фиксированное 32-битное значение, поэтому его часто перечисляют вместе с хешами, но это контрольная сумма: она обнаруживает случайные ошибки и никак не защищает от того, кто меняет данные намеренно. Если нужен более надёжный отпечаток, таблица «Все алгоритмы» под результатом показывает MD5 и семейство SHA для тех же входных данных.