The code originates from http://blog.andrewpaulsimmons.com/2008/07/md5-hash-on-iphone.html
.
I have copied it here for mirroring purposes. Please express your appreciations to Andrew for his efforts.
#import <CommonCrypto/CommonDigest.h>
NSString* md5( NSString *str )
{
const char *cStr = [str UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), result );
return [NSString stringWithFormat:
@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3], result[4],
result[5], result[6], result[7],
result[8], result[9], result[10], result[11], result[12],
result[13], result[14], result[15]
];
}
-------------------------------------------------------------------------------------------------------------
今天簽名用了md5演算法,所以進行了一定的瞭解,主要是考慮不會被別人破解,呵呵,確實是無法復原的,現在轉載一片一個大概介紹這種演算法曆史的文章,具體演算法比較複雜,我主要是在給同學的畢業設計裡看過,在這裡就 不說明了,總之覺得md5演算法確實是一個不錯的演算法。
轉
貼://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
最近在研究Java中的密碼編譯演算法,Blowfish/md5/Twofish/RSA等,呵呵,猜想md5應該是大家應用最多的,轉一篇文章,介紹介紹md5給大家。
MD5的介紹,演算法和實現 Wrote By 娃娃(NYDoll)/[CCG] 中國破解組織CHiNA CrACKiNG GrOUp
MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的電腦科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。
Message-Digest泛指位元組串(Message)的Hash變換,就是把一個任意長度的位元組串變換成一定長的大整數。請注意我使用了“位元組串
”而不是“字串”這個詞,是因為這種變換隻與位元組的值有關,與字元集或編碼方式無關。
MD5將任意長度的“位元組串”變換成一個128bit的大整數,並且它是一個無法復原的字串變換演算法,(我剛開始還愚蠢的認為MD5是可逆的演算法
感謝Stkman大哥的講解)換句話說就是,即使你看到來源程式和演算法描述,也無法將一個MD5的值變換回原始的字串,從數學原理上說,是因為原始的字元
串有無窮多個,這有點象不存在反函數的數學函數。
MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫
readme.txt檔案中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個檔案給別人,別人如果修改了檔案中的任何內
容,你對這個檔案重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的“抵賴”,這就是所謂的數位簽章應用。
MD5還廣泛用於加密和解密技術上,在很多作業系統中,使用者的密碼是以MD5值(或類似的其它演算法)的方式儲存的, 使用者Login的時候,系統是把使用者輸入的密碼計算成MD5值,然後再去和系統中儲存的MD5值進行比較,而系統並不“知道”使用者的密碼是什麼。
一些駭客破獲這種密碼的方法是一種被稱為“跑字典”的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字串表,另一種是用排列組合方法產生的,先用MD5程式計算出這些字典項的MD5值,然後再用目標的MD5值在這個字典中檢索。
即使假設密碼的最大長度為8,同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是
P(62,1)+P(62,2)….+P(62,8),那也已經是一個很天文的數字了,儲存這個字典就需要TB級的磁碟組,而且這種方法還有一個前提,就
是能獲得目標賬戶的密碼MD5值的情況下才可以。
在軟體的加密保護中 很多軟體採用MD5保護 但是由於MD5演算法為無法復原演算法
所以所有的軟體都是使用MD5演算法作為一個加密的中間步驟,比如對使用者名稱做一個MD5變換,結果再進行一個可逆的加密變換,做註冊機時也只要先用MD5變
換,然後再用一個逆演算法。所以對於破解者來說只要能看出是MD5就很容易了。
MD5代碼的特點明顯,跟蹤時很容易發現,如果軟體採用MD5演算法,在資料初始化的時候必然用到以下的四個常數
0x67452301;
0xefcdab89;
0x98badcfe;
0x10325476;
若常數不等 則可能是變形的MD5演算法 或者根本就不是這個演算法。在記憶體了也就是
01 23 45 67 89 ab cd ef fe dc ......32 10 16個位元組
MD5演算法:
第一步:增加填充
增加padding使得資料長度(bit為單位)模512為448。如果資料長度正好是模512為448,增加512個填充bit,也就是說填充的個數為1-512。第一個bit為1,其餘全部為0。
第二步:補足長度
將資料長度轉換為64bit的數值,如果長度超過64bit所能表示的資料長度的範圍,值保留最後64bit,增加到前面填充的資料後面,使得最後的資料為512bit的整數倍。也就是32bit的16倍的整數倍。在RFC1321中,32bit稱為一個word。
第三步:初始設定變數:
用到4個變數,分別為A、B、C、D,均為32bit長。初始化為:
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
第四步:資料處理:
首先定義4個輔助函數:
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))
其中:XY表示按位與,X v Y表示按位或,not(X)表示按位取反。xor表示按位異或。
函數中的X、Y、Z均為32bit。
定義一個需要用到的數組:T(i),i取值1-64,T(i)等於abs(sin(i))的4294967296倍的整數部分,i為弧度。
假設前三步處理後的資料長度為32*16*Nbit
第五步:輸出:
最後得到的ABCD為輸出結果,共128bit。A為低位,D為高位.