網(wǎng)絡(luò)安全攻防:對稱密碼
對稱密碼可分為分組密碼(Block Cipher)和序列密碼(Stream Cipher)。分組密碼通常以一個固定大小作為每次處理的基本單元,而序列密碼則是以一個單位元素(一個字母或一個比特)作為基本的處理單元,當然,當分組長度為單位長度時,分組密碼也即為序列密碼。
分組密碼是將明文消息編碼表示后的數(shù)字(簡稱明文數(shù)字)序列,劃分成長度為n的組(可看作長度為n的矢量),每組分別在密鑰的控制下變換成等長的輸出數(shù)字(簡稱密文數(shù)字)序列。分組密碼使用的是一個不隨時間變化的固定變換,具有擴散性好、插入敏感等優(yōu)點。分組密碼的工作模式允許使用同一個分組密碼的密鑰對多于一塊的數(shù)據(jù)進行加密,并保證其安全性。分組密碼自身只能加密長度等于密碼分組長度的單塊數(shù)據(jù),若要加密變長數(shù)據(jù),則數(shù)據(jù)必須先被劃分為一些單獨的密碼塊。通常而言,最后一塊數(shù)據(jù)也需要使用合適填充方式將數(shù)據(jù)擴展到匹配密碼塊大小的長度。一種工作模式描述了加密每一數(shù)據(jù)塊的過程,并常常使用基于一個通常稱為初始化向量(IV)的附加輸入值進行隨機化,以保證數(shù)據(jù)加密安全。下面介紹目前幾種常用的分組密碼工作模式。
1. 電子密碼本(ECB)
最簡單的加密模式即為電子密碼本(ECB,Electronic Codebook)模式。需要加密的消息按照塊密碼的塊大小被分為數(shù)個塊,并對每個塊進行獨立加密,如圖1所示。
圖1 電子密碼本模式
優(yōu)點:實現(xiàn)簡單、效率高;有利于并行計算;誤差不會被傳送。
缺點:不能隱藏明文的模式,相同的明文產(chǎn)生相同的密文;可能對明文實施主動攻擊。
如圖2所示,當黑客獲得賬號C對應(yīng)的密文段后,即可以通過對銀行A傳送給銀行B的密文段替換,成功實施ECB密文的重放攻擊。
圖2 電子密碼本加密示例
2. 密碼塊鏈接(CBC)
在 CBC 模式中,每個明文塊先與前一個密文塊進行異或,然后再進行加密,即每個密文塊都依賴于它前面的所有明文塊。同時,為了保證每條消息的唯一性,在第一個塊中需要使用初始化向量。加密過程如圖3所示。
圖3 CBC模式
優(yōu)點:不易被主動攻擊,安全性好于ECB,適合傳輸長度較長的報文,是目前SSL和IPSec安全協(xié)議的應(yīng)用標準。
缺點:不利于并行計算;有誤差傳遞效應(yīng);需要維護初始化向量IV。
3. 密文反饋(CFB)
密文反饋(CFB,Cipher Feedback)模式類似于CBC,可以將塊密碼變?yōu)樽酝降牧髅艽a,工作過程亦非常相似,加密過程如圖4所示。
圖4 CFB模式
優(yōu)點:隱藏了明文模式;分組密碼轉(zhuǎn)化為流模式,增強了安全強度;可以及時加密傳送小于分組的數(shù)據(jù)。
缺點:不利于并行計算;存在誤差傳送效應(yīng),即一個明文單元損壞可影響多個單元;需要維護一個IV。
分組密碼包括DES、IDEA、SAFER、Blowfish和Skipjack 等,最新的國際標準算法是AES,之前一直采用DES/3DES算法。在介紹具體的分組加密算法之前,有必要先了解一下分組密碼中的一個核心變換——Feistel結(jié)構(gòu)。大多數(shù)分組密碼的結(jié)構(gòu)本質(zhì)上都是基于Feistel網(wǎng)絡(luò)結(jié)構(gòu),因此,了解Feistel密碼結(jié)構(gòu)對于學習分組密碼算法是非常有幫助的。
Feistel是用于分組加密過程中多次循環(huán)迭代的一種結(jié)構(gòu),可以有效提高安全性。在每個循環(huán)中,可以通過使用特殊的函數(shù)從初始密鑰派生出的子密鑰來應(yīng)用適當?shù)淖儞Q。Feistel加密算法的輸入將分組的明文塊分為左右兩部分L和R,并生成密鑰序列K=(K1,K2,…,Kn),進行n輪迭代,迭代完成后,再將左右兩半合并到一起產(chǎn)生最終的密文分組。第i輪迭代的函數(shù)為:
Li=Ri−1
Ri=Li−1+F(Ri−1,Ki)
其中,Ki是第i輪的子密鑰,“+”表示異或運算,F(xiàn)表示輪函數(shù)。一般地,各輪子密鑰彼此各不相同,且輪函數(shù)F也各不相同。代換過程完成后,在交換左右兩半數(shù)據(jù),這一過程稱為置換。Feistel網(wǎng)絡(luò)的加密和解密過程如圖5所示。
圖5 Feistel網(wǎng)絡(luò)加密和解密過程
因此,F(xiàn)eistel網(wǎng)絡(luò)的安全性與以下參數(shù)有關(guān)。
(1)分組大小。
(2)密鑰大小。
(3)子密鑰產(chǎn)生算法:該算法復雜性越高,則密碼分析越困難(Feistel網(wǎng)絡(luò)結(jié)構(gòu)本身就是加密算法或其重要組成部分,根據(jù)Kerchhoffs準則是無需保密的)。
(4)輪數(shù)n:單輪結(jié)構(gòu)遠不足以保證安全,一般輪數(shù)取為16。
(5)輪函數(shù)F:結(jié)構(gòu)越復雜越難分析。
4. 分組加密算法DES
DES算法為密碼體制中的對稱密碼體制,又被稱為美國數(shù)據(jù)加密標準,是1972年美國IBM公司研制的對稱密碼體制加密算法。明文按64 bit進行分組,密鑰長64 bit,密鑰事實上是56 bit參與DES運算(第8、16、24、32、40、48、56、64 bit是校驗位,使每個密鑰都有奇數(shù)個1)分組后的明文組和56 bit的密鑰按位替代或交換的方法形成密文組的加密方法。
DES 算法具有極高安全性,到目前為止,除了用窮舉搜索法對 DES 算法進行攻擊外,還沒有發(fā)現(xiàn)更有效的辦法。而56 bit長的密鑰的窮舉空間為256,這意味著如果一臺計算機的速度是每秒檢測一百萬個密鑰,則它搜索完全部密鑰就需要將近2285年的時間,可見,這是難以實現(xiàn)的。然而,這并不等于說DES是不可破解的。而實際上,隨著硬件技術(shù)和Internet的發(fā)展,其破解的可能性越來越大,而且,所需要的時間越來越少。使用經(jīng)過特殊設(shè)計的硬件并行處理要幾個小時。為了克服DES密鑰空間小的缺陷,研究人員又提出了三重DES的變形方式,即采用兩個密鑰共128 bit長度,僅加大了窮舉密鑰的計算復雜度,如圖6所示。
圖6 三重DES的變形方式
5. 分組加密標準AES
1997年4月15日,美國ANSI發(fā)起征集AES(Advanced Encryption Standard)的活動,并為此成立了AES工作小組。
1997年9月12日,美國聯(lián)邦登記處公布了正式征集AES候選算法的通告。對AES的基本要求是比三重DES快,至少與三重DES一樣安全,數(shù)據(jù)分組長度為128 bit,密鑰長度為128/192/256 bit。
1998年8月12日,在首屆AES候選會議(First AES Candidate Conference)上公布了AES的15個候選算法,任由全世界各機構(gòu)和個人攻擊和評論。
1999年3月,在第2屆AES候選會議(Second AES Candidate Conference)上經(jīng)過對全球各密碼機構(gòu)和個人對候選算法分析結(jié)果的討論,從 15個候選算法中選出了 5個,分別是RC6、Rijndael、SERPENT、Twofish和MARS。
2000年4月13日至14日,召開了第3屆AES候選會議(Third AES Candidate Conference),繼續(xù)對最后5個候選算法進行討論。
2000年10月2日,NIST宣布Rijndael作為新的AES。經(jīng)過3年多的討論,Rijndael終于脫穎而出。Rijndael由比利時的JoanDaemen和VincentRijmen設(shè)計。
AES算法基于排列和置換運算。排列是對數(shù)據(jù)重新進行安排,置換是將一個數(shù)據(jù)單元替換為另一個。AES 使用幾種不同的方法來執(zhí)行排列和置換運算。AES 是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192和256 bit密鑰,并且用128 bit(16 B)分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過分組密碼返回的加密數(shù)據(jù)的位數(shù)與輸入數(shù)據(jù)相同。迭代加密使用一個循環(huán)結(jié)構(gòu),在該循環(huán)中重復置換和替換輸入數(shù)據(jù),如圖7所示。
圖7 AES算法設(shè)計
6. 序列密碼
序列密碼是一個隨時間變化的加密變換,具有轉(zhuǎn)換速度快、低錯誤傳播的優(yōu)點,硬件實現(xiàn)電路更簡單;其缺點是有低擴散、插入或修改等不敏感性。
序列密碼涉及大量的理論知識,提出了眾多的設(shè)計原理,也得到了廣泛的分析,但許多研究成果并沒有完全公開,因為序列密碼目前更多應(yīng)用于軍事和外交等機密部門。目前,公開的序列密碼算法主要有RC4、SEAL等。1949年,Shannon證明了只有一次一密的密碼體制是絕對安全的,這給序列密碼技術(shù)的研究以強大的支持,序列密碼方案的發(fā)展是模仿一次一密系統(tǒng)的嘗試,或者說“一次一密”的密碼方案是序列密碼的雛形。如果序列密碼所使用的是真正隨機方式的、與消息流長度相同的密鑰流,則此時的序列密碼就是一次一密的密碼體制(One-Time Password)。若能以一種方式產(chǎn)生一隨機序列(密鑰流),這一序列由密鑰所確定,則利用這樣的序列就可以進行加密,即將密鑰、明文表示成連續(xù)的符號或二進制,對應(yīng)地進行加密,加解密時一次處理明文中的一個或幾個比特。
序列密碼加密和解密的基本框架如圖8所示。
圖8 序列密碼加密和解密
明文序列:m=m1m2m3…
密鑰序列:k=k1k2k3…
密文序列:c=c1c2c3…
加密變換:ci=ki⊗mi(i=1,2,3…)
解密變換:mi=ki⊗ci(i=1,2,3…)
其中,密鑰序列k1k2k3…由一個主控密鑰K通過一個密鑰流生成器生成。密鑰流生成器的核心是一個偽隨機數(shù)發(fā)生器,而密鑰K即為該隨機數(shù)發(fā)生器的種子。應(yīng)用最廣的隨機數(shù)發(fā)生器為線性反饋移位寄存器(LFSR,Linear Feedback Shift Register)。LFSR給定前一狀態(tài)的輸出,將該輸出的線性函數(shù)再用作輸入的移位寄存器。異或運算是最常見的單比特線性函數(shù):對寄存器的某些位進行異或操作后作為輸入,再對寄存器中的各比特進行整體移位。
LFSR 可以產(chǎn)生一個周期較長的二進制序列形成安全的流密鑰。當周期無限長即可形成上述的 OTP 一次一密系統(tǒng),OTP 是一種理想的安全流密碼體制。一次一密系統(tǒng)應(yīng)用面臨現(xiàn)實的挑戰(zhàn)如下。
(1)密鑰配送:發(fā)送方需要把密鑰發(fā)送給接收方,接收方才能解密。OTP密鑰的長度和明文長度相同,若能把密鑰安全有效地發(fā)送出去,為何不直接用這種方法發(fā)送明文。
(2)密鑰的保存:OTP等同于將“保存明文”問題轉(zhuǎn)化成“保存和明文等長的密鑰”問題。
(3)密鑰的復用:OTP不能重用過去用過的隨機比特序列,否則如果密鑰泄露之前所有的通信都將會被解密,這在密碼學上被稱作前向安全(Forward Security)。
(4)密鑰的同步:明文很長時密鑰也會一樣長,如果密鑰在同步時出現(xiàn)一點差錯,后續(xù)所有密文將無法解密,有時也被稱作后向安全(Backward Security)。
(5)密鑰的生成:OTP需要生成大量的隨機數(shù),計算機程序生成的偽隨機數(shù)往往無法滿足需求,而無重現(xiàn)性的真正隨機數(shù)生成難度極大。
因此在實際應(yīng)用中,流密碼的安全性主要依賴于主控密鑰K的保密性和密鑰流發(fā)生器的可靠性。密鑰序列產(chǎn)生算法最為關(guān)鍵,其生成的密鑰序列必須具有偽隨機性。偽隨機性主要體現(xiàn)在兩個方面,一方面密鑰序列是不可預測的,這將使攻擊者難以破解密文;另一方面,密鑰序列具有可控性。加密、解密雙方使用相同的種子密鑰可以產(chǎn)生完全相同的密鑰序列。倘若密鑰序列完全隨機,則意味著密鑰序列產(chǎn)生算法的結(jié)果不可控,在這種情況下,將無法通過解密恢復明文。此外,加密、解密雙方還必須保持密鑰序列的精確同步,這是通過解密恢復明文的重要條件。序列密碼的優(yōu)點在于安全程度高,明文中每一個比特位的加密獨立進行,與明文的其他部分無關(guān)。此外,序列密碼的加密速度快,實時性好;缺點則是密鑰序列必須嚴格同步,在現(xiàn)實應(yīng)用中往往需要為之付出較高的代價。
7. RC4序列密碼
RC4是由RSA Security的Ron Rivest在1987年設(shè)計的一種高速簡潔的流密碼,被廣泛用于常用協(xié)議中,包括無線網(wǎng)絡(luò)安全算法、SSL/TLS、HTTPS等安全協(xié)議。RC4加密分為兩步。
(1)Key-Scheduling Algorithm(KSA)密鑰調(diào)度算法,采用可變長度的加密密鑰產(chǎn)生密鑰流生成器的初始狀態(tài)。
(2)Pseudo-Random Generation Algorithm(PRGA)偽隨機子密碼生成算法,根據(jù)初始狀態(tài)產(chǎn)生密鑰流,并與明文相異或產(chǎn)生密文。
RC4采用的是XOR運算,一旦子密鑰序列出現(xiàn)了重復,密文就有可能被破解。存在部分弱密鑰,使子密鑰序列在不到100 B內(nèi)就出現(xiàn)重復。如果出現(xiàn)部分重復,則可能在不到10萬字節(jié)內(nèi)就能發(fā)生完全重復。因此,在使用RC4算法時,必須對加密密鑰進行安全測試,避免弱密鑰問題。