Hash算法MD5試驗報告_第1頁
Hash算法MD5試驗報告_第2頁
Hash算法MD5試驗報告_第3頁
Hash算法MD5試驗報告_第4頁
Hash算法MD5試驗報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、哈爾濱工程大學(xué)實驗報告實驗名稱:Hash算法MD5班級:學(xué)號:姓名:實驗時間:2014年6月成績:指導(dǎo)教師:實驗室名稱:哈爾濱工程大學(xué)實驗室與資產(chǎn)管理處 制一、實驗名稱Hash 算法 MD5二、實驗?zāi)康耐ㄟ^實際編程了解 MD5 算法的加密和解密過程,加深對 Hash 算法的 認(rèn)識。三、實驗環(huán)境(實驗所使用的器件、儀器設(shè)備名稱及規(guī)格)運行 Windows 或 Linux 操作系統(tǒng)的 PC 機,具有 gcc(Linux)、VC( Windows) 等 C 語言編譯環(huán)境。四、任務(wù)及其要求( 1)利用自己所編的 MD5 程序?qū)σ粋€文件進(jìn)行處理,計算它的Hash 值,提交程序代程和運算結(jié)果。(2)微軟的

2、系統(tǒng)軟件都有 MD5驗證,嘗試查找軟件的MD5值。同時,在Windows 操作系統(tǒng)中,通過開始t運行t sigverif命令,利用數(shù)字簽名查找驗證非 Windows 的系統(tǒng)軟件。 _五、實驗設(shè)計(包括原理圖、真值表、分析及簡化過程、卡諾圖、源 代碼等)在MD5算法中,首先需要對信息進(jìn)行填充,使其字節(jié)長度與448模512同余,即信息的字節(jié)長度擴(kuò)展至 n*512+448, n 為一個正整數(shù)。填充的方法如下:在信 息的后面填充第一位為 1 ,其余各位均為 0,直到滿足上面的條件時才停止用 0 對 信息填充。然后,再在這個結(jié)果后面附加一個以 64 位二進(jìn)制表示的填充前信息 長度。經(jīng)過這兩步的處理,現(xiàn)在

3、的信息字節(jié)長度為 n*512+448= (n+1)*512 ,即長 度恰好是 512 的整數(shù)倍, 這樣做的目的是為滿足后面處理中后面處理中對信息長度的要求。n個分組中第q個分組表示為Yq。MD5中有A、B、C、D, 4個32位 被稱作鏈接變量的整數(shù)參數(shù),它們的初始值分別為:A=01234567B=89abcdef,C=fedcba98 , D=當(dāng)設(shè)置好這個 4 個鏈接變量后, 就開始進(jìn)入算法的 4 輪循環(huán)運算。 循環(huán)的次數(shù)是 信息中 512 位信息分組數(shù)目。首先將上面 4 個鏈接變量復(fù)制到另外 4 個變量中 A到AA, B到BB, C到CC, D到DD,以備后面進(jìn)行處理。然后進(jìn)入主循環(huán),主循

4、環(huán)有4輪,每輪循環(huán)都很相似。第 1輪進(jìn)行16次操作,每次操作對 A、B、C和 D中的其中3個作一次非線性函數(shù)運算,然后將所得結(jié)果加上第4個變量,文本的一個子分組和一個常數(shù)。再將所得結(jié)果向左循環(huán)移 S位,并加上A、B、C或D其中之一。最后用該結(jié)果取代 A、B C或D其中之一。 以下是每次操作中用到的4個非線性函數(shù)(每輪一個)。F (B,C,D) =(BA C)V( BA D)(此處需修改)G ( B,C,D) =(BA D)V (CAD)H (B,C,D) =B® C® D1 (B,C,D) =C® (BV D)(注:A是與,V是或,是非,®是異或。)2下

