2

我不得不在我正在处理的系统上替换 CRC32 实现,之前实现的算法使用大小为 256 的查找表,并且太大而无法在引导加载程序中使用。我实现的新算法使用大小为 16 的查找表。

我使用与以前相同的多项式,但结果不同。在线计算器会抛出更多随机结果,其中大多数都不是很清楚他们在做什么,即他们正在使用哪个多项式,输入数据是什么格式或初始 crc 值是什么。

有谁知道我在哪里可以找到用于 CRC32 实现的可靠、标准化的测试向量?

谢谢!

4

3 回答 3

3

是的,这个 CRC 目录。每个 CRC 定义都包含一个 check值——这是 CRC 对 ASCII / UTF-8 输入的 9 字节字符串“123456789”的输出。例如,CRC-32("123456789", 9) = 0xcbf43926。

为什么不简单地将新实现与旧实现进行比较?

于 2014-01-14T14:35:28.363 回答
1

没有任何形式的标准化,只是为了方便而收集的:

// 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,这样的挖掘的一个很好的例子可以在“<a href="https://blog.box.com/blog/crc32-checksums-the- good-the-bad-and-the-ugly/" rel="nofollow">CRC32 校验和;The Good, The Bad, And The Ugly”一文,其中表明某些程序可能会在其他相同的操作之后进行额外的处理,例如通过校验和传输消息的长度,文档中可能包含也 可能不包含。

于 2016-10-01T10:38:00.833 回答
1

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

zlib-ng 中也有一些测试:

https://github.com/zlib-ng/zlib-ng/blob/develop/test/crc32_test.c

于 2019-09-17T21:35:57.260 回答