当前位置:首页 » 操作系统 » crc32c源码

crc32c源码

发布时间: 2025-08-18 06:48:20

Ⅰ UDP/IP硬件协议栈设计(三):校验

在设计协议栈时,确保数据的完整性至关重要。校验操作通过增加冗余位来验证数据的完整性。本文将深入探讨以太网帧中的两种校验方式:校验和(Checksum)与帧校验序列(FCS)。在分类数据帧的同时进行校验计算,可以提高效率并降低延迟。

校验和(Checksum)是一种通过累加数据完成的校验计算方法。在以太网帧中,Checksum用于验证数据报文的完整性。举个例子,考虑一组数据:{8'hf0, 8'hf1, 8'hf2, 8'hf3, 8'hf4, 8'hf5, 8'hf6, 8'hf7, 8'hf8, 8'hf9, 8'hfa},如何计算其Checksum?如果Checksum计算结果为16'h3d31,验证方法如下:

设计支持的协议包括ARP、ICMP和UDP。在ARP中,Checksum字段不存在。而在ICMP和UDP中,分别包含IP首部Checksum和ICMP首部Checksum,以及UDP首部Checksum。接下来将分步说明这些协议的Checksum计算过程。

IP首部的Checksum计算涉及首部的20字节(若包含选项则更长,本文不考虑)的16位划分。首先将Checksum字段初始化为16'h0,然后按照之前说明的累加算法进行计算。

在Wireshark中抓取一帧数据的IP首部,可以验证Checksum的正确性。使用Verilog实现时,代码结构与上述描述一致。

对于ICMP,Checksum计算包含首部和选项数据部分。计算时将Checksum字段置零,按照相同方式累加计算。计算过程类似于IP首部,但涉及数据的额外部分。

UDP首部中的Checksum计算与TCP首部类似,需考虑伪首部的加入。伪首部包括源IP、目的IP、预留、协议和UDP长度字段。同时,UDP首部的端口号和长度字段也被纳入计算。计算过程需要遵循伪首部的长度与实际长度一致的规则。

FCS(帧校验序列)位于以太网帧尾部,用于校验帧的完整性。FCS通过CRC32算法生成4字节的校验序列。CRC算法的入门可参考相关文章或Xilinx官方手册。实现FCS的硬件结构可以参考手册提供的示例。论文详细阐述了CRC32的硬件实现算法。

Verilog或VHDL源码可以直接生成,功能实现通过调用自定义函数。网页工具提供多项式选择并生成源码,方便使用。有时,网页工具可能不可用,但不影响整体流程。

在协议栈设计中,通过在数据分类时同步进行校验计算,确保接收的数据帧准确无误。对于发送的数据帧,在封装过程中完成校验计算,从而实现有效传输。若有不足之处,期待您的宝贵意见。

Ⅱ checksum这个校验的文件咋用

校验和(Checksum)

PE的可选映像头(IMAGE_OPTION_HEADER)里面,有一个Checksum字段,是该文件的校验和,一般EXE文件可以使0,但一些重要的和系统DLL及驱动文件必须有一个校验和.

Windows 提供了一个API函数MapFileAndCheckSum 测试文件的Checksum,它位于IMAGEHLP.DLL链接库里,其原型:

ULONG MapFileAndCheckSum

{

LPSTR FileName, // 文件名

LPDWORD HeaderSum, // 指向PE文件头的CheckSum

LPDWORD new_checksum // 指向新计算出的Checksum

}

程序一旦运行后,new_checksum 地址处将放当前的文件的校验和,old_checksum地址指向PE文件的checksum字段

安全的方法是将此值放在注册表里,需要时比较.

内存映像校验

磁盘文件完整性校验可以抵抗解密者直接修改文件,但对内存补丁却没有效果,必须对内存关键的代码进行校验.

1 对整个代码进行校验

每个程序至少有一个代码区块和数据区块,数据区块属性可读写,程序运行时全局变量通常会放在这里,这些数据会动态变化,因此校验这部分是没什么意义,而代码段只读,存放的是程序代码,在程序中数据数不会变的,因此用这部分进行内存校验是可行的.

具体实现方法:

(1) 从内存中映像中得到PE相关数据,如代码块的RVA和内存大小

(2) 根据得到代码区块的RVA值和内存大小,计算出内存数据的CRC-32值

(3) 读取自身文件先前存储的CRC-32值(PE文件头前一个字段),这个值是通过软件写进去的.

(4) 比较两个CRC-32值.

这样比较内存的代码段校验,只要内存的数据被修改,就能发现。

BOOL CodeSectionCRC32()

{

PIMAGE_DOS_HEADER pDosHeader = NULL;

PIMAGE_NT_HEADERS pNTHeader = NULL;

PIMAGE_SECTION_HEADER pSection = NULL;

DWORD ImageBase,OriginalCRC32;

ImageBase = (DWORD)GetMoleHandle(NULL); // 取基址

pDosHeader = (PIMAGE_DOS_HEADER)ImageBase;

pNtHeader = (PIMAGE_NT_HEADER32)((DWORD)pDosHeader + pDosHeader -> e_lfanew);

// 定位到PE文件头前4个字节值,并读取存储在这里的CRC -32值

OriginalCRC32 = *((DWORD*)(DWORD)pNtHeader - 4);

pSecHeader = IMAGE_FIRST_SECTION(pNtHeader); // 得到第一个区块的地址

//假设第一个区块就是代码区块

if(OriginalCRC32 == CRC32((BYTE*)ImageBase + pSecHeader -> VirtualAddress)

// 为了方便加壳

// 上一句也可为if(OriginalCRC32 == CRC32((BYTE *)0x401000, 0x36AE)

return TRUE;

else

return FALSE;

}

Ⅲ c#压缩解压 文件夹

我在做项目的时候需要将文件进行压缩和解压缩,于是就从http://www.icsharpcode.net下载了关于压缩和解压缩的源码,但是下载下来后,面对这么多的代码,一时不知如何下手。只好耐下心来,慢慢的研究,总算找到了门路。针对自己的需要改写了文件压缩和解压缩的两个类,分别为ZipClass和UnZipClass。其中碰到了不少困难,就决定写出来压缩和解压的程序后,一定把源码贴出来共享,让首次接触压缩和解压缩的朋友可以少走些弯路。下面就来解释如何在C#里用http://www.icsharpcode.net下载的SharpZipLib进行文件的压缩和解压缩。

首先需要在项目里引用SharpZipLib.dll。然后修改其中的关于压缩和解压缩的类。实现源码如下:

/// <summary>
/// 压缩文件
/// </summary>

using System;
using System.IO;

using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;

namespace Compression
{
public class ZipClass
{

public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize)
{
//如果文件没有找到,则报错
if (! System.IO.File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
}

System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
ZipEntry ZipEntry = new ZipEntry("ZippedFile");
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[] buffer = new byte[BlockSize];
System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,size);
try
{
while (size < StreamToZip.Length)
{
int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,sizeRead);
size += sizeRead;
}
}
catch(System.Exception ex)
{
throw ex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}

public void ZipFileMain(string[] args)
{
string[] filenames = Directory.GetFiles(args[0]);

Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));

s.SetLevel(6); // 0 - store only to 9 - means best compression

foreach (string file in filenames)
{
//打开压缩文件
FileStream fs = File.OpenRead(file);

byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(file);

entry.DateTime = DateTime.Now;

// set Size and the crc, because the information
// about the size and crc should be stored in the header
// if it is not set it is automatically written in the footer.
// (in this case size == crc == -1 in the header)
// Some ZIP programs have problems with zip files that don't store
// the size and crc in the header.
entry.Size = fs.Length;
fs.Close();

crc.Reset();
crc.Update(buffer);

entry.Crc = crc.Value;

s.PutNextEntry(entry);

s.Write(buffer, 0, buffer.Length);

}

s.Finish();
s.Close();
}
}
}

