Hash算法MD5 實驗報告材料

上傳人:無*** 文檔編號:85630280 上傳時間:2022-05-06 格式:DOC 頁數(shù):17 大小:142KB
收藏 版權(quán)申訴 舉報 下載
Hash算法MD5 實驗報告材料_第1頁
第1頁 / 共17頁
Hash算法MD5 實驗報告材料_第2頁
第2頁 / 共17頁
Hash算法MD5 實驗報告材料_第3頁
第3頁 / 共17頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《Hash算法MD5 實驗報告材料》由會員分享,可在線閱讀,更多相關(guān)《Hash算法MD5 實驗報告材料(17頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、word 工程大學 實 驗 報 告 實 驗 名 稱:Hash 算法MD5 班 級: 學 號: 姓 名: 實 驗 時 間: 2014年6月 成 績: 指 導 教 師: 實驗室名稱: 工程大學實驗室與資產(chǎn)管理處 制 一、實驗名稱 Hash算法MD5 二、 實驗目的 通過實際編程了解MD5 算法的加密和解密過程,加深對Hash 算法的認識。 三、 實驗環(huán)境〔實驗所使用的器件、儀器設備名稱與規(guī)格〕 運

2、行Windows 或Linux 操作系統(tǒng)的PC 機,具有g(shù)cc(Linux)、VC〔Windows〕等C 語言編譯環(huán)境。 四、 任務與其要求 〔1〕利用自己所編的MD5 程序?qū)σ粋€文件進展處理,計算它的Hash 值,提交程 序代程和運算結(jié)果。 〔2〕微軟的系統(tǒng)軟件都有MD5 驗證,嘗試查找軟件的MD5 值。同時,在Windows 操作系統(tǒng)中,通過開始→運行→sigverif 命令,利用數(shù)字簽名查找驗證非Windows 的系 統(tǒng)軟件。__ 五、 實驗設計〔包括原理圖、真值表、分析與簡化過程、卡諾圖、源代碼等〕 在MD5 算法中,首先需要對信息進展填充,使其字節(jié)長度與4

3、48 模512 同余,即信息的字節(jié)長度擴展至n*512+448,n 為一個正整數(shù)。填充的方法如下:在信息的后面填充第一位為1,其余各位均為0,直到滿足上面的條件時才停止用0 對信息填充。然后,再在這個結(jié)果后面附加一個以64 位二進制表示的填充前信息長度。經(jīng)過這兩步的處理,現(xiàn)在的信息字節(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=fedcba

4、98,D=76543210 當設置好這個4 個變量后,就開始進入算法的4 輪循環(huán)運算。循環(huán)的次數(shù)是信息中512 位信息分組數(shù)目。首先將上面4 個變量復制到另外4 個變量中A 到AA,B 到BB,C 到CC,D 到DD,以備后面進展處理。然后進入主循環(huán),主循環(huán)有4 輪,每輪循環(huán)都很相似。第1 輪進展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ù)〔每輪一

5、個〕。 F〔B,C,D〕=(B∧C)∨__________(?B∧D)(此處需修改) G〔B,C,D〕=(B∧D)∨(C∧?D) H〔B,C,D〕=B⊕C⊕D I 〔B,C,D〕=C⊕(B∨D) 〔注:∧是與,∨是或,?是非,⊕是異或?!? 2 下面為每一輪16 步操作中的4 次操作,16 步操作按照一定次序順序進展。 FF〔A,B,C,D,M[j],S,T[i]〕表示A=B+(A+(F(B,C,D)+M[j]+T[i])<<

6、j],S,T[i]〕表示A=B+(A+(H(B,C,D)+M[j]+T[i] )<<

7、 說明了四輪主循環(huán)中每輪16 步操作的具體步驟。 所有這些完成之后,將A、B、C、D 分別加上AA、BB、CC、DD。然后用下一分組 數(shù)據(jù)繼續(xù)運行算法,最后的輸出是A、B、C 和D 的級聯(lián)。 #include #include #include #include typedef unsigned char *POINTER; typedef unsigned short int UINT2;

8、 typedef unsigned long int UINT4; typedef struct { UINT4 state[4]; UINT4 count[2]; unsigned char buffer[64]; } MD5_CTX; void MD5Init(MD5_CTX *); void MD5Update(MD5_CTX *, unsigned char *, unsigned int);

9、 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 S

10、32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

11、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 }; #define F(x, y, z)

12、 (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) #define ROTATE_LEFT(x, n) (((x) << (n)) |

13、 ((x) >> (32-(n)))) #define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define GG(a, b, c, d, x, s, ac) { (a) += G ((

14、b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_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) += (

15、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, unsigned int

16、len) { unsigned int i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (unsigned char)(input[i] & 0xff); output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j+2] = (unsigned char

17、)((input[i] >> 16) & 0xff); output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); } } inline void Decode(UINT4 *output, unsigned char *input, unsigned int len) { unsigned int i, j; for (i = 0, j =

18、 0; j < len; i++, j += 4) output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); } inline void MD5Transform (UINT4 state[4], unsigned char block[64])

19、 { UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64); FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */

20、 FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6

21、*/ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /

22、* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193);

23、 /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc0

24、40b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22

25、, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], 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, x[1

26、4], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b,

27、c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d,

28、a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH

29、 (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */

30、 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); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /

31、* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ II (a, b, c, d, x[ 0], S41, 0xf42922

32、44); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41,

33、0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8],

34、 S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d,

35、x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] +=

36、a; state[1] += b; state[2] += c; state[3] += d; memset ((POINTER)x, 0, sizeof (x)); } inline void MD5Init(MD5_CTX *context) { context->count[0] = context->count[1] = 0; context->state[0] = 0x6745230

37、1; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } inline void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) { unsigned int i, inde

38、x, partLen; index = (unsigned int)((context->count[0] >> 3) & 0x3F); if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) context->count[1]++; context->count[1] += ((UINT4)inputLen >> 29); partLen

