sunsili 发表于 2023-6-4 12:09:43

单片机常用完整性校验算法----CheckSum校验和 CRC循环冗余校...

单片机常用完整性校验算法----CheckSum校验和 CRC循环冗余校验 Hash校验


一、前言单片机在开发过程中经常会遇到大文件传输,或者大量数据传输,在一些工业环境下,数据传输并不是很稳定,如何检验数据的完整性就是个问题,这里简单介绍一下单片机常用的几种数据完整性校验方法。
二、CheckSum校验和简单来说将需要传输的所有数据按照指定的位数先取反码,然后相加,将相加的校验和和要发送的数据包放在一起进行传输;接收方接收到数据后,将数据段和跟随一起传输的校验和都取反相加,如果结果为0,则校验和成功,这一帧数据完成性校验成功。优点:计算简单,CPU资源占用小,单片机可以很流利的运行。缺点:完整性检验能力较弱,比如自身数据取反相加,发生相对的错误时,一个多1,一个少1,校验和则无法检验出。推荐参考文章:https://blog.csdn.net/tangchenchan/article/details/51212440
三、CRC循环冗余校验CRC 校验的原理也很简单,先指定一个多项式,对应 2 进制码,在要计算的二进制数据屁股上补上比多项式最高项少一位的0,然后将补完的数据与多项式进行模2取余,取余的结果和补0的数据相加,最终得到经过CRC校验处理的数据,打包发送到另一端,另一端将得到的数直接与多项式做模2运算,结果等于0则 CRC 校验完成,否则失败。单片机中常用的CRC有CRC16和CRC32,主要就算多项式不同,最后末尾补的CRC校验码长度也不一致。优点:计算速度快,检错能力强,检测错误率可到 bit 级别。缺点:当多项式越复杂,计算量也越大,不过也可以通过提前计算好表的方式,以空间换时间提高效率。推荐1篇CRC学习文章:https://blog.csdn.net/xwdrhgr/article/details/123257922我们在单片机中使用 crc 校验也不需要自己来写,推荐一份开源的 crc 源码,mit 协议,随便耍,github链接:lammertb/libcrc: Multi platform CRC library (github.com)
四、Hash校验一句话描述 Hash 算法就是将任意长度的数据通过算法计算成固定长度的值,接收方得到数据后再用相同的算法去计算出固定长度的值,比对发送方的hash值就可以判断数据的完整性,目前常用的hash算法有:MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256,其中MD5、SHA-1k可以通过计算出的固定值反推出原镜像,所以不能用来做安全性校验,而其他的算法暂时还未破解,既可以做镜像完整性校验,一定程度上可以做安全性校验。Hash的各个算法原理就不多讲了哈,博主也不是很清除,对于想要在单片机上使用Hash算法的同学,可以参考这个仓库:smartmx/hash-match: using hashmap on MCUs (github.com)想要直接在win下加密镜像,可以参考下这个开源项目:gurnec/HashCheck: HashCheck Shell Extension for Windows with added SHA2, SHA3, and multithreading; originally from code.kliu.org (github.com)Hash算法可以完成完整性校验以及简单的安全加密,但缺点就算计算量大,并且只能后检验,不能在数据传输时事实检验,同学们在使用时根据实际场景酌情使用~今天就学到这了!
页: [1]
查看完整版本: 单片机常用完整性校验算法----CheckSum校验和 CRC循环冗余校...