现在再来看看解压文件类的源码

/// <summary>
/// 解压文件
/// </summary>

using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;

using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;

namespace DeCompression
{
public class UnZipClass
{
public void UnZip(string[] args)
{
ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));

ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{

string directoryName = Path.GetDirectoryName(args[1]);
string fileName = Path.GetFileName(theEntry.Name);

//生成解压目录
Directory.CreateDirectory(directoryName);

if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1]+theEntry.Name);

int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}

streamWriter.Close();
}
}
s.Close();
}
}
}

有了压缩和解压缩的类以后,就要在窗体里调用了。怎么?是新手,不会调用?Ok,接着往下看如何在窗体里调用。

首先在窗体里放置两个命令按钮(不要告诉我你不会放啊~),然后编写以下源码

/// <summary>
/// 调用源码
/// </summary>

private void button2_Click_1(object sender, System.EventArgs e)
{
string []FileProperties=new string[2];
FileProperties[0]="C:\\unzipped\\";//待压缩文件目录
FileProperties[1]="C:\\zip\\a.zip"; //压缩后的目标文件
ZipClass Zc=new ZipClass();
Zc.ZipFileMain(FileProperties);
}

private void button2_Click(object sender, System.EventArgs e)
{
string []FileProperties=new string[2];
FileProperties[0]="C:\\zip\\test.zip";//待解压的文件
FileProperties[1]="C:\\unzipped\\";//解压后放置的目标目录
UnZipClass UnZc=new UnZipClass();
UnZc.UnZip(FileProperties);
}

好了,到此为止,如何压缩和解压缩的类都已经完成了,需要的朋友直接拿走调吧。

Ⅳ MD5、CRC32等信息

加密算法

MD5的全称是Message-digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald.L.Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却是面向32位的电脑。这三个算法的描述和c语言源代码在Internet RFC 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald.L.Rivest在1992年8月向IETF提交。

Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验和将产生MD2冲突。MD2算法的加密后结果是唯一的--即没有重复。

为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。Den boer和Bosselaers以及其他人很快的发现了攻击MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到MD4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,MD4就此被淘汰掉了。

尽管MD4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

一年以后,即1991年,Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4稍微慢一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD5完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

Van oorschot和Wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索MD5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代MD5算法的MD6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响MD5的安全性。上面所有这些都不足以成为MD5的在实际应用中的问题。并且,由于MD5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5也不失为一种非常优秀的中间技术),MD5怎么都应该算得上是非常安全的了。

2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。

MD5破解工程权威网站http://www.md5crk.com/ 是为了公开征集专门针对MD5的攻击而设立的,网站于2004年8月17日宣布:“中国研究人员发现了完整MD5算法的碰撞;Wang, Feng, Lai与Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128几个 Hash函数的碰撞。这是近年来密码学领域最具实质性的研究进展。使用他们的技术,在数个小时内就可以找到MD5碰撞。……由于这个里程碑式的发现,MD5CRK项目将在随后48小时内结束”。

CRC

在远距离数据通信中,为确保高效而无差错地传送数据,必须对数据进行校验即差错控制。循环冗余校验CRC(Cyclic Rendancy Check/Code)是对一个传送数据块进行校验,是一种高效的差错控制方法。

CRC校验采用多项式编码方法。多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2为模,加减时不进,错位,如同逻辑异或运算。

MD5用的是哈希函数,在计算机网络中应用较多的不可逆加密算法有RSA公司发明的MD5算法和由美国国家技术标准研究所建议的安全散列算法SHA.

Ⅳ YYKit源码探究(五十六) —— NSData分类之Hash(一)

上一篇主要介绍了NSDate的 Date modify 分类部分,这一篇主要看一下 NSData 分类的 Hash 部分。

下面我们看一下框架结构。

下面我们看一下API

下面我们看一下方法实现。

该方法返回的是md2 hash小写字母字符串。

方法笑扰慧实现

该方法返回的是md2 hash的NSData对象。

方法实现

该方法返回的是md4 hash小写字母字符串。

方法实现

该方法返回的是md4 hash的NSData对象。

方法实现

该方法返回的是md5 hash小写字母字符串。

方法实现

该方法返回的是md5 hash的NSData对象。

方法实现

该方法返回的是sha1 hash小写字母字符串。

方法实现

该方法返回的是sha1 hash的NSData对象。

方法实现

该方法返回的是sha224 hash小写字母字符串。

方法实现

该方法返回的是sha224 hash的NSData对象。

方法实现

该方法返回的是sha256 hash小写字母字符串。

方法实现

该方法返回的是sha256 hash的NSData对象。

方法实现

该方法返回的是sha384 hash小写字母字符串。

方法实现

该方法返回的是sha384 hash的NSData对象。

方法实现

该方法返回的是sha512 hash小写字母字符串。

方法实现

该方法返回的是sha512 hash的NSData对象。

方法实现

该方法返回的是md5和指定的key进行加密返回的小写字母字符串。

方法实现

该方法返回的是md5和指定的key进行加密返回的N。
SData数据。

方法实现

该方法返回的是SHA1指定的key进行加密返回的小写字母字符串。

方法实现

该方法返回的是SHA1和指定的key进行加密返回的N。
SData数据。

方法实现

该方法返回的是SHA224指定的key进行加密返回的小写字母字符串。

方法实现

该方法返回的是SHA224和指定的key进行加密返回的NSData数据。

方法实现

该方法返回的是SHA256指定的key进行加密返回的小写字母字符串。

方法实现

该方法返回的是SHA256和指定的key进行加密返回的NSData数据碰答。

方法实现

该方法返回的是SHA384指定的key进行加密返回的小写字母字符串。

方法实现

该方法返回的是SHA384和指定的key进行加密返回的NSData数据。

方法实现

该方法返回的是SHA512指定的key进行加密返回的小写字母字符串。

方法实现

该方李纤法返回的是SHA512和指定的key进行加密返回的NSData数据。

方法实现

该方法返回的是crc32 hash小写字符串。

方法实现

该方法返回的是crc32 hash值。

方法实现

热点内容
压缩率和面缩 发布:2025-08-18 09:06:35 浏览:498
苹果6splus的文件夹 发布:2025-08-18 09:01:08 浏览:385
macbookair解压 发布:2025-08-18 09:00:18 浏览:562
python匹配空格 发布:2025-08-18 08:57:04 浏览:551
苹果连接好了wifi怎么分享给安卓 发布:2025-08-18 08:50:40 浏览:227
android罗盘 发布:2025-08-18 08:48:28 浏览:741
可离线缓存小说的小说阅读器 发布:2025-08-18 08:41:32 浏览:347
我的世界中国版服务器战墙 发布:2025-08-18 08:28:31 浏览:996
云峰会存储 发布:2025-08-18 08:27:52 浏览:697
linux装数据库 发布:2025-08-18 08:27:12 浏览:389