MD5加密算法設(shè)計_第1頁
MD5加密算法設(shè)計_第2頁
MD5加密算法設(shè)計_第3頁
MD5加密算法設(shè)計_第4頁
MD5加密算法設(shè)計_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京理工大學(xué)珠海學(xué)院實驗報告ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY設(shè)計題目 MD5加密算法設(shè)計 完成時間 2014.4.22 成績一、設(shè)計目的 深入了解MD5加密算法的過程二、理論依據(jù) 對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值。三、設(shè)計方案總體流程如下圖所示,表示第i個分組,每次的運算都由前一輪的128位結(jié)果值和第i塊512bit值進(jìn)行運算。每一分組的算法流程如下:第

2、一分組需要將上面四個鏈接變量復(fù)制到另外四個變量中:A到a,B到b,C到c,D到d。從第二分組開始的變量為上一分組的運算結(jié)果。主循環(huán)有四輪(MD4只有三輪),每輪循環(huán)都很相似。第一輪進(jìn)行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數(shù)運算,然后將所得結(jié)果加上第四個變量,文本的一個子分組和一個常數(shù)。再將所得結(jié)果向左環(huán)移一個不定的數(shù),并加上a、b、c或d中之一。最后用該結(jié)果取代a、b、c或d中之一。以下是每次操作中用到的四個非線性函數(shù)(每輪一個)。F(X,Y,Z) =(X&Y)|(X)&Z)G(X,Y,Z) =(X&Z)|(Y&(Z)H(X,Y,Z) =XYZI(X,Y,Z)=Y(X

3、|(Z)(&;是與,|是或,是非,是異或)這四個函數(shù)的說明:如果X、Y和Z的對應(yīng)位是獨立和均勻的,那么結(jié)果的每一位也應(yīng)是獨立和均勻的。F是一個逐位運算的函數(shù)。即,如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。假設(shè)Mj表示消息的第j個子分組(從0到15),常數(shù)ti是4294967296*abs(sin(i))的整數(shù)部分,i取值從1到64,單位是弧度。(4294967296等于2的32次方)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(b,c,d) + M

4、j + ti) s)HH(a,b,c,d,Mj,s,ti)表示 a = b + (a + H(b,c,d) + Mj + ti) s)(a,b,c,d,Mj,s,ti)表示 a = b + (a + I(b,c,d) + Mj + ti) count0 = context-count1 = 0; context-state0 = 0x67452301; context-state1 = 0xefcdab89; context-state2 = 0x98badcfe; context-state3 = 0x10325476;/*將與加密的信息傳遞給md5結(jié)構(gòu),可以多次調(diào)用context:初始化過

5、了的md5結(jié)構(gòu)input:欲加密的信息,可以任意長inputLen:指定input的長度*/void MD5Update(MD5_CTX *context,unsigned char * input,unsigned int inputLen) unsigned int i, index, partLen;/*計算已有信息的bits長度的字節(jié)數(shù)的模64, 64bytes=512bits。 用于判斷已有信息加上當(dāng)前傳過來的信息的總長度能不能達(dá)到512bits, 如果能夠達(dá)到則對湊夠的512bits進(jìn)行一次處理*/ index = (unsigned int)(context-count0 3)

6、& 0x3F);/*更新已有信息的bits長度*/ if(context-count0 += (UINT4)inputLen 3) (UINT4)inputLen count1+; context-count1 += (UINT4)inputLen 29); /*計算已有的字節(jié)數(shù)長度還差多少字節(jié)可以 湊成64的整倍數(shù)*/ partLen = 64 - index;/*如果當(dāng)前輸入的字節(jié)數(shù) 大于 已有字節(jié)數(shù)長度補足64字節(jié)整倍數(shù)所差的字節(jié)數(shù)*/ if(inputLen = partLen) /*用當(dāng)前輸入的內(nèi)容把context-buffer的內(nèi)容補足512bits*/ R_memcpy(POIN

7、TER)&context-bufferindex, (POINTER)input, partLen); /*用基本函數(shù)對填充滿的512bits(已經(jīng)保存到context-buffer中) 做一次轉(zhuǎn)換,轉(zhuǎn)換結(jié)果保存到context-state中*/ MD5Transform(context-state, context-buffer); /* 對當(dāng)前輸入的剩余字節(jié)做轉(zhuǎn)換(如果剩余的字節(jié)大于512bits的話 ), 轉(zhuǎn)換結(jié)果保存到context-state中 */ for(i = partLen; i + 63 state, &inputi); index = 0; else i = 0;/*將輸

8、入緩沖區(qū)中的不足填充滿512bits的剩余內(nèi)容填充到context-buffer中,留待以后再作處理*/ R_memcpy(POINTER)&context-bufferindex, (POINTER)&inputi, inputLen-i);/*獲取加密 的最終結(jié)果digest:保存最終的加密串context:你前面初始化并填入了信息的md5結(jié)構(gòu)*/void MD5Final (unsigned char digest16,MD5_CTX *context) unsigned char bits8; unsigned int index, padLen;/*將要被轉(zhuǎn)換的信息(所有的)的bit

9、s長度拷貝到bits中*/ Encode(bits, context-count, 8);/* 計算所有的bits長度的字節(jié)數(shù)的模64, 64bytes=512bits*/ index = (unsigned int)(context-count0 3) & 0x3f); /*計算需要填充的字節(jié)數(shù),padLen的取值范圍在1-64之間*/ padLen = (index state, 16); R_memset(POINTER)context, 0, sizeof(*context);五、運行測試 六、分析總結(jié)本程序是處理的以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組