39、 = 64 - index; if (inputLen >= partLen) { memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform(context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform (conte

40、xt->state, &input[i]); index = 0; } else i = 0; memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); } inline void MD5Final(unsigned char digest[16], MD5_CTX *context) { unsigned char bits[8]

41、; unsigned int index, padLen; Encode (bits, context->count, 8); index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen);

42、 MD5Update (context, bits, 8); Encode (digest, context->state, 16); memset ((POINTER)context, 0, sizeof (*context)); } void MD5Digest(char *pszInput, unsigned long nInputSize, char *pszOutPut) { MD5_CTX context; un

43、signed int len = strlen (pszInput); MD5Init (&context); MD5Update (&context, (unsigned char *)pszInput, len); MD5Final ((unsigned char *)pszOutPut, &context); } Int main() { char szDigest[16]; char encrypt[200]; printf("請

44、輸入要計算MD5值的字符串:"); gets(encrypt); printf("\n加密結(jié)果:"); MD5Digest(encrypt,strlen(encrypt),szDigest); int i; for (i=0;i<16;i++) printf ("%02X",(unsigned char)szDigest[i]); getchar(); } 六、實驗步驟 1.算法分析 在光盤中附加了有關(guān)MD5 算法的頭文件md5.h 和,根據(jù)所提供的文件分析 MD5 算法的實現(xiàn)過程。 下面簡單介紹所用到的結(jié)構(gòu)體變量和函數(shù)。程序中用到

45、的結(jié)構(gòu)體變量如下: typedef struct md5_state{ ulong64 lengty; ulong32 state[4],curlen; unsigned char buf[64]; }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)體變量。初始化時把curlen 和length 置

46、為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)體變量。 3 buf 指向待處理的信息。 len 是buf 息的長度,以字節(jié)為單位。 這個函數(shù)對待處理的信息以512 位為單位進展壓縮,不足的局部存儲在結(jié)構(gòu)體中的buf 中,并且用len 來指示信息的末尾,這樣下次調(diào)用時會接著上一次的結(jié)果進展。 〔3〕int md5_done(md5_state

47、*md, unsigned char *Hash) 函數(shù)名稱:完成函數(shù) 參數(shù)說明:md 指向上面所處理過的結(jié)構(gòu)體。Hash 指向存儲結(jié)果的緩沖區(qū)。 這個函數(shù)對未完成的信息先進展padding 操作,然后處理,并把最終結(jié)果存在Hash 指 向的緩沖區(qū)中。 〔1〕int md5_text(void) 函數(shù)名稱:測試函數(shù) 這個函數(shù)對上面的3 個函數(shù)進展測試。函數(shù)部定義了一組信息和Hash 結(jié)果一一對應 的數(shù)組。通過調(diào)用上面的3 個函數(shù),并把結(jié)果和正確結(jié)果相比擬,可以判斷程序正確與 否。 2.使用實例分析 下面的程序?qū)崿F(xiàn)了對〞hello,world〞進展MD5 處理的功能,可以作

48、為調(diào)用MD5 函數(shù)接口 的參考。 #include “〞 int main( int argc,char *argv[]) { md5_state md; unsigned char *in=〞hello, world!〞,out[16]; md5_init(&md); md5_process(&md,in,strlen(in)); md5_done(&md,out); printf(“%s〞,out); system(“PAUSE〞); return 0; } 說明:由于程序中所用的結(jié)構(gòu)體只在初始化函數(shù)中賦初始值,其中間過程可以保存下來, 所以對一段信息分屢次處

49、理可以得到同樣的結(jié)果。比如說使用下面的語句可以得到和上 面例子一樣的結(jié)果: md5_init(&md); md5_process(&md, “hello,〞,6); md5_process(&md, “world〞,5); md5_done(&md, out); 七、 實驗過程與分析 八、 實驗結(jié)果總結(jié) Hash 函數(shù)是將任意長的數(shù)據(jù)塊轉(zhuǎn)換成一個較短的定長輸出數(shù)字串的函數(shù),輸出的結(jié)果稱為Hash 值。MD5 算法對任意長度的輸入值處理后產(chǎn)生128 位的輸出值。 九、 心得體會  ?。停模祵蝹€512bit分組的執(zhí)行將得到一樣的輸出

50、〔偽沖突〕,MD5比MD4復雜,并且速度較MD4降低了近30%,,但在抗安全性分析方面表現(xiàn)更好 學生自評 項目 評定容 評定結(jié)果 預 習 情 況 1、 實驗準備情況 2、 預習報告完整性 〔√〕優(yōu)秀 〔〕良好 〔〕中等 〔〕與格 〔〕不與格 實 驗 表 現(xiàn) 1、 實驗規(guī)性 2、 實驗原理掌握 3、 調(diào)試排錯能力 4、 操作熟練程度 5、 演示與辯論 6、 設計創(chuàng)新能力 〔√〕優(yōu)秀 〔〕良好 〔〕中等 〔〕與格 〔〕不與格 實 驗 報 告 1、 報告容完整性 2、 報告容組織結(jié)構(gòu) 3、 報告文字表達 4、 實驗過程與分析 5、 圖表規(guī)性 6、 字跡與版面 〔√〕優(yōu)秀 〔〕良好 〔〕中等 〔〕與格 〔〕不與格 備 注 實驗成績 〔〕優(yōu)秀〔〕良好〔〕中等 〔〕與格〔〕不與格 學生簽字: 日期: 注:根據(jù)自己所做實驗情況,實事的給出“評定結(jié)果〞和“實驗成績〞,在相應等級的〔〕填入■。 17 / 17

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!