Я ищу стандартизированные тестовые векторы для реализации алгоритма CRC32.

Мне пришлось заменить реализацию CRC32 в системе, над которой я работаю, алгоритм, который был реализован ранее, использовал таблицу поиска размером 256, и она была слишком большой для использования в загрузчике. Новый алгоритм, который я реализовал, использует справочную таблицу размера 16.

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

Кто-нибудь знает, где я могу найти надежный стандартизированный тестовый вектор для реализации CRC32?

Спасибо!


person Oscar_Mariani    schedule 14.01.2014    source источник


Ответы (3)


Да, этот каталог CRC. В каждое определение CRC включено значение check, которое представляет собой результат CRC для девятибайтовой строки "123456789", введенной в ASCII/UTF-8. Например, CRC-32("123456789", 9) = 0xcbf43926.

Почему бы вам просто не сравнить новую реализацию со старой?

person Mark Adler    schedule 14.01.2014
comment
@codeling: это не единственная информация в ответе. Ответ заключается в сравнении нового со старым. У него уже есть генератор тестовых векторов со старым алгоритмом. Ссылка является бонусной информацией. - person Mark Adler; 25.11.2015
comment
Хм, когда я комментировал, ссылка все еще была единственной информацией, смотрите историю. Но на самом деле мне кажется, что ссылка именно то, о чем просил ОП, так что мое сегодняшнее «я» сейчас будет в порядке с этим ответом;). Кстати, не я проголосовал. - person codeling; 26.11.2015
comment
Это действительно может быть каталог реализаций CRC, но не тестовых векторов. - person Anton Samsonov; 01.10.2016
comment
@AntonSamsonov Каждое определение имеет один тестовый вектор. Контрольное значение — это CRC этого определения девятибайтовой строки 123456789. ОП запросил тестовый вектор для реализаций CRC32. - person Mark Adler; 01.10.2016

Ни в коей мере не стандартизированы, — просто собраны для удобства:

// Trivial one.
UINT32_C(0x00000000), ""

// Source: https://rosettacode.org/wiki/CRC-32
UINT32_C(0x414FA339), "The quick brown fox jumps over the lazy dog"

// Source: http://cryptomanager.com/tv.html
UINT32_C(0x9BD366AE), "various CRC algorithms input data"

// Source: http://www.febooti.com/products/filetweak/members/hash-and-crc/test-vectors/
UINT32_C(0x0C877F61), "Test vector from febooti.com"

Что делать, если ваши результаты не совпадают? Обязательно проверяйте, какую разновидность CRC вы внедряете и с чем сравниваете, — хороший пример такого поиска можно найти в “Контрольные суммы CRC32; The Good, The Bad, And The Ugly», в которой показано, что некоторые программы могут выполнять дополнительную обработку после идентичных операций, таких как передача длины сообщения через контрольную сумму, что может< /em> или может быть не описана в документации.

person Anton Samsonov    schedule 01.10.2016

В репозитории Ironclad есть несколько тестовых векторов, которые могут быть полезны:

;;; standard tests for crc32

(:digest-test #a"" #h"00000000")
(:digest-test #a"a" #h"e8b7be43")
(:digest-test #a"abc" #h"352441c2")
(:digest-test #a"message digest" #h"20159d7f")
(:digest-test #a"abcdefghijklmnopqrstuvwxyz" #h"4c2750bd")
(:digest-test #a"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" #h"1fc2e6d2")
(:digest-test #a"12345678901234567890123456789012345678901234567890123456789012345678901234567890" #h"7ca94a72")

https://github.com/froydnj/ironclad/blob/master/testing/test-vectors/crc32.testvec

person Nathan Moinvaziri    schedule 17.09.2019