當前位置:首頁 » 操作系統 » 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