5、面為每一輪16步操作中的4次操作,16步操作按照一定次序順序進(jìn)行。FF ( A,B,C,D,Mj,S,Ti) 表示 A=B+(A+(F(B,C,D)+Mj+Ti)«<S) GG (A,B,C,D,Mj,S,Ti)表示 A=B+(A+(G(G,C,D)+Mj+Ti )<<<S) HH (A,B,C,D,Mj,S,Ti)表示 A=B+(A+(H(B,C,D)+Mj+Ti )<<<S) II (A,B,C,D,Mj,S,Ti)表示 A=B+(A+(I (B,C,D)+Mj+Ti )<<<S)(注:"+”定義為mod 23

6、2的模運算。)Mj表示在第q個512位數(shù)據(jù)塊中的第j個32位子分組,0< j< 15。常數(shù)Ti可以有如下選擇,在第i步中,Ti是96*abs(sin(i)的整數(shù)部分(注:96=232。),i的單位是弧度。其中,Ti是32位的隨機數(shù)源,它消除了輸入數(shù)據(jù)中 任何規(guī)律性的特征。表 1-4說明了四輪主循環(huán)中每輪 16步操作的具體步驟。所有這些完成之后,將 A、B C、D分別加上AA、BB、CC DD。然后用下一分 組數(shù)據(jù)繼續(xù)運行算法,最后的輸出是A、B、C和D的級聯(lián)。#in elude <>#i nclude<>#i nclude<>#i nclude&

7、lt;>typedefun sig nedchar*POINTER;typedefun sig nedshortintUINT2;typedefun sig nedlongintUINT4;typedefstructUINT4 state4;UINT4 count2; unsigned char buffer64; MD5_CTX;void MD5Init(MD5_CTX *);void MD5Update(MD5_CTX *, unsigned char unsigned int);void MD5Final(unsigned char 16, MD5_CTX *);#define #

8、define #define #define #define #define #define #define #define #define #define #define #define #define #define #defineS1212S1317S1422S215S229S2314S2420S314S3211S3316S3423S416S4210S4315S4421S11 7staticunsignedcharPADDING64=0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0, 0, 0,0,0,0,0

9、,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0, 0, 0,0,0,0,0,0,0,0,0,0,0,0;0,0,0,&#define F(x, y, z) (x) & (y) | (x) (z)#defineG(x, y, z)(x)& (z)|(y)&(z)#defineH(x, y, z)(X) A(y) A(z)#defineI(x, y, z)(y)A(X)|(z)#defineROTATE_LEFT(x, n)(X)<<(n)|(x) >>(32-(n)#defineFF(a, b, c,d,X,s, ac)

10、(a)+=F (b),(c), (d) +(X)+(UINT4)(ac);(a)=ROTATE_LEFT (a), (s);(a) +=(b);#defineGG(a, b, c,d,X,s, ac)(a)+=G (b),(c), (d) +(X)+(UINT4)(ac);(a)=ROTATE_LEFT (a), (s);(a) +=(b);#defineHH(a, b, c,d,X,s, ac)(a)+=H (b),(c), (d) +(X)+(UINT4)(ac);(a)=ROTATE_LEFT (a), (s);(a) +=(b);#defineII(a, b, c,d,X,s, ac)

11、(a)+=I (b),(c), (d) +(X)+(UINT4)(ac);(a)=ROTATE_LEFT (a), (s); (a) += (b); inlinevoid Encode(unsignedchar *output, UINT4*input,unsigned int len)unsigned int i, j;for (i =0, j = 0; j < len; i+, j+=4) outputj =(unsigned char)(inputi &0Xff);outputj+1= (unsignedchar)(inputi>> 8)&0Xff);o

