把比特序列当作多项式
CRC把消息比特解释为系数只有0和1的多项式,并按约定的生成多项式求余。这里的加减按模二计算,相当于异或,不进行普通整数加法的进位;因此不能把CRC理解成简单把所有字节相加。
在基础模型中,宽度w对应在消息后补w个零再除,余数作为校验部分。接收端按同一规则重算并比较;某些表示也可检查消息与校验组合的固定余数。实际格式还可能有初值、反射和末尾异或,不能一概要求最终结果为零。
参考:[1]
同样位数不代表同一种CRC
算法的完整约定通常还包括多项式、寄存器初值、输入位反射、输出位反射及最终异或值。只说“32位CRC”,不足以保证两个实现对同一消息算出同样结果;校验字段的字节存储顺序也须与文件格式一致。
gzip成员尾部保存原始未压缩数据的CRC-32,RFC1952还给出按字节查表的示例。查表、逐位或其他加速方式可以实现相同功能,但必须先把参数和处理顺序对齐,不能只比较函数名称。
发现差错与证明来源是不同目标
基础CRC模型中,若错误模式本身是生成多项式的倍数,就可能检验不出;不同多项式对不同错误模式的检出能力也不同。因此通过CRC只说明满足这一校验关系,不能证明数据绝无任何变化。
CRC的计算规则公开,也没有秘密密钥。能同时修改消息与校验值的人,可以重算一份匹配校验;若目标是抵抗主动伪造,应采用适当的消息认证机制。CRC还不自动定位或修复错误,发现不一致后的重传与恢复属于额外流程。