Разное

Crc32 алгоритм: Особенности программной реализации вычисления контрольной суммы CRC32 на примере PKZIP, WinZIP, ETHERNET

Особенности программной реализации вычисления контрольной суммы CRC32 на примере PKZIP, WinZIP, ETHERNET

%PDF-1.5 % 1 0 obj > endobj 5 0 obj /Author /Creator () /Subject /Keywords (http://sjs.tpu.ru) /Producer (PDF-XChange \(PDFTools4.exe v4.0.0186.0000\) \(Windows\)) >> endobj 2 0 obj > endobj 3 0 obj > endobj 4 0 obj > stream

  • Особенности программной реализации вычисления контрольной суммы CRC32 на примере PKZIP, WinZIP, ETHERNET
  • Мыцко Евгений Алексеевич; Мальчуков Андрей Николаевич endstream endobj 6 0 obj > /Parent 2 0 R /Contents [11 0 R 12 0 R 13 0 R] /MediaBox [0 0 595.
    >{g_wwWWasO膊͋~ h:p6|`o?l~~’// 3ja$(}{د}CUgi?jqEɥpsڱK/ dn~rc*cr(oLA?obN@\8+*owh3q:&?/

    что это и почему это важно — Журнал «Код»

    Сегодня в вашем лексиконе появится важная новая фраза: контрольная сумма. Это инструмент опытных разработчиков, админов и хакеров, и сегодня он станет вашим.

    Представьте ситуацию: вы приходите в магазин за наушниками. Находите нужные на витрине, пробуете их, вам всё нравится. Вы просите продавца принести такие же со склада, в упаковке.

    Продавец приносит коробку, и вы понимаете, что вас хотят обмануть. Упаковку явно до этого вскрывали, в комплекте не все провода и накладки, плёночки сняты. Этими наушниками явно пользовались до вас.

    Сотрудник говорит, что это ошибка в списке комплектности, а товар на самом деле новый, просто такой пришёл с завода. Вы ему не верите, отказываетесь от покупки и идёте в другой магазин. Там вы находите такие же наушники, проверяете и радуетесь, что купили нужную вещь.

    В мире информации происходит почти то же самое: товар на складе — это какие-то данные, а список комплектности товара — это контрольная сумма, которая показывает, изменялись эти данные или нет. Если понимать, что это такое и как этим пользоваться, можно проверить подлинность файла и обезопасить себя от подделок, вирусов и шпионов.

    Как это работает

    На самом деле именно контрольной суммы уже нет — это название нам досталось с тех времён, когда для проверки точности передачи данных использовали 7 бит вместо 8. Восьмой бит был контрольным, и в нём находилась сумма первых семи бит без учёта старших разрядов. Когда получателю приходила очередная порция данных, он складывал 7 бит и сравнивал сумму с восьмым. Если они совпадали, значит, данные, скорее всего, передались верно. Тогда линии связи были не такими надёжными, как сейчас, и если что-то передавалось неправильно, такие данные нужно было отправить заново. С тех пор и пошло понятие контрольной суммы.

    Сейчас сумму уже никто не использует, а вместо этого работают специальные программы:

    1. Берут данные, для которых нужно составить контрольную сумму.
    2. По специальному алгоритму эти данные превращаются в одну строку из символов.
    3. Эту строку текста прикладывают к исходному файлу и говорят — ребята, вот контрольная сумма (то есть строка). Если вы не уверены, что всё скачали правильно, проверьте.
    4. Те, кто скачал исходный файл, запускают программу проверки контрольных сумм и говорят ей — вот файл, а вот его контрольная сумма, проверь, пожалуйста, всё ли тут правильно.
    5. Программа сама составляет контрольную сумму по тому же алгоритму и сравнивает с вашей.
    6. Если контрольные суммы совпадают — всё отлично, данные в порядке, можно пользоваться. Если нет — программа выведет сообщение, что суммы отличаются. Это значит, что во время скачивания возникла ошибка или кто-то специально подменил исходные данные, чтобы навредить вам.

    Смысл технологии в том, что для любого файла и алгоритма есть только одна контрольная сумма. Если в файле изменить предложение, слово или несколько символов, контрольная сумма будет уже другой. Это как цифровой отпечаток пальца, только для данных.

    Как работает сканер отпечатка пальца

    Самый простой вариант организовать контрольную сумму — использовать хеши, например, MD5. Мы уже говорили про хеши в статье про Фейсбук и утерянные пароли, но MD5 — многогранная вещь, и в своё время его все использовали для создания контрольных сумм.

    Но примерно с 2006 года все стали переходить на другие алгоритмы (CRC32, SHA-1, SHA-2 или MD5crypt). Дело в том, что уже есть методы, которые за приемлемое время могут взломать MD5-хеш и сделать другой файл с тем же размером и почти таким же содержимым, что и ваш. Это значит, что злоумышленник может подделать данные таким образом, что проверка контрольной суммы пройдёт успешно и вы будете думать, что всё в порядке.

    Почему это важно

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

    Например, вы качаете новую прошивку на свой телефон. Если файл скачается неправильно, не до конца или с ошибками, во время перепрошивки телефон может сломаться, и восстановить его будет уже нельзя. Чтобы такого не было, производители прошивок прикладывают к файлам контрольную сумму, чтобы каждый мог проверить перед перепрошивкой, в порядке ли сам файл.

    Чаще всего контрольную сумму используют разработчики ПО, которые выкладывают на своих страницах официальный софт и драйвера. Они говорят: ребята, вот файл, а вот его контрольная сумма. Если качаете у нас — проверьте, без ошибок ли вы скачали. А если качаете не у нас — сравните их контрольную сумму с нашей, вдруг они вам под видом драйвера хотят подсунуть какой-то вирус.

    c — Как рассчитывается контрольная сумма CRC32?

    Полином для CRC32:

    x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 10 + x 8 + x 7 + х 5 + х 4 + х 2 + х + 1

    • Википедия
    • Расчет CRC

    Или в шестнадцатеричном и двоичном формате:

    0x 01 04 C1 1D B7
    1 0000 0100 1100 0001 0001 1101 1011 0111

    Старший член (x 32 ) обычно не записывается явно, поэтому вместо этого он может быть представлен в шестнадцатеричном виде как

    0x 04 С1 1D В7

    Не стесняйтесь считать 1 и 0, но вы обнаружите, что они совпадают с многочленом, где

    1 — это бит 0 (или первый бит), а x — это бит 1 (или второй бит).

    Почему этот многочлен? Потому что должен быть заданный полином стандарта, а стандарт был установлен IEEE 802.3. Кроме того, чрезвычайно сложно найти полином, эффективно обнаруживающий различные битовые ошибки. 90 (или тот исходный номер, который у нас был)

    Я знаю, что это прыжок веры, но это выходит за рамки моих возможностей как линейного программиста. Если вы заядлый студент CS или инженер, я предлагаю разобрать это. Этот анализ будет полезен всем.

    Итак, для полного примера:

     Исходное сообщение: 1101011011
       Полином ширины (ширины) 4: 10011
       Сообщение после добавления W нулей: 11010110110000
     

    Теперь мы разделим дополненное сообщение на Poly, используя арифметику CRC. Это то же деление, что и раньше:

     1100001010 = Частное (частное никого не волнует)
           _______________
    10011 ) 11010110110000 = Расширенное сообщение (1101011011 + 0000)
    =Поли 10011,.,....
            -----,.,....
             10011,.,....
             10011,.,....
             -----,.
    ,.... 00001.,.... 00000.,.... -----.,.... 00010,.... 00000,.... -----,.... 00101,.... 00000,.... -----,.... 01011.... 00000.... -----.... 10110... 10011... -----... 01010.. 00000.. -----.. 10100. 10011. -----. 01110 00000 ----- 1110 = Остаток = КОНТРОЛЬНАЯ СУММА!!!!

    Деление дает частное, которое мы отбрасываем, и остаток, представляющий собой рассчитанную контрольную сумму. На этом расчет заканчивается. Обычно к сообщению добавляется контрольная сумма, и результат передается. В этом случае передача будет: 11010110111110.

    • Учебник CRC, Глава 7

    В качестве делителя используйте только 32-битное число, а в качестве дивиденда используйте весь поток. Выбросьте частное и сохраните остаток. Прикрепите остаток в конце вашего сообщения, и у вас есть CRC32.

    Средний отзыв парня:

     ЧАСТНОЕ
            ----------
    ДЕЛИТЕЛЬ ) ДИВИДЕНД
                     = ОСТАТОК
     
    1. Возьмите первые 32 бита.
    2. Биты сдвига
    3. Если 32 бита меньше, чем ДЕЛИТЕЛЬ, перейдите к шагу 2.
    4. XOR 32 бита с помощью DIVISOR. Перейти к шагу 2.

    (Обратите внимание, что поток должен быть разделен на 32 бита, иначе он должен быть дополнен. Например, 8-битный поток ANSI должен быть дополнен. Также в конце потока разделение останавливается.)

    c — Быстрый алгоритм CRC?

    спросил

    Изменено 1 год, 3 месяца назад

    Просмотрено 30 тысяч раз

    Я хочу создать 32-битное число из строки ASCII. Алгоритм CRC32 — это именно то, что я ищу, но я не могу его использовать, потому что требуемая таблица слишком велика (это для встроенной системы, где ресурсы ОЧЕНЬ редки).

    Итак, есть предложения по быстрому и тонкому алгоритму CRC? Не имеет значения, когда коллизии немного более вероятны, чем с исходным CRC32.

    • c
    • алгоритм
    • встроенный
    • crc
    • crc32

    11

    Реализации CRC используют таблицы для ускорения. Они не требуются.

    Вот короткая CRC32, использующая либо полином Кастаньоли (тот же, что используется в инструкции Intel crc32), либо полином Ethernet (тот же, что используется в zip, gzip и т. д.). 9ПОЛИ: crc >> 1; } возврат ~CRC; }

    Начальное значение crc должно быть равно нулю. Процедура может вызываться последовательно с порциями данных для обновления CRC. Вы можете развернуть внутренний цикл для ускорения, хотя ваш компилятор все равно может сделать это за вас.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *