声明
本文属于OneTS安全团队成员flatcc的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
CRC 循环冗余校验码
代码案例及基本原理
该算法全称为CRC32循环冗余校验码,其主要作用适用于校验数据的完整性。
CRC32多为32位,利用CRC32多项式的值从04C11DB7h或者EDB88320h中生成一张CRC32码表。
该表具有256个元素,然后就可以根据数据表来计算字符串或者文件的CRC32值。
识别的关键点,就是找到初始化时动态生成CRC32码表的地方,找到该表就找到了具体的细节,如下CRC32的常见写法。
/*********************************************************/
/* 描述:C版本CRC-32校正版
/* 日期:2021/8/10
/* 作者:flatcc
/* 来源:https://www.cnblogs.com/LyShark/p/13407677.html
/*********************************************************/
#include <stdio.h>
#include <string.h>
unsigned int CRC32(unsigned char* ptr, unsigned int Size)
{
unsigned int crcTable[256], crcTmp1;
// 动态生成CRC-32表
for (int i = 0; i < 256; i++)
{
crcTmp1 = i;
for (int j = 8; j > 0; j--)
{
if (crcTmp1 & 1) {
crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;
}
else crcTmp1 >>= 1;
}
crcTable[i] = crcTmp1;
}
// 计算CRC32值
unsigned int crcTmp2 = 0xFFFFFFFF;
while (Size--)
{
test = crcTable[(crcTmp2 ^ (*ptr)) & 0xFF]
crcTmp2 = ((crcTmp2 >> 8) & 0x00FFFFFF) ^ test;
ptr++;
}
return (crcTmp2 ^ 0xFFFFFFFF);
}
int main(int argc, char *argv[])
{
char* ptr = "hello world!";
unsigned int size = strlen(ptr);
unsigned int ret = CRC32((unsigned char *)ptr, size);
printf("CRC32 = %08x\n", ret);
return 0;
}
♦运行结果:
在线CRC网站:http://www.ip33.com/crc.html
记得关注我们,了解更多技术知识!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有