




版權(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算法2、 實(shí)驗(yàn)?zāi)康?通過(guò)實(shí)際編程了解MD5 算法的加密和解密過(guò)程,加深對(duì)Hash 算法的認(rèn)識(shí)。3、 實(shí)驗(yàn)環(huán)境(實(shí)驗(yàn)所使用的器件、儀器設(shè)備名稱及規(guī)格) 運(yùn)行Windows 或Linux 操作系統(tǒng)的PC 機(jī),具有g(shù)cc(Linux)、VC(Windows)等C 語(yǔ)言編譯環(huán)境。 4、 任務(wù)及其要求(1)利用自己所編的MD5 程序?qū)σ粋€(gè)文件進(jìn)行處理,計(jì)算它的Has
2、h 值,提交程序代程和運(yùn)算結(jié)果。(2)微軟的系統(tǒng)軟件都有MD5 驗(yàn)證,嘗試查找軟件的MD5 值。同時(shí),在Windows操作系統(tǒng)中,通過(guò)開(kāi)始運(yùn)行sigverif 命令,利用數(shù)字簽名查找驗(yàn)證非Windows 的系統(tǒng)軟件。_ 5、 實(shí)驗(yàn)設(shè)計(jì)(包括原理圖、真值表、分析及簡(jiǎn)化過(guò)程、卡諾圖、源代碼等)在MD5 算法中,首先需要對(duì)信息進(jìn)行填充,使其字節(jié)長(zhǎng)度與448 模512 同余,即信息的字節(jié)長(zhǎng)度擴(kuò)展至n*512+448,n 為一個(gè)正整數(shù)。填充的方法如下:在信息的后面填充第一位為1,其余各位均為0,直到滿足上面的條件時(shí)才停止用0 對(duì)信息填充。然后,再在這個(gè)結(jié)果后面附加一個(gè)以64 位二進(jìn)制表示的填充前信息長(zhǎng)度
3、。經(jīng)過(guò)這兩步的處理,現(xiàn)在的信息字節(jié)長(zhǎng)度為n*512+448= (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=76543210當(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)
4、入主循環(huán),主循環(huán)有4 輪,每輪循環(huán)都很相似。第1 輪進(jìn)行16 次操作,每次操作對(duì)A、B、C 和D 中的其中3 個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第4 個(gè)變量,文本的一個(gè)子分組和一個(gè)常數(shù)。再將所得結(jié)果向左循環(huán)移S 位,并加上A、B、C 或D 其中之一。最后用該結(jié)果取代A、B、C 或D 其中之一。以下是每次操作中用到的4 個(gè)非線性函數(shù)(每輪一個(gè))。F(B,C,D)=(BC)_(BD)(此處需修改)G(B,C,D)=(BD)(CD)H(B,C,D)=BCDI (B,C,D)=C(BD)(注:是與,是或, 是非,是異或。)2下面為每一輪16 步操作中的4 次操作,16 步操作按照一定次序順序進(jìn)
5、行。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 232 的模運(yùn)算。)Mj表示在第q 個(gè)512 位數(shù)據(jù)塊中的第j 個(gè)32 位子分組,0j15。常數(shù)Ti可以有如下選擇,在第i 步中,Ti是4294967296*abs(sin(i)的整數(shù)部分(
6、注:4294967296= 232 。),i 的單位是弧度。其中,Ti是32 位的隨機(jī)數(shù)源,它消除了輸入數(shù)據(jù)中任何規(guī)律性的特征。表1-4 說(shuō)明了四輪主循環(huán)中每輪16 步操作的具體步驟。所有這些完成之后,將A、B、C、D 分別加上AA、BB、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; typ
7、edef 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 1
8、4 #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,
9、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) (32-(n) #define FF(a, b, c, d, x, s, ac) (a) += F (b), (c),
10、(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); #
11、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 8) & 0xff); outputj+2 = (unsigned char)(inputi 16) & 0xff); outputj+3
12、= (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) count0 = context-count1 = 0; context-state
13、0 = 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)i
14、nputLen 3) (UINT4)inputLen 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 state, &inputi); index = 0; else i = 0; memcpy
15、(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 state, 16); memset (POINTER
16、)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 s
17、zDigest16; char encrypt200; printf(請(qǐng)輸入要計(jì)算MD5值的字符串:); gets(encrypt); printf(n加密結(jié)果:); MD5Digest(encrypt,strlen(encrypt),szDigest); int i; for (i=0;i16;i+) printf (%02X,(unsigned char)szDigesti);getchar();六、實(shí)驗(yàn)步驟1 算法分析在光盤(pán)中附加了有關(guān)MD5 算法的頭文件md5.h 和md5.c,根據(jù)所提供的文件分析MD5 算法的實(shí)現(xiàn)過(guò)程。下面簡(jiǎn)單介紹所用到的結(jié)構(gòu)體變量和函數(shù)。程序中用到的結(jié)構(gòu)體變量如下
18、: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ù)如下:(1) void md5_init(md5_state *md)函數(shù)名稱:初始化函數(shù)參數(shù)說(shuō)明:md 指向一個(gè)上面所提到的結(jié)構(gòu)體變量。初始化時(shí)把curlen 和length 置為0,并把4 個(gè)鏈接變量?jī)?chǔ)存到state 中。(2)int md5_p
19、rocess(md5_state *md, const unsigned char *buf, unsigned long 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)行。(3)int md5_done(md5_state *md, unsigned char *Hash)函數(shù)名稱:完成函數(shù)參數(shù)說(shuō)明:md 指向上面所處理過(guò)的結(jié)構(gòu)
20、體。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é)果相比較,可以判斷程序正確與否。2 使用實(shí)例分析下面的程序?qū)崿F(xiàn)了對(duì)”hello,world”進(jìn)行MD5 處理的功能,可以作為調(diào)用MD5 函數(shù)接口的參考。#include “md5.h”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
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 光纖耦合技術(shù)考核試卷
- 幼兒園一日活動(dòng)生活環(huán)節(jié)的組織策略
- 健康信息可視化技術(shù)考核試卷
- 中國(guó)藝術(shù)品收藏品市場(chǎng)分析與展望
- 旅游行業(yè)市場(chǎng)變化及未來(lái)五年發(fā)展策略分析
- 木結(jié)構(gòu)與混合結(jié)構(gòu)的房屋設(shè)計(jì)比較
- 神經(jīng)外科手術(shù)項(xiàng)目及技術(shù)要求詳解
- 工業(yè)數(shù)字化轉(zhuǎn)型核心技術(shù)與市場(chǎng)應(yīng)用前景分析報(bào)告
- 高效管理病組成本:DRG病組成本核算引擎在醫(yī)療行業(yè)的實(shí)踐
- 攝影技巧與后期處理全解
- GB/T 23932-2009建筑用金屬面絕熱夾芯板
- 防靜電手環(huán)測(cè)試指導(dǎo)書(shū)
- 機(jī)電控制工程
- 碼頭承包經(jīng)營(yíng)合同
- 建筑工程防水(防滲漏)處理PPT
- WTO世界貿(mào)易組織概論期末復(fù)習(xí)題
- 溫病學(xué)講義劉景源
- 幼兒園教育活動(dòng)設(shè)計(jì)與指導(dǎo)幼兒園教育活動(dòng)設(shè)計(jì)的基本模式
- 校企共建校內(nèi)實(shí)訓(xùn)基地協(xié)議模版
- 嵌頓疝病人應(yīng)急預(yù)案
- 影響全國(guó)房?jī)r(jià)因素的多元回歸分析-中南財(cái)經(jīng)政法大學(xué)《統(tǒng)計(jì)分析軟件》論文報(bào)告
評(píng)論
0/150
提交評(píng)論