如何计算 CRC32 算法对内存块的错误检测能力?

How to calculate the error detection capability of a CRC32 algorithm over a memory block?

我遇到了一个似乎很难回答的问题。

我已经实现了一项功能,可以根据修改的数据(主要是未经授权的用户)检查特定范围的 ROM。这是对已经活跃的 ECC/EDC 引擎保护数据免受硬件随机故障(使用不同算法)的补充。

基本上在构建时,CRC32 在整个数据 ROM(在链接器文件中明确定义)上计算并存储在特定位置。 然后在设备启动期间,该函数将计算的数据 ROM CRC 与存储在已知位置的 CRC 进行比较。

检查的方法是使用微控制器特定指令一次计算超过 4 个字节的 CRC32,并保留将携带的中间结果,直到检查最后 4 个字节,此时将获得最终的 CRC 值。

我需要证明该功能是否检测到足够多的错误。

在这种情况下,我如何评估 CRC32 IEEE 802.3(例如 0x04C11DB7 多项式)的错误检测能力,因为每次构建时内存块大小可以有任何值,也就是说每次大小变化时错误检测能力都会不同?

到目前为止我发现的关于这个主题的所有内容都考虑了以太网消息的大小,在这种情况下这是有道理的(因为接收到的消息可以在接收后标记为有效或无效)。但是当计算一个大内存块(假设 1MB 或 1GB)的 CRC 时,我只能知道数据是否在最后没有损坏,因为要检查的值是在解析完整块后获得的。

我正在考虑这样一种情况,其中多个位在块的某个位置被损坏,并且不同区域的进一步损坏将导致最后的 "correct" CRC 值,从而导致未检测到的错误。

来自此网站 table 32 位 crcs

https://users.ece.cmu.edu/~koopman/crc/crc32.html

条目是

0x104c11db7 {4294967263,91607,2974,268,171,91,57,34,21,12,10,10,10} 

{}中的数字是最大长度报文,不包括CRC的32位,相对于HD(Hamming Distance)以HD=3开头,或者以2开头的最大误码数。所以所有在最多 4294967263 数据 + 32 位 CRC 的消息中可以检测到 2 位错误,总共 4294967295 == 2^32-1 位。这意味着有一些 3 位错误模式会在总长度大于 91607+32=91639 位时失败,一些 4 位错误会在总长度超过 2974+32=3006 位时失败,...大约 10总长度大于 21+32=53 位时将失败的位错误,... .

对于您的 1 MB 案例,某些 3 位模式将失败。对于 1 GB 的情况,某些 2 位模式将失败。

您正在使用的 CRC 具有 4294967295 的循环周期。对于失败的 2 位错误,将消息视为位数组,然后如果 msgbit[i] 和 msgbit[i+4294967295] 被翻转, CRC 将为零。这种模式发生的几率非常低。对于 3 位或更多位错误,数学(或更准确地说,针对失败或通过错误模式的某种优化的蛮力搜索)更加复杂,但概念是相同的。

这种错误模式的几率很低,假设没有故意试图掩盖导致良好 CRC 的更改。