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