当前位置: 首页 > news >正文

安全基础学习-CRC理解与计算

由于一些任务要求需要了解CRC校验,于是来学习一下。
新人学习,大佬绕路。

前言

CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
在这里插入图片描述

CRC 的步骤大致如下:

  1. 选择多项式:选择一个预定义的多项式作为生成器。不同的应用和标准会使用不同的多项式。
  2. 初始化寄存器:设置 CRC 计算的初始值,通常是全 1 或全 0。
  3. 逐位处理数据:将数据分成多个位进行处理,计算时使用生成多项式。
  4. 计算结果:最终得到的结果就是 CRC 校验码。
    CRC 具有很强的错误检测能力,能检测到常见的错误类型,如单比特错误、双比特错误、突发错误等。常见的 CRC 标准包括 CRC-16、CRC-32 等。

1、多项式表示

使用多项式来进行 CRC 计算的原因在于它能够很好地表示和处理二进制数据,同时提供了强大的数学工具来检测错误。多项式对应二进制的方式很直观,每一位二进制数都对应多项式的一个系数。

1.1 多项式与二进制的对应关系

多项式的每一个系数对应二进制数的每一位。

例如:
多项式 x3+x+1对应二进制 1011
x3对应二进制的最高位 1
x2 对应二进制的次高位 0(因为没有 x2项)
x1 对应二进制的次低位 1
x0 对应二进制的最低位 1

2.数据扩展

我们需要在数据后面附加与多项式阶数相同数量的零。因为多项式是三阶(最高次项是 x3),我们在数据后面加 3 个零:

1101 -> 1101 000

3.开始二进制除法

3.1 二进制除法与异或的关系

二进制除法在 CRC 计算中的实现本质上是通过异或运算来完成的,也有的地方叫做模2除法。

异或运算
异或运算的规则是:

如果两个位相同,则结果为0。
如果两个位不同,则结果为1。

3.2 具体步骤

在 CRC 计算中,二进制除法的步骤可以用异或运算来模拟。具体来说,当我们使用一个多项式(如 x3+x+1)去除一个二进制数据时,实际上我们是在执行一个逐位的异或运算。

3.2.1初始数据准备

原数据:1101
多项式:1011
新数据(在数据后面附加三个零):1101000

3.2.2 逐步计算过程

在这里插入图片描述
其他数据更复杂的计算举例
在这里插入图片描述
校验码为0b0001.

3.2.3校验码

0b0001

3.2.4信息码

0b1101001

3.2.5 详细总结:

  1. 数据扩展:在数据后面加上与多项式阶数相同数量的零。
  2. 对齐与异或:将数据的前几位与多项式对齐,进行异或运算,得到新结果。
  3. 重复步骤:将新的结果继续与多项式对齐,进行异或,直到数据处理完毕。
  4. 得到校验码:剩下的部分就是 CRC 校验码,位数与扩展保持一致。
  5. 得到信息码:将校验码添加到初始数据后可得到信息码。
    这种方法通过二进制除法来检测数据传输或存储中的错误,可以检测到常见的错误类型。实际应用中使用的多项式和数据长度会更复杂,但基本过程是一样的。

4.数据验证

用收到的信息码与除数做异或,余数为0,则说明收到的数据正确。
在这里插入图片描述

5.参数模型

CRC算法参数模型解释:

  • NAME:参数模型名称。
  • WIDTH:宽度,即CRC比特数。
  • POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
  • INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
  • REFIN:待测数据的每个字节是否按位反转,True或False。
  • REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
  • XOROUT:计算结果与此参数异或后得到最终的CRC值。
    在这里插入图片描述

6. 转为编程思路

确认了数据后,其实不用扩展,而是移位对应的数据长度,如果是1则异或,0则左移(移位的过程相当于在数据后面补0,而当数据最后一位移位结束,那么该补的0都补上了),即结束条件是数据位的长度

数据举例

使用CRC8多项式0x07(即0000 0111)和数据字节0x32(即0011 0010)进行计算。

CRC8计算详细步骤

1)初始化

CRC寄存器初始化为0x00(0000 0000)

2)处理数据字节 0x32(0011 0010)

初始CRC: 0000 0000
异或数据字节: 0000 0000 XOR 0011 0010 = 0011 0010

3)逐位处理 CRC

每次处理CRC寄存器时,按照以下步骤:

第1位:

CRC = 0011 0010(最高位为0,无需异或)
左移一位: 0110 0100

第2位:

CRC = 0110 0100(最高位为0,无需异或)
左移一位: 1100 1000

第3位:

CRC = 1100 1000(最高位为1,需要与多项式0000 0111异或)
左移一位: 1001 0000
异或多项式: 1001 0000 XOR 0000 0111 = 1001 0111

第4位:

CRC = 1001 0111(最高位为1,需要与多项式0000 0111异或)
左移一位: 0010 1110
异或多项式: 0010 1110 XOR 0000 0111 = 0010 1001

第5位:

CRC = 0010 1001(最高位为0,无需异或)
左移一位: 0101 0010

第6位:

CRC = 0101 0010(最高位为0,无需异或)
左移一位: 1010 0100

第7位:

CRC = 1010 0100(最高位为1,需要与多项式0000 0111异或)
左移一位: 0100 1000
异或多项式: 0100 1000 XOR 0000 0111 = 0100 1111

第8位:

CRC = 0100 1111(最高位为0,无需异或)
左移一位: 1001 1110

最终CRC值

最终CRC寄存器的值是1001 1110(二进制),转换为十六进制就是0x9E。

参考链接

CRC参考链接1
CRC参考链接2
CRC参考链家3
CRC参考链接4
CRC参考链接5

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript入门day6
  • VUE2项目打包dist后dist包中index打开空白页
  • Linux系统窗口水印难点分析
  • 使用FastChat快速部署LLM服务
  • Flask 介绍
  • 【多线程】阻塞队列
  • TOA/TDOA测距定位,三维任意(>3)个锚节点,对一个未知点进行定位|MATLAB源代码
  • Python网络爬虫核心面试题
  • VRF 算法流程及代码实现
  • #565. 查找之大编号
  • OpenCV||超详细的图像平滑
  • 搭建高可用OpenStack(Queen版)集群(一)之架构环境准备
  • Python面试题:结合Python技术,如何使用PyBrain进行神经网络和机器学习
  • Linux软硬链接和动静态库
  • mybatis-plus雪花算法
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 11111111
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • co.js - 让异步代码同步化
  • cookie和session
  •  D - 粉碎叛乱F - 其他起义
  • github从入门到放弃(1)
  • Github访问慢解决办法
  • Hibernate【inverse和cascade属性】知识要点
  • JDK9: 集成 Jshell 和 Maven 项目.
  • nfs客户端进程变D,延伸linux的lock
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React16时代,该用什么姿势写 React ?
  • SegmentFault 2015 Top Rank
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 和 || 运算
  • 前端之React实战:创建跨平台的项目架构
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 学习ES6 变量的解构赋值
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用Python写一份独特的元宵节祝福
  • raise 与 raise ... from 的区别
  • 组复制官方翻译九、Group Replication Technical Details
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #LLM入门|Prompt#3.3_存储_Memory
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (C语言)二分查找 超详细
  • (day 12)JavaScript学习笔记(数组3)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十六)串口UART
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包