DEC 5.2的CRC-32检查失败

时间:2015-09-01 13:07:59

标签: delphi crc crc32

我已经编写了两个简单的按钮处理程序来测试/演示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 个答案:

答案 0 :(得分:1)

您的断言基于以下属性持有:

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

我使用+表示数组连接。

我认为DEC公开的特定CRC32实现没有这个属性。 DEC提供三种CRC32变体,名为CRC_32CRC_32CCITTCRC_32ZModem。只有CRC_32ZModem具有您声明的属性。

Serg suggests你应该断言:

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

适用于CRC_32CRC_32CCITT,但不适用于CRC_32ZModem