MD5的全稱是Message-Digest Algorithm 5。
MD5加密算法為現在應用最廣泛的哈希算法之一,該算法廣泛應用於互聯網網站的用戶文件加密,能夠將用戶密碼加密為128位的長整數。數據庫並不明文存儲用戶密碼,而是在用戶登錄時將輸入密碼字符串進行MD5加密,與數據庫中所存儲的MD5值匹配,從而降低密碼數據庫被盜取后用戶損失的風險。
MD5加密算法以512位分組來處理輸入的信息,且每一分組又被划分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。
在MD5加密算法中,首先需要對信息進行填充,使其字節長度對512求余數的結果等於448。因此,信息的字節長度(Bits Length)將被擴展至N*512+448,即N*64+56個字節(Bytes),N為一個正整數。
填充的方法如下,在信息的后面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然后再在這個結果后面附加一個以64位二進制表示的填充前的信息長度。經過這兩步的處理,現在的信息字節長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍數。這樣做的原因是為滿足后面處理中對信息長度的要求。
MD5中有四個32位被稱作鏈接變量(Chaining Variable)的整數參數,他們分別為:
A=0x01234567
B=0x89abcdef
C=0xfedcba98
D=0x76543210
當設置好這四個鏈接變量后,就開始進入算法的四輪循環運算,循環的次數是信息中512位信息分組的數目。
將上面四個鏈接變量復制到另外四個變量中:A到a,B到b,C到c,D到d。 主循環有四輪(MD4只有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然后將所得結果加上第四個變量(文本中的一個子分組和一個常數)。
再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最后用該結果取代a、b、c或d中之一。 以一下是每次操作中用到的四個非線性函數(每輪一個)。
F(X,Y,Z)=(X∧Y)∨(( X)∧Z) G(X,Y,Z)=(X∧Z)∨(Y∧( Z)) H(X,Y,Z)=X?Y?Z I(X,Y,Z)=Y?(X∨( Z)) |
其中,?是異或,∧是與,∨是或, 是反符號。
如果X、Y和Z的對應位是獨立和均勻的,那么結果的每一位也應是獨立和均勻的。F是一個逐位運算的函數。即,如果X,那么Y,否則Z。函數H是逐位奇偶操作符。所有這些完成之后,將A,B,C,D分別加上a,b,c,d。然后用下一分組數據繼續運行算法,最后的輸出是A,B,C和D的級聯。最后得到的A,B,C,D就是輸出結果,A是低位,D為高位,DCBA組成128位輸出結果。
在ios開發中,實現如下:
NSString+MD5.h文件:
1 #import <Foundation/Foundation.h> 2 #import <CommonCrypto/CommonCrypto.h> 3 @interface NSString (MD5) 4 - (id)MD5; 5 @end
.h文件中聲明了一個對象方法,即MD5方法。
NSString+MD5.m文件如下:
1 #import "NSString+MD5.h" 2 @implementation NSString (MD5) 3 - (id)MD5 4 { 5 const char *cStr = [self UTF8String]; 6 unsigned char digest[16]; 7 unsigned int x=(int)strlen(cStr) ; 8 CC_MD5( cStr, x, digest ); 9 // This is the md5 call 10 NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; 11 12 for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) 13 [output appendFormat:@"%02x", digest[i]]; 14 15 return output; 16 } 17 @end
NSString+MD5.m文件中實現了MD5方法。
調用的時候只需要:
1 NSString *ss=@"abcdefgh"; 2 NSString *ssmd5=[ss2 MD5];
就可以生成字符串ss的密文字符串ssmd5.