MD5與SHA-1加密簡介(附iOS加密方式)

MD5加密

MD5消息摘要算法(英語:MD5 Message-Digest Algorithm),一種被普遍使用的密碼散列函數,能夠產生出一個128位(16字節)的散列值(hash value),用於確保信息傳輸完整一致。MD5由羅納德·李維斯特設計,於1992年公開,用以取代MD4算法。算法

1.應用

MD5已經普遍使用在爲文件傳輸提供必定的可靠性方面.例如,服務器預先提供一個MD5校驗和,用戶下載完文件之後,用MD5算法計算下載文件的MD5校驗和,而後經過檢查這兩個校驗和是否一致,就能判斷下載的文件是否出錯。數組

2.算法描述

MD5是輸入不定長度信息,輸出固定長度128-bits的算法。通過程序流程,生成四個32位數據,最後聯合起來成爲一個128-bits散列。基本方式爲,求餘、取餘、調整長度、與連接變量進行循環運算。得出結果。安全

3.MD5散列

通常128位的MD5散列被表示爲32位十六進制數字。如下是一個43位長的僅ASCII字母列的MD5散列:服務器

MD5("The quick brown fox jumps over the lazy dog")
    = 9e107d9d372bb6826bd81d3542a419d6

即便在原文中做一個小變化(好比用c取代d)其散列也會發生巨大的變化:app

MD5("The quick brown fox jumps over the lazy cog")
    = 1055d3e698d289f2af8663725127bd4b

空文的散列爲:函數

MD5("")
    = d41d8cd98f00b204e9800998ecf8427e

4.缺陷

2009年謝濤和馮登國僅用了220.96的碰撞算法複雜度,破解了MD5的碰撞抵抗,該攻擊在普通計算機上運行只須要數秒鐘。ui

5.加密方式

@implementation NSString (Encryption)

- (NSString *)md5String{
    //先轉爲UTF_8編碼的字符串
    const char* str = [self UTF8String];
    //設置一個接受字符數組
    //md5加密後是128bit, 16 字節 * 8位/字節 = 128 位
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    /*
     extern unsigned char *CC_MD5(const void *data, CC_LONG len, unsigned char *md)官方封裝好的加密方法
     
     把str字符串轉換成了32位的16進制數列(這個過程不可逆轉) 存儲到了result這個空間中
     */
    CC_MD5(str, strlen(str), result);
    
    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH* 2];
    /*
     x表示十六進制,%02X  意思是不足兩位將用0補齊,若是多餘兩位則不影響
     NSLog("%02X", 0x888);  //888
     NSLog("%02X", 0x4); //04
     */
    //將16字節的16進制轉成32字節的16進制字符串
    for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

SHA1

SHA1安全散列算法(英語:Secure Hash Algorithm)是一種能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。由美國國家安全局(NSA)所設計,並由美國國家標準與技術研究院(NIST)發佈;是美國的政府標準。曾被視爲是MD5(更早以前被廣爲使用的散列函數)的後繼者。編碼

1.應用

SHA-1在許多安全協議中廣爲使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,FIPS PUB 180-1也鼓勵私人或商業組織使用SHA-1加密。Fritz-chip將極可能使用SHA-1散列函數來實現我的電腦上的數字版權管理。加密

2.算法描述

把原始消息(字符串,文件等)轉換成位字符串。SHA1算法只接受位做爲輸入。設計

1)補位. 消息必須進行補位,以使其長度在對512取模之後的餘數是448。也就是說,(補位後的消息長度)%512 = 448。即便長度已經知足對512取模後餘數是448,補位也必需要進行。

2)補消息. 所謂的補長度是將原始數據的長度補到已經進行了補位操做的消息後面。一般用一個64位的數據來表示原始消息的長度。

3)使用的常量. 一系列的常量字K(0), K(1), ... , K(79),若是以16進制給出。它們以下:
Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79).

4)使用的函數. 在SHA1中咱們須要一系列的函數。每一個函數ft (0 <= t <= 79)都操做32位字B,C,D而且產生32位字做爲輸出。ft(B,C,D)能夠以下定義
ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).

5)計算消息摘要必須使用進行了補位和補長度後的消息來計算消息摘要。計算須要兩個緩衝區,每一個都由5個32位的字組成,還須要一個80個32位字的緩衝區。第一個5個字的緩衝區被標識爲A,B,C,D,E。第二個5個字的緩衝區被標識爲H0, H1, H2, H3, H4
。80個字的緩衝區被標識爲W0, W1,..., W79
另外還須要一個一個字的TEMP緩衝區。
爲了產生消息摘要,在第3.2部分中定義的512位(16個字)的數據塊M1, M2,..., Mn
會依次進行處理,處理每一個數據塊Mi 包含80個步驟。
在處理全部數據塊以前,緩衝區{Hi} 被初始化爲下面的值(16進制)
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0.
如今開始處理M1, M2, ... , Mn。爲了處理 Mi,須要進行下面的步驟
(1). 將 Mi 分紅 16 個字 W0, W1, ... , W15, W0 是最左邊的字
(2). 對於 t = 16 到 79 令
W[t] = S1(W[t-3] XOR W[t-8] XOR W[t-14] XOR W[t-16]).
(3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.
(4) 對於 t = 0 到 79,執行下面的循環
TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
E = D; D = C; C = S30(B); B = A; A = TEMP;
(5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
在處理完全部的 Mn, 後,消息摘要是一個160位的字符串,如下面的順序標識
H0 H1 H2 H3 H4.

3.SHA-1的破解

2005年二月,王小云、殷益羣及於紅波發表了對完整版SHA-1的攻擊,只需少於269的計算複雜度,就能找到一組碰撞。(利用生日攻擊法找到碰撞須要280的計算複雜度。)2005年8月17日的CRYPTO會議尾聲中王小云、姚期智、姚儲楓再度發表更有效率的SHA-1攻擊法,能在263個計算複雜度內找到碰撞。

相關文章
相關標籤/搜索