hash算法md5試驗(yàn)報(bào)告_第1頁(yè)
hash算法md5試驗(yàn)報(bào)告_第2頁(yè)
hash算法md5試驗(yàn)報(bào)告_第3頁(yè)
hash算法md5試驗(yàn)報(bào)告_第4頁(yè)
hash算法md5試驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

4、中3個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第4個(gè)變量,文本的一個(gè)子分組和一個(gè)常數(shù)。再將所得結(jié)果向左循環(huán)移S位,并加上A、B、C或D其中之一。最后用該結(jié)果取代 A、曰C或D其中之一。以下是每次操作中用到的 4個(gè)非線性函數(shù)(每輪一個(gè))。F (B,C,D) =(BAC)V(BA D)(此處需修改)G (B,C,D) =(B A D) V (C A D) H (B,C,D) =B C DI (B,C,D) =C (B V D)(注:A是與,V是或,是非,是異或。)卜面為每一輪16步操作中的4次操作,16步操作按照一定次序順序進(jìn)行。)表示 A=B+(A+(F(B,C,D)+Mj+Ti)S)GG (A

5、,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 2的模運(yùn)算。)Mj表示在第q個(gè)512位數(shù)據(jù)塊中的第j個(gè)32位子分組,0WjW15。常數(shù)Ti可以有如下選擇,在第i步中,Ti是96*abs(sin(i)的整數(shù)部分(注:96= 2。),i的單位是弧度。其中, Ti是32位的隨機(jī)數(shù)源,它消除了輸入數(shù)據(jù)中任何規(guī)律性的特征。表1-4說(shuō)明了四輪主循

6、環(huán)中每輪 16步操作的具體步驟。所有這些完成之后,將 A、B、C D分別加上AA BR CC DD,然后用下一分組 數(shù)據(jù)繼續(xù)運(yùn)行算法,最后的輸出是A、B C和D的級(jí)聯(lián)。#include #include #include #include typedef unsigned char *POINTER;typedef unsigned short int UINT2;typedef unsigned long int UINT4;typedef structUINT4 state4;UINT4 count2;unsigned char buffer64; MD5_CTX;void MD5Init

7、(MD5_CTX *);void MD5Update(MD5_CTX *, unsigned char unsigned int);void MD5Final(unsigned char 16, MD5_CTX *);#define S11 7#define S12 12#define S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define S31 4#define S32 11#define S33 16#define S34 23 #define S41 6#define S42 1

8、0#define S43 15#define S44 21static unsigned char PADDING64 = 0 x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TOC o 1-5 h z 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;#defineF(x, y, z)(x) &(y)| (x)& (z)#defineG(x, y, z)(x) &(z)| (y)&(z)#define H(x,

9、 y, z) (x) A (y) A (z)#define I(x, y, z) (y)人(x) | (z)#define ROTATE_LEFT(x, n) (x) (32-(n)#define FF(a, b, c, d, x, s, ac) (a)+= F (b), (c), (d) + (x) + (UINT4)(ac); TOC o 1-5 h z (a)= ROTATE_LEFT (a),(s);(a)+=(b);)#define GG(a, b, c, d, x, s, ac) (a)+= G (b), (c), (d) + (x) + (UINT4)(ac);(a)= ROTA

10、TE_LEFT (a),(s);(a)+=(b);#define HH(a, b, c, d, x, s, ac) (a)+= H (b), (c), (d) + (x) + (UINT4)(ac);(a)= ROTATE_LEFT (a),(s);(a)+=(b);#define II(a, b, c, d, x, s, ac) (a)+= I (b), (c), (d) + (x) + (UINT4)(ac);(a)= ROTATE_LEFT (a),(s);(a)+=(b); inline void Encode(unsigned char *output, UINT4*input, u

11、nsigned int len)unsigned int i, j;for (i = 0, j = 0; j 8)outputj+1 = (unsigned char)(inputi& 0 xff);outputj+2=(unsignedchar)(inputi16)& 0 xff);outputj+3=(unsignedchar)(inputi24)& 0 xff);inline void Decode(UINT4 *output, unsigned char*input, unsigned int len) unsigned int i, j;for (i = 0, j = 0; j le

12、n; i+, j+= 4)outputi=(UINT4)inputj)(UINT4)inputj+1) 8) |(UINT4)inputj+2) 16) | (UINT4)inputj+3)count0 = context-count1 = 0;context-state0 = 0 x;context-state1 = 0 xefcdab89;context-state2 = 0 x98badcfe;context-state3 = 0 x;)inline voidMD5Update(MD5_CTX *context, unsignedchar *input, unsigned int inp

13、utLen)(unsigned int i, index, partLen;index = (unsigned int)(context-count0 3)& 0 x3F);count0+= (UINT4)inputLen3) (UINT4)inputLen count1+;context-count1 += (UINT4)inputLen 29);partLen = 64 - index;if (inputLen = partLen) memcpy(POINTER)&context-bufferindex,partLen);MD5Transform(context-state, contex

14、t-buffer);for (i = partLen; i + 63 state, &inputi);index = 0;elsei = 0;memcpy(POINTER)&context-bufferindex,(POINTER)&inputi, inputLen-i);inline void MD5Final(unsigned charMD5_CTX *context)unsigned char bits8;(POINTER)input,digest16,unsigned int index, padLen;Encode (bits, context-count, 8);index = (

15、unsigned int)(context-count0 3) & 0 x3f);padLen = (index state, 16);memset (POINTER)context, 0, 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 *)ps

