代码之家  ›  专栏  ›  技术社区  ›  cytrinox

CRC-32检查失败,DEC 5.2

  •  2
  • cytrinox  · 技术社区  · 9 年前

    我已经编写了两个简单的按钮处理程序来测试/演示Delphi Encryption Compendium 5.2中的CRC16和CRC32。CRC16的代码运行良好,但CRC32的验证始终失败。

    我使用的是512字节数组,其中最后2或4个字节(对于crc16或crc32)保留用于校验和。CRC-32的代码有什么问题?我的第一个想法是字节顺序有问题,但crc16代码也会失败。

    procedure TForm3.CRC16Click(Sender: TObject);
    var
      LData: array[1..512] of Byte;
        FSum: Cardinal;
      FIntPtr: Pointer;
    begin
      FillChar(LData, sizeof(LData), 0);
      LData[1] := $FF; // set some test data
    
      FSum := CRCCalc(CRC_16, LData, (SizeOf(LData)-sizeof(Word)));
    
      FIntPtr := @LData[512-1]; // don't get confused by -1...
    
      PWord(FIntPtr)^ := FSum and $FFFF;
      Assert( CRCCalc(CRC_16, LData, (SizeOf(LData))) = 0); // THIS WORKS!
    end;
    
    procedure TForm3.CRC32Click(Sender: TObject);
    var
      LData: array[1..512] of Byte;
        FSum: Cardinal;
      FIntPtr: Pointer;
    begin
      FillChar(LData, sizeof(LData), 0);
      LData[1] := $FF; // set some test data
    
      FSum := CRCCalc(CRC_32, LData, (SizeOf(LData)-sizeof(Cardinal)));
    
      FIntPtr := @LData[512-3]; // don't get confused by -3...
    
      PCardinal(FIntPtr)^ := FSum;
      Assert( CRCCalc(CRC_32, LData, (SizeOf(LData))) = 0); // ASSERT FAILURE! <<<
    end;
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Community CDub    7 年前

    您的主张基于以下财产持有:

    CRC(arr + [CRC(arr)]) = 0
    

    我使用的位置 + 以指示阵列连接。

    我相信DEC公开的特定CRC32实现没有这个属性。DEC提供三种CRC32变体,命名为 CRC_32 , CRC_32CCITT CRC_32ZModem 只有 CRC_32Z模型 具有您断言的属性。

    Serg suggests 您应主张:

    not CRC(arr + [not CRC(arr)]) = 0
    

    这适用于 循环冗余32 CRC_32中心 ,但不适用于 CRC_32Z模型 .