5.0 CRC32校验技术概述

这篇具有很好参考价值的文章主要介绍了5.0 CRC32校验技术概述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,并以此来判定特定程序内存是否发生了变化,如果发生变化则拒绝执行,通过此种方法来保护内存或磁盘文件不会被非法篡改。总之,内存和磁盘中的校验技术都是用于确保数据和程序的完整性和安全性的重要技术。

以下是一些关于内存和磁盘中的CRC校验技术的详细信息:

  • 内存中的CRC校验技术

    • 在内存中使用CRC校验技术可用于防止缓冲区溢出攻击。内存中的CRC校验技术将根据程序的特定部分计算数据的CRC值并存储在内存中。当程序运行时,它会自动计算相同的部分的CRC值,以确保没有被篡改。如果发现CRC值不匹配,则此可能是攻击发生的异常,程序可以终止。
  • 磁盘中的CRC校验技术

    • 使用CRC校验技术可用于检测磁盘文件是否被篡改。磁盘文件的CRC值将在文件中的特定位置处存储。在运行程序之前,程序将读取此CRC值并使用相同的算法计算自己的CRC值以检查文件是否被篡改。如果发现两个CRC值不匹配,则应用程序可能已被篡改或病毒感染。

首先我们需要自行实现一个CRC算法,通常情况下CRC算法需要经历三个步骤,生成CRC表格,读取数据并计算CRC,计算最终的CRC值,这个实现原理可细化为如下三步;

  • 生成CRC表格

    • 首先,需要生成一个长度为256CRC表格。该表格包含了用于生成32CRC值所需的所有信息。CRC32表通常是固定的,可作为算法的参数,也可以根据所需的多项式动态生成。
  • 读取数据并计算CRC

    • 计算CRC值的过程是将指定块的数据视为位流,并将位流分成32位的块。这些块按顺序处理,每次使用CRC表格中的值对32位值进行XOR和位移操作。该操作迭代执行,以依次处理每个块。
  • 计算最终的CRC值

    • 处理所有块后,可以计算最终的CRC值。大多数实现都反转了这个值的位,以进行优化,并将计算出的值与0xFFFFFFFF(32位的所有位都是1)进行XOR运算以得到最终值。

根据上述描述读者应该可以理解CRC32的工作原理,如下代码是实现CRC32的核心算法。该算法生成一个256个元素的CRC表,在输入数据块上执行一系列按位运算。CRC32算法将输入的数据块视为位串,并产生一个唯一的32位输出,该输出可以用于验证数据的完整性和一致性等方面。

在该代码中,CRC表是动态生成的,采用了多项式0xEDB88320L。然后,该算法使用crcTmp2变量来存储中间CRC值,对每个字节进行一系列运算,以生成最终的CRC32值。返回值为计算出的CRC32值。

