歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

Hash算法MD5 實驗報告材料

  • 資源ID:85630280       資源大?。?span id="gpplawr" class="font-tahoma">142KB        全文頁數(shù):17頁
  • 資源格式: DOC        下載積分:10積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要10積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認(rèn)打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒有明確說明有答案則都視為沒有答案,請知曉。

Hash算法MD5 實驗報告材料

word工程大學(xué)實 驗 報 告 實 驗 名 稱:Hash 算法MD5 班 級:學(xué) 號:姓 名:實 驗 時 間: 2014年6月 成 績:指 導(dǎo) 教 師:實驗室名稱:工程大學(xué)實驗室與資產(chǎn)管理處 制一、實驗名稱Hash算法二、 實驗?zāi)康耐ㄟ^實際編程了解MD5 算法的加密和解密過程,加深對Hash 算法的認(rèn)識。三、 實驗環(huán)境實驗所使用的器件、儀器設(shè)備名稱與規(guī)格運行Windows 或Linux 操作系統(tǒng)的PC 機,具有g(shù)cc(Linux)、VCWindows等C 語言編譯環(huán)境。四、 任務(wù)與其要求1利用自己所編的MD5 程序?qū)σ粋€文件進展處理,計算它的Hash 值,提交程序代程和運算結(jié)果。2微軟的系統(tǒng)軟件都有MD5 驗證,嘗試查找軟件的MD5 值。同時,在Windows操作系統(tǒng)中,通過開始運行sigverif 命令,利用數(shù)字簽名查找驗證非Windows 的系統(tǒng)軟件。_五、 實驗設(shè)計包括原理圖、真值表、分析與簡化過程、卡諾圖、源代碼等在MD5 算法中,首先需要對信息進展填充,使其字節(jié)長度與448 模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=fedcba98,D=76543210當(dāng)設(shè)置好這個4 個變量后,就開始進入算法的4 輪循環(huán)運算。循環(huán)的次數(shù)是信息中512 位信息分組數(shù)目。首先將上面4 個變量復(fù)制到另外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ù)每輪一個。FB,C,D=(BC)_(ØBD)(此處需修改)GB,C,D=(BD)(CØD)HB,C,D=BCDI B,C,D=C(BD)注:是與,是或,Ø是非,是異或。2下面為每一輪16 步操作中的4 次操作,16 步操作按照一定次序順序進展。FFA,B,C,D,Mj,S,Ti表示A=B+(A+(F(B,C,D)+Mj+Ti)<<<S)GGA,B,C,D,Mj,S,Ti表示A=B+(A+(G(G,C,D)+Mj+Ti )<<<S)HHA,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 232 的模運算。)Mj表示在第q 個512 位數(shù)據(jù)塊中的第j 個32 位子分組,0j15。常數(shù)Ti可以有如下選擇,在第i 步中,Ti是4294967296*abs(sin(i)的整數(shù)局部注:4294967296= 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)。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> typedef unsigned char *POINTER; typedef unsigned short int UINT2; typedef unsigned long int UINT4; typedef struct UINT4 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 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 10 #define S43 15 #define S44 21 static unsigned char PADDING64 = 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, 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) #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) | (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 (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) += (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 len) unsigned int i, j; for (i = 0, j = 0; j < len; i+, j += 4) outputj = (unsigned char)(inputi & 0xff); outputj+1 = (unsigned char)(inputi >> 8) & 0xff); outputj+2 = (unsigned char)(inputi >> 16) & 0xff); outputj+3 = (unsigned char)(inputi >> 24) & 0xff); inline void Decode(UINT4 *output, unsigned char *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) | (UINT4)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); FF (a, b, c, d, x 0, S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x 1, S12, 0xe8c7b756); /* 2 */ 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 */ 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); /* 10 */ FF (c, d, a, b, x10, S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x11, 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, S24, 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, 0x455a14ed); /* 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, 0xfde5380c); /* 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); /* 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, x 0, S41, 0xf4292244); /* 49 */ II (d, a, b, c, x 7, S42, 0x432aff97); /* 50 */ II (c, d, a, b, x14, S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x 5, S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x12, S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x 3, S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x10, S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x 1, S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x 8, S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x15, S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x 6, S43, 0xa3014314); /* 59 */ II (b, c, d, a, x13, S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x 4, S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x11, S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x 2, S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x 9, S44, 0xeb86d391); /* 64 */ state0 += a; state1 += b; state2 += c; state3 += d; memset (POINTER)x, 0, sizeof (x); inline void MD5Init(MD5_CTX *context) context->count0 = context->count1 = 0; context->state0 = 0x67452301; context->state1 = 0xefcdab89; context->state2 = 0x98badcfe; context->state3 = 0x10325476; inline void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) unsigned int i, index, partLen; index = (unsigned int)(context->count0 >> 3) & 0x3F); if (context->count0 += (UINT4)inputLen << 3) < (UINT4)inputLen << 3) context->count1+; context->count1 += (UINT4)inputLen >> 29); partLen = 64 - index; if (inputLen >= partLen) memcpy(POINTER)&context->bufferindex, (POINTER)input, partLen); MD5Transform(context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform (context->state, &inputi); index = 0; else i = 0; memcpy(POINTER)&context->bufferindex, (POINTER)&inputi, inputLen-i); inline void MD5Final(unsigned char digest16, MD5_CTX *context) unsigned char bits8; unsigned int index, padLen; Encode (bits, context->count, 8); index = (unsigned int)(context->count0 >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update (context, PADDING, padLen); 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; unsigned int len = strlen (pszInput); MD5Init (&context); MD5Update (&context, (unsigned char *)pszInput, len); MD5Final (unsigned char *)pszOutPut, &context); Int main() char 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 算法的頭文件md5.h 和,根據(jù)所提供的文件分析MD5 算法的實現(xiàn)過程。下面簡單介紹所用到的結(jié)構(gòu)體變量和函數(shù)。程序中用到的結(jié)構(gòu)體變量如下:typedef struct md5_stateulong64 lengty;ulong32 state4,curlen;unsigned char buf64;md5_state;length 記錄已經(jīng)處理過的位數(shù),curlen 記錄已經(jīng)處理過的字節(jié)數(shù),數(shù)組state 存儲上面所說的4 個變量,buf 作為處理過程中的緩存。程序中用到的函數(shù)如下:1void md5_init(md5_state *md)函數(shù)名稱:初始化函數(shù)參數(shù)說明:md 指向一個上面所提到的結(jié)構(gòu)體變量。初始化時把curlen 和length 置為0,并把4 個變量儲存到state 中。2int 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 位為單位進展壓縮,不足的局部存儲在結(jié)構(gòu)體中的buf中,并且用len 來指示信息的末尾,這樣下次調(diào)用時會接著上一次的結(jié)果進展。3int md5_done(md5_state *md, unsigned char *Hash)函數(shù)名稱:完成函數(shù)參數(shù)說明:md 指向上面所處理過的結(jié)構(gòu)體。Hash 指向存儲結(jié)果的緩沖區(qū)。這個函數(shù)對未完成的信息先進展padding 操作,然后處理,并把最終結(jié)果存在Hash 指向的緩沖區(qū)中。1int md5_text(void)函數(shù)名稱:測試函數(shù)這個函數(shù)對上面的3 個函數(shù)進展測試。函數(shù)部定義了一組信息和Hash 結(jié)果一一對應(yīng)的數(shù)組。通過調(diào)用上面的3 個函數(shù),并把結(jié)果和正確結(jié)果相比擬,可以判斷程序正確與否。2使用實例分析下面的程序?qū)崿F(xiàn)了對hello,world進展MD5 處理的功能,可以作為調(diào)用MD5 函數(shù)接口的參考。#include “int 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;說明:由于程序中所用的結(jié)構(gòu)體只在初始化函數(shù)中賦初始值,其中間過程可以保存下來,所以對一段信息分屢次處理可以得到同樣的結(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 位的輸出值。九、 心得體會對單個bit分組的執(zhí)行將得到一樣的輸出偽沖突,MD5比MD4復(fù)雜,并且速度較MD4降低了近,但在抗安全性分析方面表現(xiàn)更好學(xué)生自評項目評定容評定結(jié)果預(yù)習(xí)情況1、 實驗準(zhǔn)備情況2、 預(yù)習(xí)報告完整性優(yōu)秀良好中等與格不與格實驗表現(xiàn)1、 實驗規(guī)性2、 實驗原理掌握3、 調(diào)試排錯能力4、 操作熟練程度5、 演示與辯論6、 設(shè)計創(chuàng)新能力優(yōu)秀良好中等與格不與格實驗報告1、 報告容完整性2、 報告容組織結(jié)構(gòu)3、 報告文字表達4、 實驗過程與分析5、 圖表規(guī)性6、 字跡與版面優(yōu)秀良好中等與格不與格備注實驗成績優(yōu)秀良好中等與格不與格學(xué)生簽字:日期:注:根據(jù)自己所做實驗情況,實事的給出“評定結(jié)果和“實驗成績,在相應(yīng)等級的填入。17 / 17

注意事項

本文(Hash算法MD5 實驗報告材料)為本站會員(無***)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




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