4字节CRC与普通校验和的安全性那个更好些?

2019-12-22 13:47发布

之前的通信一直使用的是CRC校验,只是为了确认数据的正确性,但是由于针对的客户不一样,经常要和客户接口或者换CPU平台,使用CRC校验算法每次都要说很多次才能沟通清楚。
听说CRC校验在特定条件下是可以修复出错的几个位,但是我们平时压根就用不到这么高大上的特性,只是确认一下数据的正确性,出错了就重新传输一下。
在这种情况下我考虑能不能使用计算更简单的校验和取反的方式,这样和客户沟通起来应该就跟容易了。
我的理解是,如果对10个四字节分别计算CRC和校验和的情况下,数据错误但是却通过校验的理论概率就是十分之一,因为10个四字节能表述的范围就是1个四字节的十倍,无论这个校验的四字节是怎么计算出来的,每个校验值都对应着10种数据值。
当然如果是简单的校验和就会有致命的缺陷,那就是如果数据和校验和全是0(总线出错,所有数据全部是0),简单的求和还是0,那么这个数据也会被认为是正确的,但是如果在计算校验和之后将校验和取反,就在一定程度上解决了这个问题。因为总线出问题全是1或者全是0的可能性比较大,其他的出错方式概率就很小了。
所以在不考虑数据出错修复的情况下,CRC和校验和取反的验证效果是不是一样的?
各位怎么看?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
aozima
1楼-- · 2019-12-22 17:21
 精彩回答 2  元偷偷看……
momo_li
2楼-- · 2019-12-22 17:45
aozima 发表于 2017-9-29 10:34
crc的位数和Poly都有通用标准,给出这个说明,再不行给出代码。

CRC没有纠错能力。

防碰撞能力这个我觉得可能是和校验和取反有区别的,因为CRC的计算比较复杂,我想不出典型的错误值,但是校验和取反就简单了,我能推算出比较简单的出错值,比如数据0X0F,0XF0,校验0X00;     数据0XF0,0X0F, 校验0X00。这个应该就是校验和取反的错误类型吧。
当时刚开始研究CRC的时候,看过很多资料的,记得有文档分析了CRC计算的过程,得出的结论是可以纠正一个错误位或者检测出几个错误位。
现在在网上搜索一下还是能找到不少关于CRC可以纠正少量错误的资料。是不是使用的是自己特制的CRC算法才能实现这个功能?标准的CRC算法没有这个特性?
yangff
3楼-- · 2019-12-22 23:42
你要的是什么安全性……? 如果按照我理解的安全性,安全性都是0,这两个做法都可以很容易构造出碰撞……
LearningASM
4楼-- · 2019-12-23 03:00
momo_li 发表于 2017-9-29 10:45
防碰撞能力这个我觉得可能是和校验和取反有区别的,因为CRC的计算比较复杂,我想不出典型的错误值,但是 ...

你在那找到CRC介绍说明文档?我只知道CRC只有判断数据是否错误的能了,不具备纠错能了。
并且,STM32带CRC硬件计算,哪有什么负责不负责,就算是软件CRC,也是用人家标准的CRC格式与代码,何必自己设计?
momo_li
5楼-- · 2019-12-23 05:38
yangff 发表于 2017-9-29 11:06
你要的是什么安全性……? 如果按照我理解的安全性,安全性都是0,这两个做法都可以很容易构造出碰撞……  ...

自然是防止数据出错,完全避免是不可能的,CRC作为行业的通用做法,效果肯定是可以的,
zqf441775525
6楼-- · 2019-12-23 08:33
 精彩回答 2  元偷偷看……

一周热门 更多>