12、utputj+2= (unsignedchar)(inputi>> 16)&0Xff);outputj+3= (unsignedchar)(inputi>> 24)&0xff); unsigned charinline void Decode(UINT4 *output, *input, unsigned int len)unsigned int i, j;for (i = 0, j = 0; j < len; i+, j += 4)outputi = (UINT4)inputj) |(UINT4)inputj+1) <<8) |(UI

13、NT4)inputj+2) << 16)|(UINT4)inputj+3)<<24);inline void MD5Transform (UINT4 state4, unsigned char block64)UINT4 a = state0, b = state1, c = state2, d = state3, x16;Decode(x,block,64);1FF*/(a,b,c,d,x0,S11,0xd76aa478);/*2FF*/(d,a,b,c,x1,S12,0xe8c7b756);/*3FF*/(c,d,a,b,x2,S13,0x242070db);/*4

14、FF*/(b,c,d,a,x3,S14,0xc1bdceee);/*5FF*/(a,b,c,d,x4,S11,0xf57c0faf);/*6FF*/(d,a,b,c,x5,S12,0x4787c62a);/*7FF*/(c,d,a,b,x6,S13,0xa8304613);/*8FF*/(b,c,d,a,x7,S14,0xfd469501);/*FF(a,b,c,d,x8,S11,0x698098d8);/*9 */FF(d,a,b,c,x 9,S12,0x8b44f7af);/*10*/FF(c,d,a,b,x10, S13, 0xffff5bb1); /*11*/FF(b,c,d,a,x1

15、1,S14,0x895cd7be);/*12*/FF(a,b,c,d,x12,S11,0x6b901122);/*13*/FF(d,a,b,c,x13,S12,0xfd987193);/*14*/FF(c,d,a,b,x14,S13,0xa679438e);/*15*/FF(b,c,d,a,x15,S14,0x49b40821);/*16*/GG(a,b,c,d,x 1,S21,0xf61e2562);/*17*/GG(d,a,b,c,x 6,S22,0xc040b340);/*18*/GG(c,d,a,b,x11,S23,0x265e5a51);/*19*/GG(b,c,d,a,x 0,S2

16、4,0xe9b6c7aa);/*20*/GG(a,b,c,d,x 5,S21,0xd62f105d);/*21*/GG(d,a,b,c,x10,S22,0x2441453);/*22*/GG(c,d,a,b,x15,S23,0xd8a1e681);/*23*/GG(b,c,d,a,x 4,S24,0xe7d3fbc8);/*24*/GG(a,b,c,d,x 9,S21,0x21e1cde6);/*25*/GG(d,a,b,c,x14,S22,0xc33707d6);/*26*/GG(c,d,a,b,x 3,S23,0xf4d50d87);/*27*/GG(b,c,d,a,x 8,S24,0x4

17、55a14ed);/*28*/GG(a,b,c,d,x13,S21,0xa9e3e905);/*29*/GG(d,a,b,c,x 2,S22,0xfcefa3f8);/*30*/GG(c,d,a,b,x 7,S23,0x676f02d9);/*31*/GG(b,c,d,a,x12,S24,0x8d2a4c8a);/*32*/HH(a,b,c,d,x 5,S31,0xfffa3942);/*33*/HH(d,a,b,c,x 8,S32,0x8771f681);/*34*/HH(c,d,a,b,x11,S33,0x6d9d6122);/*35*/HH(b,c,d,a,x14,S34,0xfde53

18、80c);/*36*/HH(a,b,c,d,x 1,S31,0xa4beea44);/*37*/HH(d,a,b,c,x 4,S32,0x4bdecfa9);/*38*/HH(c,d,a,b,x 7,S33,0xf6bb4b60);/*39*/HH(b,c,d,a,x10,S34,0xbebfbc70);/*40*/HH(a,b,c,d,x13,S31,0x289b7ec6);/*41*/HH(d,a,b,c,x 0,S32,0xeaa127fa);/*42*/HH(c,d,a,b,x 3,S33,0xd4ef3085);/*43*/HH(b,c,d,a,x 6,S34,0x4881d05);

19、/*44*/HH(a,b,c,d,x 9,S31,0xd9d4d039);/*45*/HH(d,a,b,c,x12,S32,0xe6db99e5);/*46*/HH(c,d,a,b,x15,S33,0x1fa27cf8);/*47 */HH (b, c, d, a, x 2, S34, 0xc4ac5665); /* 48 */II(a,b,c,d,x0, S41, 0xf4292244); /*49*/II(d,a,b,c,x7, S42, 0x432aff97);/*50*/II(c,d,a,b,x14,S43, 0xab9423a7); /*51*/II(b,c,d,a,x5, S44,

20、 0xfc93a039);/*52*/II(a,b,c,d,x12,S41, 0x655b59c3); /*53*/II(d,a,b,c,x3, S42, 0x8f0ccc92);/*54*/II(c,d,a,b,x10,S43, 0xffeff47d); /*55*/II(b,c,d,a,x1, S44, 0x85845dd1);/*56*/II(a,b,c,d,x8, S41, 0x6fa87e4f);/*57*/II(d,a,b,c,x15,S42, 0xfe2ce6e0); /*58*/II(c,d,a,b,x6, S43, 0xa3014314);/*59*/II(b,c,d,a,x

21、13,S44, 0x4e0811a1); /*60*/II(a,b,c,d,x4, S41, 0xf7537e82);/*61*/II(d,a,b,c,x11,S42, 0xbd3af235); /*62*/II(c,d,a,b,x2, S43, 0x2ad7d2bb);/*63*/II(b,c,d,a,x9, S44, 0xeb86d391);/*64*/state0+=a;state1+=b;state2+=c;0;state3 += d;memset (POINTER)x, 0, sizeof (x); inline void MD5Init(MD5_CTX *context) cont

