5.0 CRC32校验技术概述

crc32,校验,技术,概述 · 浏览次数 : 295

小编点评

**内存和磁盘校验技术** 内存和磁盘校验技术是确保数据完整性和安全性的重要技术。它们可用于检测数据损坏并判定特定内存区域或磁盘文件是否发生了变化。 **内存中的 CRC 校验技术** * 使用 CRC 校验值检测数据损坏。 * 计算 CRC 值时,将数据块视为字节流并对每个字节进行 XOR 和位移运算。 * 计算 CRC 值后,反转位顺序并进行 XOR运算以得到最终的 CRC32 值。 **磁盘中的 CRC 校验技术** * 使用 CRC 校验值检测磁盘文件是否被篡改。 * 读取文件时,从文件头中读取 CRC 值并计算同类数据的 CRC 值。 * 如果 CRC 值不匹配,则文件可能被篡改。 **CRC32 的工作原理** CRC32 是一个用于检测数据完整性和一致性的算法。它使用 CRC 表来存储校验信息,其中每个元素表示特定字节的 CRC 值。 1. 读取数据块。 2. 计算 CRC 值。 3. 根据 CRC 表中对应元素的值对每个字节进行 XOR 和位移运算。 4. 计算最终 CRC32 值。 **总结** CRC 校验技术是确保数据完整性和安全性的关键技术。它们可用于检测数据损坏、识别磁盘文件被篡改并防止恶意代码执行。

正文

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码,输出效果如下图所示;

上述代码片段仅用于验证内存字符串,如果读者需要验证磁盘文件的特征码则首先需要通过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值,输出效果如下图所示;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/68b9f1ba.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

与5.0 CRC32校验技术概述相似的内容:

5.0 CRC32校验技术概述

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

5.0 Python 定义并使用函数

函数是python程序中的基本模块化单位,它是一段可重用的代码,可以被多次调用执行。函数接受一些输入参数,并且在执行时可能会产生一些输出结果。函数定义了一个功能的封装,使得代码能够模块化和组织结构化,更容易理解和维护。在python中,函数可以返回一个值或者不返回任何值,而且函数的参数可以是任何python对象,包括数字、字符串、列表、元组等。python内置了许多函数,同时也支持用户自定义函数。

Sealos 5.0 正式发布,云本应该是操作系统

把所有资源抽象成一个整体,一切皆应用,这才是云应该有的样子。 2018 年 8 月 15 日 Sealos 提交了第一行代码。 随后开源社区以每年翻倍的速度高速增长。 2022 年我们正式创业,经历一年的研发,在 2023 年 6 月正式上线 Sealos 公有云版本。 到目前为止,我们已经上线近一

【重磅】华为云盘古大模型5.0,正式发布!

2024年6月21日,在华为开发者大会2024(HDC 2024)上,华为常务董事、华为云CEO张平安正式发布盘古大模型5.0,在全系列、多模态、强思维三个方面全新升级;张平安还分享了盘古大模型在自动驾驶、工业设计、建筑设计、具身智能、媒体生产和应用、高铁、钢铁、气象等领域的丰富创新应用和落地实践,

[转帖]RocksDB 简介

https://www.bookstack.cn/read/tidb-5.0-zh/storage-engine-rocksdb-overview.md TiDB试用 来源:TiDB 浏览 299 扫码 分享 2021-04-20 20:56:38 RocksDB 简介 TiKV 架构 RocksD

【RocketMQ】RocketMQ 5.0新特性(二)- Pop消费模式

Pop模式消费和消息粒度负载均衡 在RocketMQ 5.0之前,消费有两种方式可以从Broker获取消息,分别为Pull模式和Push模式。 Pull模式:消费需要不断的从阻塞队列中获取数据,如果没有数据就等待,这个阻塞队列中的数据由消息拉取线程从Broker拉取消息之后加入的,所以Pull模式下

【RcoketMQ】RcoketMQ 5.0新特性(一)- Proxy

为了向云原生演进,提高资源利用和弹性能力,RcoketMQ在5.0进行了架构的调整与升级,先来看新特性之一,增加了Proxy层。 增加Proxy代理层 计算存储分离 计算存储分离是一种分层架构,将计算层与存储层分开。 计算层指的是一些消耗计算资源的功能模块比如协议解析、消费管理等,存储指的是数据存储

[转帖]10GB/s 存储方案设计测试:用PCIe 5.0单盘还是SSD RAID?

https://zhuanlan.zhihu.com/p/558884542 - 测试平台介绍 - M.2 NVMe SSD散热方案浅析 - Intel RST RAID的Write Back写缓存适用于SSD吗? - RAID 0、10读写带宽线性提升 - 选择软RAID还是硬RAID? - SL

[转帖]arm linux下编译xtrabackup-2.4.5

环境:aarch64/centos7.6 glibc-2.17 编译器:gcc version 5.5.0 (GCC) 官方参考文档:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/compiling_xtrabacku

STM32 + RT-Thread + LVGL

一、基本信息 MCU:STM32F103ZET6 RT-Thread:5.0.2 LVGL:8.3.11 LCD:ST7735s 编译环境:RTThread studio 二、LVGL 移植要求 16、32或64位微控制器或处理器 建议速度大于16 MHz 闪存/ROM: > 64 kB(建议180