谷动谷力

 找回密码
 立即注册
查看: 924|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
发表于 2023-6-4 12:09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机常用完整性校验算法----CheckSum校验和 CRC循环冗余校验 Hash校验


一、前言
单片机在开发过程中经常会遇到大文件传输,或者大量数据传输,在一些工业环境下,数据传输并不是很稳定,如何检验数据的完整性就是个问题,这里简单介绍一下单片机常用的几种数据完整性校验方法。

二、CheckSum校验和
简单来说将需要传输的所有数据按照指定的位数先取反码,然后相加,将相加的校验和和要发送的数据包放在一起进行传输;接收方接收到数据后,将数据段和跟随一起传输的校验和都取反相加,如果结果为0,则校验和成功,这一帧数据完成性校验成功。
优点:计算简单,CPU资源占用小,单片机可以很流利的运行。
缺点:完整性检验能力较弱,比如自身数据取反相加,发生相对的错误时,一个多1,一个少1,校验和则无法检验出。

三、CRC循环冗余校验
CRC 校验的原理也很简单,先指定一个多项式,对应 2 进制码,在要计算的二进制数据屁股上补上比多项式最高项少一位的0,然后将补完的数据与多项式进行模2取余,取余的结果和补0的数据相加,最终得到经过CRC校验处理的数据,打包发送到另一端,另一端将得到的数直接与多项式做模2运算,结果等于0则 CRC 校验完成,否则失败。单片机中常用的CRC有CRC16和CRC32,主要就算多项式不同,最后末尾补的CRC校验码长度也不一致。
优点:计算速度快,检错能力强,检测错误率可到 bit 级别。
缺点:当多项式越复杂,计算量也越大,不过也可以通过提前计算好表的方式,以空间换时间提高效率。
我们在单片机中使用 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算法可以完成完整性校验以及简单的安全加密,但缺点就算计算量大,并且只能后检验,不能在数据传输时事实检验,同学们在使用时根据实际场景酌情使用~
今天就学到这了!
+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-28 00:48 , Processed in 0.111036 second(s), 37 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表