22、ext->count0 = context->count1 context->state0 = 0x; context->state1 = 0xefcdab89; context->state2 = 0x98badcfe;context->state3 = 0x;inline void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)unsigned int i, index, partLen;index = (unsignedint)(context->c

23、ount0>> 3) &0x3F);if (context->count0+= (UINT4)inputLen<< 3)< (UINT4)inputLen<< 3)context->count1+;context->count1 +=(UINT4)inputLen >>29);partLen64 - index;if (inputLen >= partLen) memcpy(POINTER)&context->bufferindex, (POINTER)input, partLen);MD5Tr

24、ansform(context->state, context->buffer);for (i = partLen; i + 63 < inputLen; i += 64)MD5Transform (context->state, &inputi);index = 0;elsei0;memcpy(POINTER)&context->bufferindex, (POINTER)&inputi, inputLen-i);inlinevoid MD5Final(unsigned charMD5_CTX*context) unsignedchar

25、bits8;unsignedint index,padLen;Encode(bits, context->count, 8);index= (unsignedint)(context->count00x3f);padLen= (index< 56) (56(120 -index);padLen);PADDING, bits, 8);MD5UpdateMD5UpdateEncode memset (context,(context, (digest, context->state, (POINTER)context, 0,>> 3) &digest16

26、,index)16);sizeof (*context);void MD5Digest(char *pszInput, unsigned long nInputSize, char *pszOutPut)MD5_CTX context;unsigned int len = strlen (pszInput);MD5Init (&context);MD5Update (&context, (unsigned char *)pszInput, len); MD5Final (unsigned char *)pszOutPut, &context);Int main() ch

27、ar szDigest16; char encrypt200;printf(" 請輸入要計算 MD5 值的字符串 :");gets(encrypt);printf("n 加密結(jié)果 :");MD5Digest(encrypt,strlen(encrypt),szDigest);int i;for (i=0;i<16;i+) printf ("%02X",(unsigned char)szDigesti); getchar();六、實驗步驟1 算法分析 在光盤中附加了有關(guān) MD5 算法的頭文件 和,根據(jù)所提供的文件分析MD5 算法的

28、實現(xiàn)過程。 下面簡單介紹所用到的結(jié)構(gòu)體變量和函數(shù)。程序中用到的結(jié)構(gòu)體變量如下: typedef struct md5_state ulong64 lengty;ulong32 state4,curlen;unsigned char buf64;md5_state;length 記錄已經(jīng)處理過的位數(shù), curlen 記錄已經(jīng)處理過的字節(jié)數(shù),數(shù)組 state 存 儲上面所說的 4 個鏈接變量, buf 作為處理過程中的緩存。 程序中用到的函數(shù)如下:( 1) void md5_init(md5_state *md) 函數(shù)名稱:初始化函數(shù) 參數(shù)說明:md 指向一個上面所提到的結(jié)構(gòu)體變量。初始化時把 c

29、urlen 和 length 置為 0,并 把 4 個 鏈接變量儲存到 state 中。( 2) int md5_process(md5_state *md, const unsigned char *buf, unsigned long len) 函數(shù)名稱:處理函數(shù)參數(shù)說明:md 指向經(jīng)過初過初始化函數(shù)處理過的一個結(jié)構(gòu)體變量。3buf 指向待處理的信息。len 是 buf 中信息的長度,以字節(jié)為單位。這個函數(shù)對待處理的信息以 512 位為單位進(jìn)行壓縮, 不足的部分存儲在結(jié)構(gòu)體中的buf中,并且用 len 來指示信息的末尾,這樣下次調(diào)用時會接著上一次的結(jié)果進(jìn)行。(3) int md5_done(md5_state *md, unsigned char *Hash) 函數(shù)名稱:完成函數(shù)參數(shù)說明: md 指向上面所處理過的結(jié)構(gòu)體。 Hash 指向存儲結(jié)果的緩沖區(qū)。 這個函數(shù)對未完成的信息先進(jìn)行 padding 操作,然后處理,并把最終結(jié)果存在 Hash 指向的緩沖區(qū)中。( 1) int md5_text(void) 函數(shù)名稱:測試函數(shù) 這個函數(shù)對上面的 3 個函數(shù)進(jìn)行測試。函數(shù)內(nèi)部定義了一組信息和 Hash 結(jié)果一 一對應(yīng)的數(shù)組。通過調(diào)用上面的 3 個

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論