// 定义一个指向字节缓冲区的指针ptr和字节缓冲区的大小Size,计算并返回CRC32值
DWORD CRC32(BYTE* ptr, DWORD Size)
{
  DWORD crcTable[256], crcTmp1;

  // 动态生成CRC-32表
  // 生成一个长度为256的CRC表格,共含有256个元素
  for (int i = 0; i<256; i++)
  {
    crcTmp1 = i;
    // 每个元素计算8个字节
    for (int j = 8; j>0; j--)
    {
      if (crcTmp1 & 1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L; // 判断是否需要异或 0xEDB88320L
      else crcTmp1 >>= 1;                                      // 如果不需要异或,则每次将该数右移一位
    }
    // 将得到的结果存放在CRC表格中
    crcTable[i] = crcTmp1;
  }
  
  // 计算CRC32值
  // 使用while循环来逐步处理字节块
  DWORD crcTmp2 = 0xFFFFFFFF;
  while (Size--)
  {
    // 将crcTmp2右移8位,并将最高8位数据清零
    crcTmp2 = ((crcTmp2 >> 8) & 0x00FFFFFF) ^ crcTable[(crcTmp2 ^ (*ptr)) & 0xFF];
    ptr++; // 处理下一个字节
  }
  // 将最终的crcTmp2值反转位顺序,并执行XOR运算,返回最终的CRC32值
  return (crcTmp2 ^ 0xFFFFFFFF);
}

上述代码则是CRC32生成的核心实现流程,读者在使用时只需要调用封装好的CRC32()函数并依次传入字符串及字符串长度,即可完成流程调用。但此处读者需要注意,CRC32不是加密算法,不能保证数据的安全性。其只能作为较小数据块的简单完整性检查和错误检测的一种手段。

int main(int argc, char *argv[])
{
    char* ptr = "hello lyshark";
    DWORD size = sizeof("hello lyshark");

    printf("原始字符串: %s \n", ptr);

    DWORD ret = CRC32((BYTE *)ptr, size);
    printf("CRC32 = %x \n", ret);

    system("pause");
    return 0;
}

当调用上述代码时读者应该可以看到hello lyshark字符串的CRC32码,输出效果如下图所示;

5.0 CRC32校验技术概述

上述代码片段仅用于验证内存字符串,如果读者需要验证磁盘文件的特征码则首先需要通过CreateFile打开文件得到文件句柄,接着通过ReadFile将整个文件读入到内存,最后再次调用CRC32(pFile, dwSize)实现验证文件的CRC数据,但此方法仅用于验证小文件,如果文件过大则可能会耗费大量的内存。

int main(int argc, char* argv[])
{
    char *FileName = "d://lyshark.exe";

    // 验证文件是否存在
    if (GetFileAttributes(FileName) == 0xFFFFFFFF)
    {
        return 0;
    }

    // 打开文件
    HANDLE hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    // 得到文件长度
    DWORD dwSize = GetFileSize(hFile, NULL);

    // 开辟一段内存空间
    BYTE *pFile = (BYTE*)malloc(dwSize);

    // 将数据读入文件
    DWORD dwNum = 0;
    ReadFile(hFile, pFile, dwSize, &dwNum, 0);

    // 计算CRC32
    DWORD dwCrc32 = CRC32(pFile, dwSize);
    if (pFile != NULL)
    {
        printf("文件名 = %s \n", FileName);
        printf("文件长度 = %d \n", dwSize);
        printf("分配内存 = 0x%x \n", pFile);
        printf("CRC32 = 0x%x \n", dwCrc32);
        free(pFile);
        pFile = NULL;
    }

    system("pause");
    return 0;
}

上述代码运行后则可输出d://lyshark.exe文件的CRC32值,输出效果如下图所示;

5.0 CRC32校验技术概述文章来源地址https://www.toymoban.com/news/detail-709864.html

到了这里,关于5.0 CRC32校验技术概述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CRC32校验算法原理及计算说明

    本文主要介绍如何使用CRC32校验算法计算得出FCS(Frame Check Sequence帧检验序列). 参考: 1、CRC32加密算法原理 2、CRC多项式对应代码 作用:在远距离数据通信中,为确保高效而无差错地传送数据,对数据进行校验即差错控制。 CRC原理实际上就是在一个K位二进制数据序列之后附

    2023年04月22日
    浏览(44)
  • C语言CRC-32 STM32格式校验函数

    CRC-32校验产生4个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-32校验算法实现,参考: C语言标准CRC-32校验函数 不同厂家通过对输入数据前处理和输出数据后处理的方式不同,又产生了不同的厂家校验函数,这

    2023年04月27日
    浏览(57)
  • STM32的SPI硬件CRC校验(个人学习记录)

    一、功能实现         为了保证SPI通信数据的准确性,需要通过对每个数据进行CRC校验,保证设备运行正常。 二、基本原理 SPI通信可以通过以下步骤使用CRC: ● 设置CPOL、CPHA、LSBFirst、BR、SSM、SSI和MSTR的值; ● 在SPI_CRCPR寄存器输入多项式; ● 通过设置SPI_CR1寄存器CRCEN位使

    2024年02月11日
    浏览(42)
  • 5.2 磁盘CRC32完整性检测

    CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,并以此来判定特定程序内存是否

    2024年02月08日
    浏览(35)
  • CRC校验码计算,以常用CRC-8为例

    CRC即循环冗余校验码 :是数据通信领域中最常用的一种查错校验码,其 特征是信息字段和校验字段的长度可以任意选定。 CRC校验原理 :在要发送的帧后面附加一个数,生成一个新帧发送给接收端。它要 使所生成的新帧能与发送端和接收端共同选定的某个特定数整除 (注意

    2023年04月14日
    浏览(41)
  • CRC(循环冗余校验码的校验方法)

    5个关键点: 1.信息码:即给出要校验的二进制码 2.生成多项式:一般多项式会给,从最高位的指数位数就可以得到有几个校验码;如果没给多项式,肯定会给个多项式二进制码,根据它来推就行(具体推的规律,下面会讲) 3.校验位:由多项式的最高位指数得出 4.多项式对应

    2024年02月08日
    浏览(42)
  • 题解校验码—CRC循环校验码与海明校验码

    一个编码系统的码距是 任意两个码字 的最小距离。 例如个编码系统采用三位长度的二进制编码,若该系统有四种编码分别为:000,011,100,111,此编码系统中000与111的码距为3;011与000的码距为2;011与111的码距为1,则该编码系统的码距为1。 码距计算方法:两个编码按位异

    2024年02月04日
    浏览(44)
  • CRC8校验

    提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: CRC即循环冗余校验码(Cyclic Redun

    2023年04月13日
    浏览(37)
  • CRC校验算法详解

            数据在传输过程(比如通过网线在两台计算机间传文件)中,由于传输信道的原因,可能会有误码现象(比如说发送数字5但接收方收到的却是6),方法发送额外的数据让接收方校验是否正确,这就是数据校验。常用的校验方法是和校验,就是将传送的数据(按字节

    2024年02月09日
    浏览(37)
  • CRC校验(模型、手算、程序编写)

    一.模型 1.WIDTH:宽度,即生成的CRC数据位宽,如CRC-8,生成的CRC为8位 2.REFIN:true或false,如为true输入的原始数据的每个字节需要做个逆序的处理,注意:针对的每个字节,而不是整个数据, 举例如下: 以一个4字节的原始数据为例: 3.INIT:这是算法开始时寄存器(crc)的初始

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包