10、,經(jīng)過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值,將與加密的信息傳遞給md5結(jié)構(gòu),可以多次調(diào)用。由于程序還有很多不足之處,只能說是完成了MD5算飯的基本功能,我也希望能將它的功能變得更強大,經(jīng)過多次修改后已經(jīng)變得相對可以了。另外,MD55轉(zhuǎn)換用到的常量,算法本身規(guī)定的還不是很熟悉,經(jīng)過參考網(wǎng)上的資料,基本了解了這些常量的轉(zhuǎn)換。通過多次調(diào)試,對計算已有信息的bits長度的字節(jié)數(shù),計算已有的字節(jié)數(shù)長度還差多少字節(jié)可以湊成64的整倍數(shù),用基本函數(shù)對填充滿的512bits做一次轉(zhuǎn)換,保存最終的加密串等加密過程有了一定的認(rèn)識,基本理解了MD5的加密

11、過程,對算法、密碼保密性和安全性有了新的認(rèn)識,收獲很多。七、程序清單#include#include #ifndef _MD5_H_#define _MD5_H_#define R_memset(x, y, z) memset(x, y, z)#define R_memcpy(x, y, z) memcpy(x, y, z)#define R_memcmp(x, y, z) memcmp(x, y, z)typedef unsigned long UINT4;typedef unsigned char *POINTER;typedef struct /*四個32bits數(shù),用于存放最終計算得到

12、的消息摘要。當(dāng)消息長度512bits時,也用于存放每個512bits的中間結(jié)果*/ UINT4 state4; /*存儲原始信息的bits數(shù)長度,不包括填充的bits,最長為 264 bits,因為264是一個64位數(shù)的最大值*/ UINT4 count2; /*存放輸入的信息的緩沖區(qū),512bits*/ unsigned char buffer64; MD5_CTX;void MD5Init(MD5_CTX *);void MD5Update(MD5_CTX *, unsigned char *, unsigned int);void MD5Final(unsigned char 16, M

13、D5_CTX *);#endif /*md5轉(zhuǎn)換用到的常量,算法本身規(guī)定的*/#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 21static void MD5Transform(UINT4 4, unsigned

14、 char 64);static void Encode(unsigned char *, UINT4 *, unsigned int);static void Decode(UINT4 *, unsigned char *, unsigned int);/*用于bits填充的緩沖區(qū),為什么要64個字節(jié)呢?因為當(dāng)欲加密的信息的bits數(shù)被512除其余數(shù)為448時,需要填充的bits的最大值為512=64*8 。*/static unsigned char PADDING64 = 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

15、, 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;/*接下來的這幾個宏定義是md5算法規(guī)定的,就是對信息進(jìn)行md5加密都要做的運算。據(jù)說有經(jīng)驗的高手跟蹤程序時根據(jù)這幾個特殊的操作就可以斷定是不是用的md5*/#define F(x, y, z) (x) & (y) | (x) & (z)#define G(x, y, z) (x) & (z) | (y) & (z)#defi

16、ne 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_LEFT (a), (s); (a) += (b); #define GG(a, b, c, d, x, s, ac) (a) += G (b), (c), (d) + (x) + (UINT4)(ac); (a) = ROTATE

