编码与安全指南

CRC32 不一致:变体、字节与无符号显示

用已知测试向量区分 IEEE CRC32、CRC32C 以及带符号显示造成的差异。

Nav Tools ·

写明变体名称

CRC32 是一类算法的名称,并非完整规格,CRC32C 与 Gzip 使用的 IEEE CRC32 多项式不同。

本站提供 IEEE 风格 CRC32 与 Adler32,没有 CRC32C 计算模式。

ASCII bytes of "123456789":
IEEE CRC32 → cbf43926
CRC32C     → e3069283

对齐输入字节

换行、UTF-8 BOM 或字符编码变化都会改变校验和,文件查看器显示的名称不是计算输入。

统一使用不带结尾换行的九个 ASCII 数字;文件协议还需确认规定的字节区间。

比较前统一显示方式

32 位结果可以显示为有符号十进制、无符号十进制或十六进制,负数显示也可能是同样比特。

先统一成八位 HEX 或无符号 32 位值,再判断不一致。

0xcbf43926 >>> 0 → 3421780262
0xcbf43926 | 0   → -873187034

CRC 不能验证身份

CRC 能发现很多偶然变化,但不是针对攻击者主动篡改设计的。

解决兼容问题后,存在恶意修改风险时仍要采用协议的认证完整性机制,匹配 CRC 不能验证发送者身份。

参考资料

← 编码与安全指南