计算CRC初始值而不是将CRC附加到有效载荷

时间:2015-02-25 08:56:30

标签: reverse patch crc crc32 crc16

我实施的大多数CRC都将计算出的CRC值追加到消息(有效载荷),并在所有字节包含后检查接收器的零结果。 CRC值通过CRC寄存器输入。 显然,这是一种非常标准的方法。

现在我想使用不同的方法:

  1. 计算有效负载的值。
  2. 使用该值作为CRC寄存器的初始值之前 消息字节(有效载荷)通过CRC寄存器馈送 这样有效载荷的最后一个字节后的结果 通过将是零。
  3. 这样做的最佳方法是什么? 是否有一个好主意或一些指点在哪里深入挖掘?

    ps:我为什么要这样做?在某些应用程序(ROM)中,由于数据存储在ROM的地址空间的末尾,因此无法附加数据。所以我想预加载CRC寄存器或将值加到消息前面。

1 个答案:

答案 0 :(得分:2)

我现在为上述问题编写了一个解决方案,比我原先想象的要容易。

我发现了几篇关于如何伪造CRC的文章。这意味着如何以计算出的CRC值具有预定义的方式修补数据 值。

使用这种方法我只需要使用我实际的最后一个字节 有效载荷作为CRC值非常明显。

最后,我只需要使用有效载荷数据计算“反向”CRC。 这个计算的结果是我必须使用的初始值 计算CRC。

当我在一个内存受限的系统上工作时,我缩小了它的大小 CRC表有256个条目(CRC32为1024字节) 到16个条目(64个字节),现在分两个步骤处理每个字节 仍然比移位更快。

// Reverse CRC table for Castagnoli polynomial (0x1EDC6F41)
static const unsigned long crc32c_revTable[16] =
{
    0x00000000L, 0x05EC76F1L, 0x0BD8EDE2L, 0x0E349B13L,
    0x17B1DBC4L, 0x125DAD35L, 0x1C693626L, 0x198540D7L,
    0x2F63B788L, 0x2A8FC179L, 0x24BB5A6AL, 0x21572C9BL,
    0x38D26C4CL, 0x3D3E1ABDL, 0x330A81AEL, 0x36E6F75FL
};

unsigned long calcReverseCRC32C(unsigned long crc32c, 
                                const unsigned char* pData,
                                unsigned long len)
{
    while (len--)
    {
        crc32c = (crc32c << 4) ^ crc32c_revTable[crc32c >> 28];
        crc32c = (crc32c << 4) ^ crc32c_revTable[crc32c >> 28];
        crc32c ^= *pData--;
    }

    return crc32c;
}

用法:

{
    // This array contains test data with 4 bytes CRC appended
    // The result of CRC-32C calculation using this data is zero
    unsigned char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9',
                           0x7c, 0x6d, 0xf9, 0x1c};

    unsigned long expectedResultOfCRC = 0;
    unsigned long init = calcReverseCRC32C(expectedResultOfCRC,
                                           &arr[sizeof(arr) -1],
                                           sizeof(arr) );
}