




已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
MD5 報文摘要算法(RFC1321The MD5 Message-Digest Algorithm)本文地位本文并非指定一個Internet標(biāo)準(zhǔn),而是向互聯(lián)網(wǎng)提供信息,本文可以任意傳播,不受限制。致謝Don Coppersmith, Burt Kaliski, Ralph Merkle,David Chaum, 和Noam Nisan向本文提供極大的幫助,在此本人表示忠心的感謝。目錄1執(zhí)行簡介12術(shù)語和符號13MD5算法描述24摘要45MD4和MD5的區(qū)別46參考文獻47附錄A參考應(yīng)用程序48安全事項189作者地址181執(zhí)行簡介本文描述了MD5報文摘要算法,此算法將對輸入的任意長度的信息進行計算,產(chǎn)生一個128位長度的“指紋”或“報文摘要”,假定兩個不同的文件產(chǎn)生相同的報文摘要或由給定的報文摘要產(chǎn)生原始信息在計算上是行不通的。MD5算法適合用在數(shù)據(jù)簽名應(yīng)用中,在此應(yīng)用中,一個大的文件必須在類似RSA算法的公用密鑰系統(tǒng)中用私人密鑰加密前被“壓縮”在一種安全模式下。MD5算法能在32位機器上能以很快的速度運行。另外,MD5算法不需要任何大型的置換列表。此算法編碼很簡潔。MD5 算法是MD4報文摘要算法的擴展。MD5算法稍慢于MD4算法,但是在設(shè)計上比MD4算法更加“保守”。設(shè)計MD5是因為MD4算法被采用的速度太快,以至于還無法證明它的正確性,因為MD4算法速度非???,它處在遭受成功秘密攻擊的“邊緣”。MD5后退了一步,它舍棄了一些速度以求更好的安全性。它集中了不同的評論家提出的建議,并采取了一些附加的優(yōu)化措施。它被放在公共的地方以求公眾的評論意見,它可能當(dāng)作一個標(biāo)準(zhǔn)被采納。作為基于OSI的應(yīng)用,MD5的對象標(biāo)識符是:md5 OBJECT IDENTIFIER :=iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5 在X.509類型AlgorithmIdentifier 3中,MD5算法參數(shù)應(yīng)該包括NULL類型。2術(shù)語和符號本文中一個“字”是32位,一個“字節(jié)”是8位。一系列位串可看成是一系列字節(jié)的普通形式,其中的連續(xù)的8位看成一個字節(jié),高位在前,同理一系列字節(jié)串可看成是一系列32位的字,其中每個連續(xù)的4個字節(jié)當(dāng)作一個字,地位在前。我們定義x_i代表“x減去I.如果下劃線左邊的是一個表達式,則用括號括住,如:x_i+1。同樣我們用代表求冪,這樣xi則代表x的i次冪。符號“”代表字的加,X s代表32位的值X循環(huán)左移s位,not(X)代表X的按位補運算,X v Y 表示X和Y的按位或運算,XxorY代表X和Y的按位異或運算,XY代表X和Y的按位與運算。3MD5算法描述我們假設(shè)有一個b位長度的輸入信號,希望產(chǎn)生它的報文摘要,此處b是一個非負整數(shù),b也可能是0,不一定必須是8的整數(shù)倍,它可能是任意大的長度。我們設(shè)想信號的比特流如下所示: m_0 m_1 . m_b-1下面的5步計算信息的報文摘要。(1) 補位MD5算法是對輸入的數(shù)據(jù)進行補位,使得如果數(shù)據(jù)位長度LEN對512求余的結(jié)果是448。即數(shù)據(jù)擴展至K*512+448位。即K*64+56個字節(jié),K為整數(shù)。補位操作始終要執(zhí)行,即使數(shù)據(jù)長度LEN對512求余的結(jié)果已是448。 具體補位操作:補一個1,然后補0至滿足上述要求??偣沧钌僖a一位,最多補512位。(2) 補數(shù)據(jù)長度 用一個64位的數(shù)字表示數(shù)據(jù)的原始長度b,把b用兩個32位數(shù)表示。那么只取B的低64位。當(dāng)遇到b大于264這種極少遇到的情況時,這時,數(shù)據(jù)就被填補成長度為512位的倍數(shù)。也就是說,此時的數(shù)據(jù)長度是16個字(32位)的整數(shù)倍數(shù)。用M0 . N-1表示此時的數(shù)據(jù),其中的N是16的倍數(shù)。(3) 初始化MD緩沖器 用一個四個字的緩沖器(A,B,C,D)來計算報文摘要,A,B,C,D分別是32位的寄存器,初始化使用的是十六進制表示的數(shù)字 A=0X01234567 B=0X89abcdef C=0Xfedcba98 D=0X76543210 (4) 處理位操作函數(shù)首先定義4個輔助函數(shù),每個函數(shù)的輸入是三個32位的字,輸出是一個32位的字。X,Y,Z為32位整數(shù)。 F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z) H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z) 這一步中 使用一個64元素的常數(shù)組T1 . 64,它由sine函數(shù)構(gòu)成,Ti表示數(shù)組中的第i個元素,它的值等于經(jīng)過4294967296次abs(sin(i)后的值的整數(shù)部分(其中i是弧度 )。Ti為32位整數(shù)用16進制表示,數(shù)組元素在附錄中給出。具體過程如下: /* 處理數(shù)據(jù)原文 */ For i = 0 to N/16-1 do /*每一次,把數(shù)據(jù)原文存放在16個元素的數(shù)組X中. */ For j = 0 to 15 do Set Xj to Mi*16+j. end /結(jié)束對J的循環(huán) /* Save A as AA, B as BB, C as CC, and D as DD. */ AA = A BB = B CC = C DD = D /* 第1輪*/ /* 以 abcd k s i表示如下操作 a = b + (a + F(b,c,d) + Xk + Ti) s). */ /* Do the following 16 operations. */ ABCD 0 7 1 DABC 1 12 2 CDAB 2 17 3 BCDA 3 22 4 ABCD 4 7 5 DABC 5 12 6 CDAB 6 17 7 BCDA 7 22 8 ABCD 8 7 9 DABC 9 12 10 CDAB 10 17 11 BCDA 11 22 12 ABCD 12 7 13 DABC 13 12 14 CDAB 14 17 15 BCDA 15 22 16 /* 第2輪* */ /* 以 abcd k s i表示如下操作 a = b + (a + G(b,c,d) + Xk + Ti) s). */ /* Do the following 16 operations. */ ABCD 1 5 17 DABC 6 9 18 CDAB 11 14 19 BCDA 0 20 20 ABCD 5 5 21 DABC 10 9 22 CDAB 15 14 23 BCDA 4 20 24 ABCD 9 5 25 DABC 14 9 26 CDAB 3 14 27 BCDA 8 20 28 ABCD 13 5 29 DABC 2 9 30 CDAB 7 14 31 BCDA 12 20 32 /* 第3輪*/ /* 以 abcd k s i表示如下操作 a = b + (a + H(b,c,d) + Xk + Ti) s). */ /* Do the following 16 operations. */ ABCD 5 4 33 DABC 8 11 34 CDAB 11 16 35 BCDA 14 23 36 ABCD 1 4 37 DABC 4 11 38 CDAB 7 16 39 BCDA 10 23 40 ABCD 13 4 41 DABC 0 11 42 CDAB 3 16 43 BCDA 6 23 44 ABCD 9 4 45 DABC 12 11 46 CDAB 15 16 47 BCDA 2 23 48 /* 第4輪*/ /* 以 abcd k s i表示如下操作 a = b + (a + I(b,c,d) + Xk + Ti) s). */ /* Do the following 16 operations. */ ABCD 0 6 49 DABC 7 10 50 CDAB 14 15 51 BCDA 5 21 52 ABCD 12 6 53 DABC 3 10 54 CDAB 10 15 55 BCDA 1 21 56 ABCD 8 6 57 DABC 15 10 58 CDAB 6 15 59 BCDA 13 21 60 ABCD 4 6 61 DABC 11 10 62 CDAB 2 15 63 BCDA 9 21 64 /* 然后進行如下操作 */ A = A + AA B = B + BB C = C + CC D = D + DD end /* 結(jié)束對I的循環(huán)*/(5) 輸出結(jié)果報文摘要的產(chǎn)生后的形式為:A,B,C,D。也就是低位字節(jié)A開始,高位字節(jié)D結(jié)束?,F(xiàn)在完成了對MD5的描述,在附錄中給出了C形式的程序。4摘要MD5算法實現(xiàn)很容易,它提供了任意長度的信息的“指紋”(或稱為報文摘要)。據(jù)推測要實現(xiàn)兩個不同的報文產(chǎn)生相同的摘要需要264次的操作,要恢復(fù)給定摘要的報文則需要2128次操作。為尋找缺陷,MD5算法已經(jīng)過非常細致的檢查。最后的結(jié)論是還需要相關(guān)的更好的算法和更進一步的安全分析。5MD4和MD5的區(qū)別以下是MD5和MD4的不同點:1加上了第四輪循環(huán)。2每一步增加了一個唯一的常數(shù)值。第二輪中的函數(shù)g從(XY v XZ v YZ)變成了(XZ v Y not(Z),以減少g函數(shù)的均衡性。6參考文獻1 Rivest, R., The MD4 Message Digest Algorithm, RFC 1320, MIT and RSA Data Security, Inc., April 1992.2 Rivest, R., The MD4 message digest algorithm, in A.J. Menezes and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO 90Proceedings, pages 303-311, Springer-Verlag, 1991. 3 CCITT Recommendation X.509 (1988), The Directory - Authentication Framework.7附錄A參考應(yīng)用程序本附錄包括以下文件:(摘自RSAREF: A Cryptographic Toolkit for Privacy-Enhanced Mail:) global.h 全局頭文件md5.h - MD5頭文件md5c.c - MD5源代碼(要得到更多的RSAREF信息,請發(fā)e-mai到: .)附錄中還包括:mddriver.cMD2, MD4 and MD5的測試驅(qū)動程序。驅(qū)動程序默認情況下編譯MD5,但如果在C的編譯命令行將MD5參數(shù)設(shè)成2或4,則也可以編譯MD2和MD4此應(yīng)用程序是方便使用的,可用在不同的平臺上,在特殊的平臺上優(yōu)化它也并不困難,這留給讀者作為練習(xí)。例如,在“l(fā)ittle-endian”平臺上,此平臺32位字的最低地址字節(jié)最無意義的字節(jié),并且沒有隊列限制,在MD5變換中的解碼的命令調(diào)用可以被相應(yīng)的類型替代。A1 global.h/* GLOBAL.H - RSAREF 類型和常數(shù)*/* 當(dāng)且僅當(dāng)編譯器支持函數(shù)原型的聲明時,PROTOTYPES必須被設(shè)置一次如果還沒有定義C編譯器的標(biāo)記,下面的代碼使PROTOTYPES置為0。*/#ifndef PROTOTYPES#define PROTOTYPES 0#endif/* POINTER 定義成一個普通的指針類型 */typedef unsigned char *POINTER;/* UINT2 定義成兩字節(jié)的字 */typedef unsigned short int UINT2;/* UINT4定一成四字節(jié)的字 */typedef unsigned long int UINT4;/* PROTO_LIST的定義依賴于上面PROTOTYPES的定義,如果使用了PROTOTYPES,那么PROTO_LIST返回此列表,否則返回一個空列表。*/#if PROTOTYPES#define PROTO_LIST(list) list#else#define PROTO_LIST(list) ()#endifA.2 md5.h/*MD5.H - MD5C.C頭文件*/*本軟件允許被復(fù)制或運用,但必須在所有提及和參考的地方標(biāo)注“RSA Data Security, Inc. MD5 Message-Digest Algorithm”,也允許產(chǎn)生或運用派生軟件,但必須在所有提及和參考的地方標(biāo)明“derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm” RSA數(shù)據(jù)安全公司(RSA Data Security, Inc.)從來沒有出于任何特定目的陳述過關(guān)于此軟件的可買性和實用性,它提供了“as is”,沒有表達或暗示過任何理由。 此聲明必須在任何此文件和軟件的任何拷貝中保留。*/* MD5 context. */typedef struct UINT4 state4; /* state (ABCD) */ UINT4 count2; /* 位數(shù)量, 模 264 (低位在前) */ unsigned char buffer64; /* 輸入緩沖器 */ MD5_CTX;void MD5Init PROTO_LIST (MD5_CTX *);void MD5Update PROTO_LIST (MD5_CTX *, unsigned char *, unsigned int);void MD5Final PROTO_LIST (unsigned char 16, MD5_CTX *);A.3 md5c.c/* MD5C.C RSA數(shù)據(jù)安全公司,MD5報文摘要算法*/*本軟件允許被復(fù)制或運用,但必須在所有提及和參考的地方標(biāo)注“RSA Data Security, Inc. MD5 Message-Digest Algorithm”也允許產(chǎn)生或運用派生軟件,但必須在所有提及和參考的地方標(biāo)明“derived from the RSA Data RSA數(shù)據(jù)安全公司(RSA Data Security, Inc.)從來沒有出于任何特定目的陳述過關(guān)于此軟件的可買性和實用性,它提供了“as is”,沒有表達或暗示過任何理由。 此聲明必須在任何此文件和軟件的任何拷貝中保留。*/#include global.h#include md5.h/* Constants for MD5Transform routine. */#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 PROTO_LIST (UINT4 4, unsigned char 64);static void Encode PROTO_LIST (unsigned char *, UINT4 *, unsigned int);static void Decode PROTO_LIST (UINT4 *, unsigned char *, unsigned int);static void MD5_memcpy PROTO_LIST (POINTER, POINTER, unsigned int);static void MD5_memset PROTO_LIST (POINTER, int, unsigned int);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;/* F, G, H 和 I 是基本MD5函數(shù) */#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)/* ROTATE_LEFT 將x循環(huán)左移n位 */#define ROTATE_LEFT(x, n) (x) (32-(n)/* 循環(huán)從加法中分離出是為了防止重復(fù)計算*/#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); /* MD5 初始化. 開始一個MD5操作寫一個新的context. */void MD5Init (context)MD5_CTX *context; /* context */ context-count0 = context-count1 = 0; context-state0 = 0x67452301; context-state1 = 0xefcdab89; context-state2 = 0x98badcfe; context-state3 = 0x10325476;/*MD5 分組更新操作. 繼續(xù)一個MD5操作,處理另一個消息分組并更新context. */void MD5Update (context, input, inputLen)MD5_CTX *context; /* context */unsigned char *input; /* 輸入分組*/unsigned int inputLen; /* 輸入的分組的長度 */ unsigned int i, index, partLen; /* 計算字節(jié)數(shù)模64的值 */ index = (unsigned int)(context-count0 3) & 0x3F); /* Update number of bits */ if (context-count0 += (UINT4)inputLen 3) (UINT4)inputLen count1+; context-count1 += (UINT4)inputLen 29); partLen = 64 - index; /* 按能達到的最大次數(shù)轉(zhuǎn)換*/ if (inputLen = partLen) MD5_memcpy(POINTER)&context-bufferindex,(POINTER)input,partLen); MD5Transform (context-state, context-buffer); for (i = partLen; i + 63 state, &inputi); index = 0; else i = 0; /* 緩沖器保留輸入值 */ MD5_memcpy (POINTER)&context-bufferindex, (POINTER)&inputi, inputLen-i);/* MD5 最終結(jié)果. 以一個 MD5 報文摘要操作結(jié)束, 寫下報文摘要值 */void MD5Final (digest, context)unsigned char digest16; /*報文摘要 */MD5_CTX *context; /* context */ unsigned char bits8; unsigned int index, padLen; /* 保存位數(shù)值 */ Encode (bits, context-count, 8); index = (unsigned int)(context-count0 3) & 0x3f); padLen = (index state, 16); MD5_memset (POINTER)context, 0, sizeof (*context);/* MD5基本轉(zhuǎn)換. 轉(zhuǎn)換狀態(tài)基于分組*/static void MD5Transform (state, block)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, 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 */ /* 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, 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 */ /* Round 3 */ 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 */ /* 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); /* 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; MD5_memset (POINTER)x, 0, sizeof (x);/* 將輸入(UINT4)編碼輸出(unsigned char). 假設(shè)len是4的倍數(shù) */static void Encode (output, input, len)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); /* 將輸入(unsigned char)解碼輸出 (UINT4). 假設(shè)len是4的倍數(shù) */static void Decode (output, input, len)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);static void MD5_memcpy (output, input, len)POINTER output;POINTER input;unsigned int len; unsigned int i; for (i = 0; i len; i+) outputi = inputi;static void MD5_memset (output, value, len)POINTER output;int value;unsigned int len; unsigned int i; for (i = 0; i len; i+) (char *)output)i = (char)value;A.4 mddriver.c/* MDDRIVER.C - MD2, MD4 and MD5測試程序 */* RSA數(shù)據(jù)安全公司(RSA Data Security, Inc.)從來沒有出于任何特定目的陳述過關(guān)于此軟件的可買性和實用性,它提供了“as is”,沒有表達或暗示過任何理由。此聲明必須在任何此文件和軟件的任何拷貝中保留。*/* 如果沒有定義C編譯標(biāo)志的值,則MD5缺省狀態(tài)下為MD5 */#ifndef MD#define MD MD5#endif#include #include #include #include global.h#if MD = 2#include md2.h#endif#if MD = 4#include md4.h#endif#if MD = 5#include md5.h#endif/* 測試分組長度和數(shù)量 */#define TEST_BLOCK_LEN 1000#define TEST_BLOCK_COUNT 1000static void MDString PROTO_LIST (char *);static void MDTimeTrial PROTO_LIST (void);static void MDTestSuite PROTO_LIST (void);static void MDFile PROTO_LIST (char *);static void MDFilter PROTO_LIST (void);static void MDPrint PROTO_LIST (unsigned char 16);#if MD = 2#define MD_CTX MD2_CTX#define MDInit MD2Init#define MDUpdate MD2Update#define MDFinal MD2Final#endif#if MD = 4#define MD_CTX MD4_CTX#define MDInit MD4Init#define MDUpdate MD4Update#define MDFinal MD4Final#endif#if MD = 5#define MD_CTX MD5_CTX#define MDInit MD5Init#define MDUpdate MD5Update#define MDFinal MD5Final#endif/* 主程序.變量: -sstring 摘要字符串 -t - 運行時間測試 -x - 運行測試腳本 filename 摘要文件 (none) - 摘要標(biāo)準(zhǔn)輸入 */int main (argc, argv)int argc;char *argv; int i; if (argc 1) for (i = 1; i argc; i+) if (argvi0 = - & argvi1 = s) MDString (argvi + 2); else if (strcmp (argvi, -t) = 0) MDTimeTrial (); else if (strcmp (argvi, -x) = 0) MDTestSuite (); else MDFile (argvi); else MDFilter (); return (0);/* 計算字符串的摘要并打印其值 */static void MDString (string)char *string; MD_CTX context; unsigned char digest16; unsigned int len = strlen (string); MDInit (&context); MDUpdate (&context, string, len); MDFinal (digest, &context); printf (MD%d (%s) = , MD, string); MDPrint (digest); printf (n);/* 測試計算 TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte 分組摘要的時間 */static void MDTimeTrial () MD_CTX context; time_t endTime, startTime; unsigned char blockTEST_BLOCK_LEN, digest16; unsigned int i; printf (MD%d time trial. Dige
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 塑料反射膜材料考核試卷
- 教育技術(shù)支持系統(tǒng)構(gòu)建考核試卷
- 互助社與土地整治合作模式考核試卷
- 核心競爭力構(gòu)建考核試卷
- 醫(yī)用防護服材料舒適性改進技術(shù)考核試卷
- 計劃生育協(xié)會工作情況總結(jié)
- 紅軍長征課件
- 計劃生育建議
- 交通安全發(fā)言稿13篇
- 畢業(yè)拍照活動方案
- 電工外聘協(xié)議書范本
- 樹脂瓦施工方案
- 山東省濟南市歷城區(qū)2024-2025學(xué)年數(shù)學(xué)五下期末調(diào)研試題含答案
- 中國冰雪運動產(chǎn)業(yè)趨勢洞察:雪破新局冰啟華章
- 2025年色紡紗市場前景分析
- 西學(xué)中結(jié)業(yè)考核復(fù)習(xí)試題含答案
- 2025年工會知識競賽題庫200題及答案(完整版)
- 北師大版五年級下冊數(shù)學(xué)口算題題庫1200道帶答案可打印
- 完整版高中古詩文必背72篇【原文+注音+翻譯】
- 反分裂反滲透教育主題班會
- 電商平臺供應(yīng)鏈管理的優(yōu)化
評論
0/150
提交評論