Algorithm 在CRC覆盖的二进制文件中嵌入数据,意味着什么?

Algorithm 在CRC覆盖的二进制文件中嵌入数据,意味着什么?,algorithm,embedded,crc,Algorithm,Embedded,Crc,假设以下场景: 对于微控制器,有一些应用程序的二进制图像(为了避免引起ELF/PE格式的问题,无论如何,我的特定相关问题是微控制器项目) 该二进制图像受CRC保护(用于检测其中的错误,无需加密) 我希望有一个可以在以后替换的部分(例如使用引导加载程序),而不影响CRC 问题是可以解决的,CRC32的示例如下: 内部流1:0x49 0xA3 0x45 0xEF=>CRC32:0xA1DD6F3B 内部流2:0xAD 0x33 0x10 0x86=>CRC32:0xF6717149 二进制1:

假设以下场景:

  • 对于微控制器,有一些应用程序的二进制图像(为了避免引起ELF/PE格式的问题,无论如何,我的特定相关问题是微控制器项目)
  • 该二进制图像受CRC保护(用于检测其中的错误,无需加密)
  • 我希望有一个可以在以后替换的部分(例如使用引导加载程序),而不影响CRC
问题是可以解决的,CRC32的示例如下:

  • 内部流1:0x49 0xA3 0x45 0xEF=>CRC32:0xA1DD6F3B
  • 内部流2:0xAD 0x33 0x10 0x86=>CRC32:0xF6717149
  • 二进制1:0x110x49 0xA3 0x45 0xEF 0x3B 0x6F 0xDD 0xA10x22=>0xDEAD20F7
  • 二进制2:0x110xAD 0x33 0x10 0x86 0x49 0x71 0x71 0xF60x22=>0xDEAD20F7
也就是说,将带有CRC32的数据块嵌入另一个具有CRC32的数据块中,可以在不影响外部CRC的情况下替换内部块(这涉及到在包含CRC的块上执行CRC计算,您得到相同的“幻值”:0xDEBB20E3,或者可以在CRC计算器中看到的补充:0x2144DF1C)

我认为这种包含不应该影响CRC的性能(错误检测能力),无论是在外部块还是内部块的任何部分(如果我仅通过外部CRC检查,自然不会影响通过自身CRC检查的内部块),但是我不能完全确定

(当然,当内部块中发生内部CRC无法检测到的故障时,内部块在外部CRC的错误检测方面不会得到任何改进,这意味着它会产生相同的“魔法值”,从而也会破坏外部CRC检测其中错误的能力)


因此,问题是,如果以这种方式使用CRC,外部块的部分(或仅由外部CRC检查的内部块)是否会在错误检测性能上出现任何降级。

CRC检查是否捕获错误取决于错误翻转输入的哪些位,不是这些位的原始值

因此,所检查的数据对CRC的错误检测能力没有影响,除非它使传输系统容易产生某些类型的错误


这种情况不太可能发生,而且几乎可以肯定,它不会依赖于数据的CRC,因此您的方案不会降低错误检测。

否。事实上,通过在消息中插入第二个CRC,您增加了总体错误检测概率。你也可以检查一下,看看被替换的部分是否有错误。

内部块[没有受益于]外部CRC
我怀疑这是否适用于不同的情况polynomials@greybeard也许是真的。但这不是提高纠错性能的要求,只是为了确保它不会在任何地方退化。实际上,内部块只有一个CRC,以消除其对外部块CRC的影响。我甚至不确定一个不同的多项式内块CRC是否能实现这个目标。这是相当不清楚的。0x22来自哪里?
=>0xDEAD20F7
是什么意思?什么是
“魔力值”:0xDEBB20E3
,你是怎么得到的?@Lundin-Ouch,我会重新考虑这个问题的措辞,我认为这些对于那些对CRC有足够兴趣的人来说是显而易见的,他们认为这个问题与他有关。“幻值”是CRC算法的一个属性:如果计算CRC,包括CRC值本身,则始终会得到相同的结果,对于CRC32,这是0xDEBB20E3。示例中的0x11和0x22被认为是嵌入内部流的二进制文件的一部分,而0xDEAD20F7是这些二进制文件的CRC32,这表明内部流的替换不会改变它。@Jubatian我对CRC有相当多的经验,我自己在C和数字逻辑硬件中实现了这样的算法。我不明白这个问题。这些都不是众所周知的CRC32中的多项式。您使用的是哪种CRC32?您使用的是反向还是非反向FCS?您最初是否将FCS包括在计算中?等等所以我认为0xDEBB20E3是当你用多项式计算一个包时得到的值?那是哪个CRC32?这是我的想法,但我不能完全确定。由于有人坚持我们不能使用CRC32,而应该自己做饭,因为数据包以后可能会在以太网帧中传输,这会神奇地削弱数据包的错误检测性能(以太网也使用CRC32),所以我们在这个环境中进行了长时间的辩论。如果您使用CRC32,那么CRC32未能检测到的错误也将无法被以太网的CRC32检测到,只要它适合于一个数据包,因为它们是相同的检查。如果您使用不同的检查或不同的CRC多项式,那么这两个检查将是独立的,您将获得这两个检查的附加安全性。