16、zInput, len);MD5Final (unsigned char *)pszOutPut, &context);Int main() char szDigest16;char encrypt200;printf(請(qǐng)輸入要計(jì)算MD5fi的字符串:);gets(encrypt);printf(n加密結(jié)果:);MD5Digest(encrypt,strlen(encrypt),szDigest);int i;for(i=0;i16;i+)printf(%02X,(unsignedchar)szDigesti);getchar();六、實(shí)驗(yàn)步驟.算法分析在光盤中附加了有關(guān)MD5算法的頭文件和,

17、根據(jù)所提供的文件分析MD5算法的實(shí)現(xiàn)過(guò)程。下面簡(jiǎn)單介紹所用到的結(jié)構(gòu)體變量和函數(shù)。程序中用到的結(jié)構(gòu)體變量如下:typedef struct md5_stateulong64 lengty;ulong32 state4,curlen;unsigned char buf64;md5_state;length 記錄已經(jīng)處理過(guò)的位數(shù), curlen 記錄已經(jīng)處理過(guò)的字節(jié)數(shù),數(shù)組 state存儲(chǔ)上面所說(shuō)的4個(gè)鏈接變量,buf作為處理過(guò)程中的緩存。程序中用到的函數(shù)如下:void md5_init(md5_state *md)函數(shù)名稱:初始化函數(shù)參數(shù)說(shuō)明:md指向一個(gè)上面所提到的結(jié)構(gòu)體變量。初始化時(shí)把 cur

18、len和length 置為0,并把4個(gè)鏈接變量?jī)?chǔ)存到state中。int md5_process(md5_state *md, const unsigned char *buf, unsignedlong len)函數(shù)名稱:處理函數(shù)參數(shù)說(shuō)明:md指向經(jīng)過(guò)初過(guò)初始化函數(shù)處理過(guò)的一個(gè)結(jié)構(gòu)體變量。3buf指向待處理的信息。len是buf中信息的長(zhǎng)度,以字節(jié)為單位。這個(gè)函數(shù)對(duì)待處理的信息以512位為單位進(jìn)行壓縮,不足的部分存儲(chǔ)在結(jié)構(gòu)體中的buf 中,并且用len來(lái)指示信息的末尾,這樣下次調(diào)用時(shí)會(huì)接著上一次的結(jié)果進(jìn)行。int md5_done(md5_state *md, unsigned char *

19、Hash)函數(shù)名稱:完成函數(shù)參數(shù)說(shuō)明:md指向上面所處理過(guò)的結(jié)構(gòu)體。Hash指向存儲(chǔ)結(jié)果的緩沖區(qū)。這個(gè)函數(shù)對(duì)未完成的信息先進(jìn)行padding操作,然后處理,并把最終結(jié)果存在Hash 指向的緩沖區(qū)中。1) int md5_text(void)函數(shù)名稱:測(cè)試函數(shù)這個(gè)函數(shù)對(duì)上面的3個(gè)函數(shù)進(jìn)行測(cè)試。函數(shù)內(nèi)部定義了一組信息和Hash結(jié)果一一對(duì)應(yīng)的數(shù)組。通過(guò)調(diào)用上面的 3個(gè)函數(shù),并把結(jié)果和正確結(jié)果相比較,可以判斷程序正確與否。.使用實(shí)例分析下面的程序?qū)崿F(xiàn)了對(duì)“hello,world ”進(jìn)行MD5處理的功能,可以作為調(diào)用MD5函數(shù)接口的參考。#includeint main( int argc,char *argv口)md5_state md;unsigned char *in= hello, world! ,out16;md5_init(&md);md5_process(&md,in,strlen(in);md5_done(&md,out);printf( %S ,out);system( PAUSE );return 0;說(shuō)明:由于程序中所用的結(jié)構(gòu)體只在初始化函數(shù)中賦初始值,其中間過(guò)程可以保留下來(lái),所以對(duì)一段信息分多次處理可以得到同樣的結(jié)果。比如說(shuō)使用下面的語(yǔ)句可以得到和上面

溫馨提示

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

評(píng)論

0/150

提交評(píng)論