SHA1:安全散列算法(英語(yǔ):Secure Hash Algorithm)是一種能計(jì)算出一個(gè)數(shù)字消息所對(duì)應(yīng)到的略吨,長(zhǎng)度固定的字符串(又稱消息摘要)的算法誊役。由美國(guó)國(guó)家安全局(NSA)所設(shè)計(jì)拄显,并由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布;是美國(guó)的政府標(biāo)準(zhǔn)。曾被視為是MD5(更早之前被廣為使用的散列函數(shù))的后繼者糖荒。
對(duì)于長(zhǎng)度小于2^64位的消息靖苇,SHA1會(huì)產(chǎn)生一個(gè)160位(20字節(jié))的消息摘要席噩,也就是40個(gè)十六進(jìn)制數(shù)。當(dāng)接收到消息的時(shí)候贤壁,這個(gè)消息摘要可以用來(lái)驗(yàn)證數(shù)據(jù)的完整性悼枢。
特性:
不可以從消息摘要中復(fù)原信息,即不可逆脾拆;
兩個(gè)不同的消息不會(huì)產(chǎn)生同樣的消息摘要,(但會(huì)有1x10 ^ 48分之一的機(jī)率出現(xiàn)相同的消息摘要,一般使用時(shí)忽略)馒索。
底層原理
把原始消息(字符串,文件等)轉(zhuǎn)換成位字符串名船。SHA1算法只接受位作為輸入绰上。
補(bǔ)位
消息必須進(jìn)行補(bǔ)位,以使其長(zhǎng)度在對(duì)512取模以后的余數(shù)是448渠驼。也就是說(shuō)蜈块,(補(bǔ)位后的消息長(zhǎng)度)%512 = 448。即使長(zhǎng)度已經(jīng)滿足對(duì)512取模后余數(shù)是448迷扇,補(bǔ)位也必須要進(jìn)行百揭。補(bǔ)充長(zhǎng)度
所謂的補(bǔ)長(zhǎng)度是將原始數(shù)據(jù)的長(zhǎng)度補(bǔ)到已經(jīng)進(jìn)行了補(bǔ)位操作的消息后面。通常用一個(gè)64位的數(shù)據(jù)來(lái)表示原始消息的長(zhǎng)度蜓席。使用的常量. 一系列的常量字K(0), K(1), ... , K(79)器一,如果以16進(jìn)制給出。它們?nèi)缦拢?br> Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79).使用的函數(shù). 在SHA1中我們需要一系列的函數(shù)瓮床。每個(gè)函數(shù)ft (0 <= t <= 79)都操作32位字B盹舞,C产镐,D并且產(chǎn)生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).計(jì)算消息摘要必須使用進(jìn)行了補(bǔ)位和補(bǔ)長(zhǎng)度后的消息來(lái)計(jì)算消息摘要踢步。計(jì)算需要兩個(gè)緩沖區(qū)癣亚,每個(gè)都由5個(gè)32位的字組成,還需要一個(gè)80個(gè)32位字的緩沖區(qū)获印。第一個(gè)5個(gè)字的緩沖區(qū)被標(biāo)識(shí)為A述雾,B,C兼丰,D玻孟,E。第二個(gè)5個(gè)字的緩沖區(qū)被標(biāo)識(shí)為H0, H1, H2, H3, H4
鳍征。80個(gè)字的緩沖區(qū)被標(biāo)識(shí)為W0, W1,..., W79
另外還需要一個(gè)一個(gè)字的TEMP緩沖區(qū)黍翎。
為了產(chǎn)生消息摘要,在第3.2部分中定義的512位(16個(gè)字)的數(shù)據(jù)塊M1, M2,..., Mn
會(huì)依次進(jìn)行處理艳丛,處理每個(gè)數(shù)據(jù)塊Mi 包含80個(gè)步驟匣掸。
在處理所有數(shù)據(jù)塊之前,緩沖區(qū){Hi} 被初始化為下面的值(16進(jìn)制)
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0.
現(xiàn)在開始處理M1, M2, ... , Mn氮双。為了處理 Mi,需要進(jìn)行下面的步驟
(1). 將 Mi 分成 16 個(gè)字 W0, W1, ... , W15, W0 是最左邊的字
(2). 對(duì)于 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) 對(duì)于 t = 0 到 79碰酝,執(zhí)行下面的循環(huán)
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, 后,消息摘要是一個(gè)160位的字符串戴差,以下面的順序標(biāo)識(shí)
H0 H1 H2 H3 H4.
SHA1與MD5對(duì)比
相同點(diǎn):因?yàn)槎呔蒑D4導(dǎo)出送爸,他們的強(qiáng)度和其他特性也是相似。
不同點(diǎn):
- 對(duì)強(qiáng)行攻擊的安全性:最顯著和最重要的區(qū)別是SHA-1摘要比MD5摘要長(zhǎng)32 位暖释。使用強(qiáng)行技術(shù)袭厂,產(chǎn)生任何一個(gè)報(bào)文使其摘要等于給定報(bào)摘要的難度對(duì)MD5是2-128數(shù)量級(jí)的操作,而對(duì)SHA-1則是2-160數(shù)量級(jí)的操作饭入。這樣嵌器,SHA-1對(duì)強(qiáng)行攻擊有更大的強(qiáng)度肛真。
- 對(duì)密碼分析的安全性:由于MD5的設(shè)計(jì)谐丢,易受密碼分析的攻擊,SHA-1顯得不易受這樣的攻擊蚓让。
- 速度:在相同的硬件上乾忱,SHA-1的運(yùn)行速度比MD5慢。
代碼
首先需要添加頭文件
#import<CommonCrypto/CommonDigest.h>
然后直接使用下面的方法就可以了
//sha1加密方式
- (NSString *) sha1:(NSString *)input
{
//const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
//NSData *data = [NSData dataWithBytes:cstr length:input.length];
NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (unsigned int)data.length, digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}