17、_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); /*初始化md5的結(jié)構(gòu)*/void MD5Init (MD5_CTX *co

18、ntext)/*將當(dāng)前的有效信息的長度設(shè)成0,這個很簡單,還沒有有效信息,長度當(dāng)然是0了*/ context-count0 = context-count1 = 0; context-state0 = 0x67452301; context-state1 = 0xefcdab89; context-state2 = 0x98badcfe; context-state3 = 0x10325476;/*將與加密的信息傳遞給md5結(jié)構(gòu),可以多次調(diào)用context:初始化過了的md5結(jié)構(gòu)input:欲加密的信息,可以任意長inputLen:指定input的長度*/void MD5Update(MD5_

19、CTX *context,unsigned char * input,unsigned int inputLen) unsigned int i, index, partLen; /*計算已有信息的bits長度的字節(jié)數(shù)的模64, 64bytes=512bits。 用于判斷已有信息加上當(dāng)前傳過來的信息的總長度能不能達(dá)到512bits, 如果能夠達(dá)到則對湊夠的512bits進(jìn)行一次處理*/ index = (unsigned int)(context-count0 3) & 0x3F); /*更新已有信息的bits長度*/ if(context-count0 += (UINT4)inputLen

20、3) (UINT4)inputLen count1+; context-count1 += (UINT4)inputLen 29); /*計算已有的字節(jié)數(shù)長度還差多少字節(jié)可以 湊成64的整倍數(shù)*/ partLen = 64 - index;/*如果當(dāng)前輸入的字節(jié)數(shù) 大于 已有字節(jié)數(shù)長度補足64字節(jié)整倍數(shù)所差的字節(jié)數(shù)*/ if(inputLen = partLen) /*用當(dāng)前輸入的內(nèi)容把context-buffer的內(nèi)容補足512bits*/ R_memcpy(POINTER)&context-bufferindex, (POINTER)input, partLen); /*用基本函數(shù)對填充滿

21、的512bits(已經(jīng)保存到context-buffer中) 做一次轉(zhuǎn)換,轉(zhuǎn)換結(jié)果保存到context-state中*/ MD5Transform(context-state, context-buffer); /* 對當(dāng)前輸入的剩余字節(jié)做轉(zhuǎn)換(如果剩余的字節(jié)大于512bits的話 ), 轉(zhuǎn)換結(jié)果保存到context-state中 */ for(i = partLen; i + 63 inputLen; i += 64)/*把i+63inputlen改為i+64state, &inputi); index = 0; else i = 0;/*將輸入緩沖區(qū)中的不足填充滿512bits的剩余內(nèi)容填

22、充到context-buffer中,留待以后再作處理*/ R_memcpy(POINTER)&context-bufferindex, (POINTER)&inputi, inputLen-i);/*獲取加密 的最終結(jié)果digest:保存最終的加密串context:你前面初始化并填入了信息的md5結(jié)構(gòu)*/void MD5Final (unsigned char digest16,MD5_CTX *context) unsigned char bits8; unsigned int index, padLen;/*將要被轉(zhuǎn)換的信息(所有的)的bits長度拷貝到bits中*/ Encode(bit

23、s, context-count, 8);/* 計算所有的bits長度的字節(jié)數(shù)的模64, 64bytes=512bits*/ index = (unsigned int)(context-count0 3) & 0x3f); /*計算需要填充的字節(jié)數(shù),padLen的取值范圍在1-64之間*/ padLen = (index state, 16); R_memset(POINTER)context, 0, sizeof(*context);/*對512bits信息(即block緩沖區(qū))進(jìn)行一次處理,每次處理包括四輪state4:md5結(jié)構(gòu)中的state4,用于保存對512bits信息加密的中間結(jié)

24、果或者最終結(jié)果block64:欲加密的512bits信息*/static void MD5Transform (UINT4 state4, unsigned char block64) UINT4 a = state0, b = state1, c = state2, d = state3, x16; Decode(x, block, 64); /* Round 1 */ 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,

25、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 *

26、/ 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, x

27、15, S14, 0x49b40821); /* 16 */ /* Round 2 */ 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,

28、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); /

29、* 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 */ /* Round 3 */ HH(a, b, c, d, x 5, S31, 0xfffa3942); /* 33 */ HH(d, a, b, c, x 8, S32, 0x8771f681); /* 34

30、 */ 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,

31、 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, 0x1fa27c

32、f8); /* 47 */ HH(b, c, d, a, x 2, S34, 0xc4ac5665); /* 48 */ /* Round 4 */ 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);

33、 /* 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

溫馨提示

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

評論

0/150

提交評論