基于C語言的MD5加密算法設(shè)計與實現(xiàn)

MD5加密算法是一種單向加密算法,即數(shù)據(jù)只能加密,而不能被解密。MD5加密算法有兩個非常重要的特性:第一是任意兩段數(shù)據(jù),加密之后的密文是不相同的;第二是任意一段數(shù)據(jù),經(jīng)過加密以后,其結(jié)果永遠(yuǎn)是相同的。MD5加密算法在數(shù)字簽名、電子商務(wù)、銀行系統(tǒng)、證券系統(tǒng)、信息加密等領(lǐng)域中有著非常廣泛的應(yīng)用。那么,我今天就給大家介紹一下基于C語言的MD5加密算法如何實現(xiàn)。

一、MD5加密算法的原理與描述

MD5加密算法可以簡要的敘述為:MD5以512位分組來處理輸入的數(shù)據(jù),且每一分組又被劃分為16個32位子分組,經(jīng)過一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值,此散列值就是我們所需要的密文。MD5加密算法的具體步驟分析如下:

第一步:補位

首先對輸入的數(shù)據(jù)進行補位,使得數(shù)據(jù)位長度(BitsLength)對512求余,其結(jié)果是448。補位始終要進行,即使數(shù)據(jù)位對512求余的結(jié)果已經(jīng)是448。因此,數(shù)據(jù)位長度將被擴展至N*512+448,即N*64+56個字節(jié)(Bytes),N為一個正整數(shù)。補位的方法是,在數(shù)據(jù)的后面填充一個1和無數(shù)個0,直到滿足上面的條件時才停止用0對數(shù)據(jù)的填充。

第二步:補數(shù)據(jù)長度

用一個64位的數(shù)字表示數(shù)據(jù)的原始長度,將這個數(shù)字的8個字節(jié)按低位在前,高位在后的順序附加在補位后的數(shù)據(jù)后面。經(jīng)過這兩步的處理,現(xiàn)在的數(shù)據(jù)長度為:N*512+448+64,即(N+1)*512,長度恰好是512的倍數(shù)。

第三步:初始化MD5參數(shù)

4個32位的整型變量A,B,C,D(稱為鏈接變量),用來計算數(shù)據(jù)摘要。每一個整型變量,都是以十六進制數(shù)表示的數(shù)值,低位的字節(jié)在前面,他們被初始化為:A=Ox01234567,B=Ox89abcdef,C=Oxfedcba98,D=Ox76543210。當(dāng)設(shè)置好這四個鏈接變量后,就開始進入算法的四輪循環(huán)運算。在循環(huán)運算中將上面四個鏈接變量分別復(fù)制到另外四個變量中,即A復(fù)制到a,B復(fù)制到b,C復(fù)制到c,D復(fù)制到d。

第四步:定義MD5的位操作函數(shù)

定義4個位操作函數(shù),分別為F、G、H和I,其中X,Y,Z為32位整數(shù)。具體形式如下:

F(X,Y,Z)=(X&Y)|((~X)&Z)G(X,Y,Z)=(X&Z)|(Y&(~Z))H(X,Y,Z)=X∧Y∧ZI(X,Y,Z)=Y∧(X|(~Z))

其中&、|、~和∧分別為:與、或、非和異或。這4個函數(shù)說明:如果X,Y和Z的對應(yīng)位是獨立和均勻的,那么結(jié)果的每一位也應(yīng)是獨立和均勻的。F是一個逐位運算的函數(shù),即如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。

第五步:主循環(huán)四輪變換過程

主循環(huán)有四輪,每輪循環(huán)都很相似。每一輪進行16次操作,每次操作對a、b、c和d中的其中三個作一次非線性函數(shù)運算,然后將所得結(jié)果加上第四個變量,文本的一個子分組和一個常數(shù)。再將所得結(jié)果向右環(huán)移一個不定的數(shù),并加上a、b、c或d中之一。最后用該結(jié)果取代a、b、c或d中之一。其中每一輪采用的非線性函數(shù)為上一步已經(jīng)定義的4個位操作函數(shù)中的一個。

二、MD5加密算法的C語言實現(xiàn)

C語言是一種最新的、面向?qū)ο蟮母呒壘幊陶Z言,C語言增強了開發(fā)者的效率,同時也絕不損失C/C++原有的強大功能。C語言可以使程序員快速地編寫各種基于Microsoft.NET平臺的應(yīng)用程序,Microsoft.NET提供了一系列的工具和服務(wù)來最大程度地開發(fā)利用計算與通訊領(lǐng)域。C語言可以通過各類組件方便的轉(zhuǎn)化為XML網(wǎng)絡(luò)服務(wù),從而可以在任何操作系統(tǒng)上通過Internet進行調(diào)用。

其作用為:使用加密服務(wù)提供程序(CSP)提供的方法以完成對輸入數(shù)據(jù)MD5哈希值的計,其命名空間為System.Security.Cryptography.MD5CryptoServiceProv-ider類中計算輸入數(shù)據(jù)的哈希值方法如下:

publicbyte[]ComputeHash(byte[]buffer)

此方法只能接受byte類型數(shù)組作為最初的原始數(shù)據(jù),輸出的密文數(shù)據(jù)也是byte類型數(shù)組。因此,在對字符串加密之前,我們必須首先將這些字符串轉(zhuǎn)化為byte類型數(shù)組,這就要用到UTF8Encoding類的GetBytes方法,將字符串轉(zhuǎn)化為byte類型數(shù)組,而加密以后的結(jié)果也是使用數(shù)組輸出。

在本加密演示系統(tǒng)中對用戶輸入的關(guān)鍵信息,如:姓名、身份證號碼、密碼等信息,采用MD5加密算法進行加密,以便對此關(guān)鍵信息進行更加安全的保護。MD5加密算法的C語言應(yīng)用的關(guān)鍵程序段如下:

string

strpwd=this.txtMingWen.Text.Trim().

ToString();

//獲取明文值的字符串

try

{

//將字符串轉(zhuǎn)換為UTF8編碼的byte型數(shù)組byte[]data=Encoding.UTF8.GetBytes(strpwd);

//實例化MD5CryptoServiceProvider類的對象MD5CryptoServiceProvidermService=newMD5Cryp-toServiceProvider();

//通過MD5CryptoServiceProvider類的方法Com-puteHash計算哈希值byte[]result=mService.ComputeHash(data);

stringstrhash=;intcount=result.Length;for(inti=0;i<count;i++)

{

//將每個byte型數(shù)據(jù)轉(zhuǎn)換為十六進制的字符并組成字符串strhash+=string.Format({0:X},result[i]);

}

this.txtMiWen.Text=strhash;

//將密文值的結(jié)果顯示出來

}

{
this.txtMiWen.Text=ex.Message;

//若產(chǎn)生異常顯示異常情況

}

本加密演示系統(tǒng)運行的結(jié)果如圖一所示:

基于C語言的MD5加密算法設(shè)計與實現(xiàn)

小知識之XML語言

用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進行定義的源語言。