




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、哈爾濱工程大學實 驗 報 告 實 驗 名 稱: Hash 算法MD5 班 級: 學 號: 姓 名: 實 驗 時 間: 2014年6月 成 績: 指 導 教 師: 實驗室名稱: 哈爾濱工程大學實驗室與資產管理處 制一、實驗名稱 Hash算法2、 實驗目的 通過實際編程了解MD5 算法的加密和解密過程,加深對Hash 算法的認識。3、 實驗環(huán)境(實驗所使用的器件、儀器設備名稱及規(guī)格) 運行Windows 或Linux 操作系統(tǒng)的PC 機,具有gcc(Linux)、VC(Windows)等C 語言編譯環(huán)境。 4、 任務及其要求(1)利用自己所編的MD5 程序對一個文件進行處理,計算它的Hash 值,
2、提交程序代程和運算結果。(2)微軟的系統(tǒng)軟件都有MD5 驗證,嘗試查找軟件的MD5 值。同時,在Windows操作系統(tǒng)中,通過開始運行sigverif 命令,利用數字簽名查找驗證非Windows 的系統(tǒng)軟件。_ 5、 實驗設計(包括原理圖、真值表、分析及簡化過程、卡諾圖、源代碼等)在MD5 算法中,首先需要對信息進行填充,使其字節(jié)長度與448 模512 同余,即信息的字節(jié)長度擴展至n*512+448,n 為一個正整數。填充的方法如下:在信息的后面填充第一位為1,其余各位均為0,直到滿足上面的條件時才停止用0 對信息填充。然后,再在這個結果后面附加一個以64 位二進制表示的填充前信息長度。經過這
3、兩步的處理,現在的信息字節(jié)長度為n*512+448= (n+1)*512,即長度恰好是512 的整數倍,這樣做的目的是為滿足后面處理中后面處理中對信息長度的要求。n 個分組中第q 個分組表示為Yq。MD5 中有A、B、C、D,4 個32 位被稱作鏈接變量的整數參數,它們的初始值分別為:A=B=89abcdef,C=fedcba98,D=當設置好這個4 個鏈接變量后,就開始進入算法的4 輪循環(huán)運算。循環(huán)的次數是信息中512 位信息分組數目。首先將上面4 個鏈接變量復制到另外4 個變量中A 到AA,B 到BB,C 到CC,D 到DD,以備后面進行處理。然后進入主循環(huán),主循環(huán)有4 輪,每輪循環(huán)都很相
4、似。第1 輪進行16 次操作,每次操作對A、B、C 和D 中的其中3 個作一次非線性函數運算,然后將所得結果加上第4 個變量,文本的一個子分組和一個常數。再將所得結果向左循環(huán)移S 位,并加上A、B、C 或D 其中之一。最后用該結果取代A、B、C 或D 其中之一。以下是每次操作中用到的4 個非線性函數(每輪一個)。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 步操作按照一定次序順序進行。FF(A,B,C,D,Mj,S,Ti
5、) 表示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 的模運算。)Mj表示在第q 個512 位數據塊中的第j 個32 位子分組,0j15。常數Ti可以有如下選擇,在第i 步中,Ti是*abs(sin(i)的整數部分(注:= 232 。),i 的單位是弧度。其中,Ti是32 位
6、的隨機數源,它消除了輸入數據中任何規(guī)律性的特征。表1-4 說明了四輪主循環(huán)中每輪16 步操作的具體步驟。所有這些完成之后,將A、B、C、D 分別加上AA、BB、CC、DD。然后用下一分組數據繼續(xù)運行算法,最后的輸出是A、B、C 和D 的級聯(lián)。 #include #include #include #include typedef unsigned char *POINTER; typedef unsigned short int UINT2; typedef unsigned long int UINT4; typedef struct UINT4 state4; UINT4 count2;
7、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 S
8、32 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
9、, 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), (d) + (x) + (UINT4)(ac); (a) = ROTATE_LE
10、FT (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
11、 (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 = (unsigned char)(inputi 24) & 0xff); in
12、line 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-state0 = 0x; context-state1 = 0xefcdab89; con
13、text-state2 = 0x98badcfe; context-state3 = 0x; 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 count1+; context-count1 += (U
14、INT4)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(POINTER)&context-bufferindex, (POINTER)&inputi, inputLe
15、n-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)context, 0, sizeof (*context); void MD5Digest(char *psz
16、Input, 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值的字符串:); get
17、s(encrypt); printf(n加密結果:); MD5Digest(encrypt,strlen(encrypt),szDigest); int i; for (i=0;i16;i+) printf (%02X,(unsigned char)szDigesti);getchar();六、實驗步驟1 算法分析在光盤中附加了有關MD5 算法的頭文件md5.h 和md5.c,根據所提供的文件分析MD5 算法的實現過程。下面簡單介紹所用到的結構體變量和函數。程序中用到的結構體變量如下:typedef struct md5_stateulong64 lengty;ulong32 state4,c
18、urlen;unsigned char buf64;md5_state;length 記錄已經處理過的位數,curlen 記錄已經處理過的字節(jié)數,數組state 存儲上面所說的4 個鏈接變量,buf 作為處理過程中的緩存。程序中用到的函數如下:(1) void md5_init(md5_state *md)函數名稱:初始化函數參數說明:md 指向一個上面所提到的結構體變量。初始化時把curlen 和length 置為0,并把4 個鏈接變量儲存到state 中。(2)int md5_process(md5_state *md, const unsigned char *buf, unsigned
19、 long len)函數名稱:處理函數參數說明:md 指向經過初過初始化函數處理過的一個結構體變量。3buf 指向待處理的信息。len 是buf 中信息的長度,以字節(jié)為單位。這個函數對待處理的信息以512 位為單位進行壓縮,不足的部分存儲在結構體中的buf中,并且用len 來指示信息的末尾,這樣下次調用時會接著上一次的結果進行。(3)int md5_done(md5_state *md, unsigned char *Hash)函數名稱:完成函數參數說明:md 指向上面所處理過的結構體。Hash 指向存儲結果的緩沖區(qū)。這個函數對未完成的信息先進行padding 操作,然后處理,并把最終結果存在
20、Hash 指向的緩沖區(qū)中。(1) int md5_text(void)函數名稱:測試函數這個函數對上面的3 個函數進行測試。函數內部定義了一組信息和Hash 結果一一對應的數組。通過調用上面的3 個函數,并把結果和正確結果相比較,可以判斷程序正確與否。2 使用實例分析下面的程序實現了對”hello,world”進行MD5 處理的功能,可以作為調用MD5 函數接口的參考。#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(“%s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年五年級英語上冊 Unit 5 What does he do第四課時教學實錄 人教PEP
- 2024年五年級數學上冊 3 小數除法3課時 練習課配套教學實錄 新人教版
- 17 彩虹的形成 教學設計-2024-2025學年科學五年級上冊冀人版
- 三農信息管理手冊
- 季度工作進度計劃及實施方案
- 2023三年級英語上冊 Module 6 Unit 2 How old are you教學實錄 外研版(三起)
- 2023一年級語文上冊 第四單元 口語交際:我們做朋友教學實錄 新人教版
- 2024-2025學年高中歷史 第三單元 第二次世界大戰(zhàn) 探究活動課一 世界大戰(zhàn)的啟示-戰(zhàn)爭給人類帶來了什么教學教學實錄1 新人教版選修3
- 6 探訪古代文明(教學設計)2023-2024學年統(tǒng)編版道德與法治 六年級下冊
- 12急行跳遠教學設計8-八年級體育與健康
- 系統(tǒng)集成項目售后服務方案
- 2024年南寧市良慶區(qū)招聘專職化城市社區(qū)工作者筆試真題
- 蘇科版(2025新版)八年級下冊物理第七章 力 單元測試卷(含答案)
- 2019地質災害防治工程工程量清單計價規(guī)范
- 2022-2024年江蘇中考英語試題匯編:任務型閱讀填空和閱讀回答問題(教師)
- 游戲跨文化傳播-洞察分析
- 河北石家莊市市屬國有企業(yè)招聘筆試沖刺題2025
- 期貨基礎知識分享課件
- 2025-2030年中國鐵合金冶煉行業(yè)競爭格局展望及投資策略分析報告
- DB45T 2324-2021 公路橋梁有效預應力檢測技術規(guī)程
- 交通集團公路危橋及橋梁重要病害動態(tài)管理制度
評論
0/150
提交評論