1.什么是對(duì)稱(chēng)密碼算法 網(wǎng)絡(luò)安全通信中要用到兩類(lèi)密碼算法,一類(lèi)是對(duì)稱(chēng)密碼算法,另一類(lèi)是非對(duì)稱(chēng)密碼算法。對(duì)稱(chēng)密碼算法有時(shí)又叫傳統(tǒng)密碼算法、秘密密鑰算法或單密鑰算法,非對(duì)稱(chēng)密碼算法也叫公開(kāi)密鑰密碼算法或雙密鑰算法。對(duì)稱(chēng)密碼算法的加密密鑰能夠從解密密鑰中推算出來(lái),反過(guò)來(lái)也成立。在大多數(shù)對(duì)稱(chēng)算法中,加密解密密鑰是相同的。它要求發(fā)送者和接收者在安全通信之前,商定一個(gè)密鑰。對(duì)稱(chēng)算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都能對(duì)消息進(jìn)行加密解密。只要通信需要保密,密鑰就必須保密。
對(duì)稱(chēng)算法又可分為兩類(lèi)。一次只對(duì)明文中的單個(gè)位(有時(shí)對(duì)字節(jié))運(yùn)算的算法稱(chēng)為序列算法或序列密碼。另一類(lèi)算法是對(duì)明文的一組位進(jìn)行運(yùn)算,這些位組稱(chēng)為分組,相應(yīng)的算法稱(chēng)為分組算法或分組密碼。現(xiàn)代計(jì)算機(jī)密碼算法的典型分組長(zhǎng)度為64位――這個(gè)長(zhǎng)度既考慮到分析破譯密碼的難度,又考慮到使用的方便性。后來(lái),隨著破譯能力的發(fā)展,分組長(zhǎng)度又提高到128位或更長(zhǎng)。
常用的采用對(duì)稱(chēng)密碼術(shù)的加密方案有5個(gè)組成部分(如圖所示)

1)明文:原始信息。
2)加密算法:以密鑰為參數(shù),對(duì)明文進(jìn)行多種置換和轉(zhuǎn)換的規(guī)則和步驟,變換結(jié)果為密文。
3)密鑰:加密與解密算法的參數(shù),直接影響對(duì)明文進(jìn)行變換的結(jié)果。
4)密文:對(duì)明文進(jìn)行變換的結(jié)果。
5)解密算法:加密算法的逆變換,以密文為輸入、密鑰為參數(shù),變換結(jié)果為明文。
2.對(duì)稱(chēng)密碼常用的數(shù)學(xué)運(yùn)算 對(duì)稱(chēng)密碼當(dāng)中有幾種常用到的數(shù)學(xué)運(yùn)算。這些運(yùn)算的共同目的就是把被加密的明文數(shù)碼盡可能深地打亂,從而加大破譯的難度。
◆移位和循環(huán)移位 移位就是將一段數(shù)碼按照規(guī)定的位數(shù)整體性地左移或右移。循環(huán)右移就是當(dāng)右移時(shí),把數(shù)碼的最后的位移到數(shù)碼的最前頭,循環(huán)左移正相反。例如,對(duì)十進(jìn)制數(shù)碼12345678循環(huán)右移1位(十進(jìn)制位)的結(jié)果為81234567,而循環(huán)左移1位的結(jié)果則為23456781。
◆置換 就是將數(shù)碼中的某一位的值根據(jù)置換表的規(guī)定,用另一位代替。它不像移位操作那樣整齊有序,看上去雜亂無(wú)章。這正是加密所需,被經(jīng)常應(yīng)用。
◆擴(kuò)展 就是將一段數(shù)碼擴(kuò)展成比原來(lái)位數(shù)更長(zhǎng)的數(shù)碼。擴(kuò)展方法有多種,例如,可以用置換的方法,以擴(kuò)展置換表來(lái)規(guī)定擴(kuò)展后的數(shù)碼每一位的替代值。
◆壓縮 就是將一段數(shù)碼壓縮成比原來(lái)位數(shù)更短的數(shù)碼。壓縮方法有多種,例如,也可以用置換的方法,以表來(lái)規(guī)定壓縮后的數(shù)碼每一位的替代值。
◆異或 這是一種二進(jìn)制布爾代數(shù)運(yùn)算。異或的數(shù)學(xué)符號(hào)為⊕ ,它的運(yùn)算法則如下:
1⊕1 = 0
0⊕0 = 0
1⊕0 = 1
0⊕1 = 1
也可以簡(jiǎn)單地理解為,參與異或運(yùn)算的兩數(shù)位如相等,則結(jié)果為0,不等則為1。
◆迭代 迭代就是多次重復(fù)相同的運(yùn)算,這在密碼算法中經(jīng)常使用,以使得形成的密文更加難以破解。
3.DES算法簡(jiǎn)介 下面我們將介紹一種流行的對(duì)稱(chēng)密碼算法DES。
DES是Data Encryption Standard(數(shù)據(jù)加密標(biāo)準(zhǔn))的縮寫(xiě)。它是由IBM公司研制的一種對(duì)稱(chēng)密碼算法,美國(guó)國(guó)家標(biāo)準(zhǔn)局于1977年公布把它作為非機(jī)要部門(mén)使用的數(shù)據(jù)加密標(biāo)準(zhǔn),三十年來(lái),它一直活躍在國(guó)際保密通信的舞臺(tái)上,扮演了十分重要的角色。
DES是一個(gè)分組加密算法,典型的DES以64位為分組對(duì)數(shù)據(jù)加密,加密和解密用的是同一個(gè)算法。它的密鑰長(zhǎng)度是56位(因?yàn)槊總€(gè)第8 位都用作奇偶校驗(yàn)),密鑰可以是任意的56位的數(shù),而且可以任意時(shí)候改變。其中有極少數(shù)被認(rèn)為是易破解的弱密鑰,但是很容易避開(kāi)它們不用。所以保密性依賴于密鑰。
DES加密的算法框架如下: 首先要生成一套加密密鑰,從用戶處取得一個(gè)64位長(zhǎng)的密碼口令,然后通過(guò)等分、移位、選取和迭代形成一套16個(gè)加密密鑰,分別供每一輪運(yùn)算中使用。
DES對(duì)64位(bit)的明文分組M進(jìn)行操作,M經(jīng)過(guò)一個(gè)初始置換IP,置換成m0。將m0明文分成左半部分和右半部分m0 = (L0,R0),各32位長(zhǎng)。然后進(jìn)行16輪完全相同的運(yùn)算(迭代),這些運(yùn)算被稱(chēng)為函數(shù)f,在每一輪運(yùn)算過(guò)程中數(shù)據(jù)與相應(yīng)的密鑰結(jié)合。
在每一輪中,密鑰位移位,然后再?gòu)拿荑€的56位中選出48位。通過(guò)一個(gè)擴(kuò)展置換將數(shù)據(jù)的右半部分?jǐn)U展成48位,并通過(guò)一個(gè)異或操作替代成新的48位數(shù)據(jù),再將其壓縮置換成32位。這四步運(yùn)算構(gòu)成了函數(shù)f。然后,通過(guò)另一個(gè)異或運(yùn)算,函數(shù)f的輸出與左半部分結(jié)合,其結(jié)果成為新的右半部分,原來(lái)的右半部分成為新的左半部分。將該操作重復(fù)16次。
經(jīng)過(guò)16輪迭代后,左,右半部分合在一起經(jīng)過(guò)一個(gè)末置換(數(shù)據(jù)整理),這樣就完成了加密過(guò)程。
加密流程如圖所示。
DES解密過(guò)程: 在了解了加密過(guò)程中所有的代替、置換、異或和循環(huán)迭代之后,讀者也許會(huì)認(rèn)為,解密算法應(yīng)該是加密的逆運(yùn)算,與加密算法完全不同。恰恰相反,經(jīng)過(guò)密碼學(xué)家精心設(shè)計(jì)選擇的各種操作,DES獲得了一個(gè)非常有用的性質(zhì):加密和解密使用相同的算法!
DES加密和解密唯一的不同是密鑰的次序相反。如果各輪加密密鑰分別是K1,K2,K3…K16,那么解密密鑰就是K16,K15,K14…K1。這也就是DES被稱(chēng)為對(duì)稱(chēng)算法的理由吧。
至于對(duì)稱(chēng)密碼為什么能對(duì)稱(chēng)? DES具體是如何操作的?本文附錄中將做進(jìn)一步介紹,有興趣的讀者不妨去讀一讀探個(gè)究竟。
4.DES算法的安全性和發(fā)展 DES的安全性首先取決于密鑰的長(zhǎng)度。密鑰越長(zhǎng),破譯者利用窮舉法搜索密鑰的難度就越大。目前,根據(jù)當(dāng)今計(jì)算機(jī)的處理速度和能力,56位長(zhǎng)度的密鑰已經(jīng)能夠被破解,而128位的密鑰則被認(rèn)為是安全的,但隨著時(shí)間的推移,這個(gè)數(shù)字也遲早會(huì)被突破。
另外,對(duì)DES算法進(jìn)行某種變型和改進(jìn)也是提高DES算法安全性的途徑。
例如后來(lái)演變出的3-DES算法使用了3個(gè)獨(dú)立密鑰進(jìn)行三重DES加密,這就比DES大大提高了安全性。如果56位DES用窮舉搜索來(lái)破譯需要2∧56次運(yùn)算,而3-DES 則需要2∧112次。
又如,獨(dú)立子密鑰DES由于每輪都使用不同的子密鑰,這意味著其密鑰長(zhǎng)度在56位的基礎(chǔ)上擴(kuò)大到768位。DES還有DESX、CRYPT、GDES、RDES等變型。這些變型和改進(jìn)的目的都是為了加大破譯難度以及提高密碼運(yùn)算的效率。
___________________________________________________
附錄:DES的實(shí)際操作A.密鑰生成第A-1步 取得密鑰 從用戶處取得一個(gè)64位(本文均指二進(jìn)制位))長(zhǎng)的密碼口令key ,

去除64位密碼中作為奇偶校驗(yàn)位的第8、16、24、32、40、48、56、64位,剩下的56位作為有效輸入密鑰。
第A-2步 等分密鑰表1:
輸入密鑰位序/ A位序?qū)φ毡?br style="line-height: normal; " />

注:表中每個(gè)單元格的數(shù)字是輸入密鑰位序,每個(gè)單元格的位置排序就是A位序,從左向右排,排完一行接著排下一行。
表2:
輸入密鑰位序/ B位序?qū)φ毡?br style="line-height: normal; " />

把在第A-1步中生成的56位輸入密鑰分成均等的A、B兩部分,每部分為28位。不是簡(jiǎn)單地前后一分為二,而是參照表1和表2把輸入密鑰的位值填入相應(yīng)的位置。 按照表1所示,A的第一位為輸入的64位密鑰的第57位,A的第2位為64位密鑰的第49位,……,依此類(lèi)推,A的最后一位第28位是64位密鑰的第36位。這樣,形成了A、B兩部分:
第A-3步 密鑰移位表3:
每次迭代時(shí)密鑰循環(huán)
左移的位數(shù)

DES算法的密鑰是經(jīng)過(guò)16次迭代(循環(huán)左移)得到一組密鑰的,把在第A-1步中生成的A、B視為迭代的起始密鑰,表3顯示每一次迭代時(shí)密鑰循環(huán)左移的位數(shù)。 比如在第1次迭代時(shí)密鑰循環(huán)左移1位,第3次迭代時(shí)密鑰循環(huán)左移2位。
第9次迭代時(shí)密鑰循環(huán)左移1位,第14次迭代時(shí)密鑰循環(huán)左移2位。
第一次迭代:
A(1) =

(1) A
B(1) =

(1) B
第i次迭代:
A(i) =

(i) A(i-1)
B(i) =

(i) B(i-1)
第A-4步 密鑰的選取
在第A-3步中第i次迭代生成的兩個(gè)28位長(zhǎng)的密鑰為


把

合并,得:

表4:
56位密鑰C的位序與加密密鑰K的位序?qū)φ毡?br style="line-height: normal; " />

按照表4所示k的第一位為56位密鑰的第14位,k的第2位為56位密鑰的第17位,。。。,依此類(lèi)推,k的最后一位第48位是56位密鑰的第32位。 這樣,就生成了一個(gè)48位使用密鑰:

這個(gè)密鑰在加密運(yùn)算中將與進(jìn)行第i次迭代加密的數(shù)據(jù)進(jìn)行按位異或。
第A-5步 迭代 DES算法密鑰生成需要進(jìn)行16次迭代,在完成16次迭代前,循環(huán)執(zhí)行第A-3步和第A-4步,最終形成16套加密密鑰:key[0],key[1],key[2],…。key[14],key[15]。
B. 數(shù)據(jù)的加密操作第B-1步 取得數(shù)據(jù) 把明文數(shù)據(jù)分成64位的數(shù)據(jù)塊,不夠64位的數(shù)據(jù)塊以適當(dāng)?shù)姆绞窖a(bǔ)足。
第B-2步 初始換位置換表5:初始置換表

注:表中每個(gè)單元格的位置排序是新數(shù)據(jù)的位序。下同。
按照表5所示把輸入的64位數(shù)據(jù)的原第58位換到第一位,原第50位換到第二位,依此類(lèi)推,。。。,原第7位換到第64位。最后的得到新的64位數(shù)據(jù)。
OldData

newData
第B-3步 數(shù)據(jù)擴(kuò)展表6: 數(shù)據(jù)擴(kuò)展對(duì)照表(輸入數(shù)據(jù)位序/生成新數(shù)據(jù)位序)

第一次迭代以第B-2步中生成的newRata作為輸入數(shù)據(jù),第i (i > 1)次迭代以第i-1次的64位輸出數(shù)據(jù)為輸入數(shù)據(jù),把64位數(shù)據(jù)按位置等分成左右兩部分:

保持left不變,根據(jù)表6把right由32位擴(kuò)展置換成48位。在數(shù)據(jù)擴(kuò)展操作中,有些輸入數(shù)據(jù)位(如第1、4、5、17、28、29、32……等數(shù)位)用了兩次,因此數(shù)據(jù)得到了擴(kuò)展。這樣得到右半部分為:

把擴(kuò)展后的48位right與第i次迭代生成的48位加密密鑰進(jìn)行按位異或操作

形成一個(gè)新的48位的right。
第B-4步 數(shù)據(jù)壓縮表7.1:數(shù)據(jù)壓縮置換表(藍(lán)色欄內(nèi)是置換前的十進(jìn)制數(shù)字,白色欄內(nèi)是置換后的16進(jìn)制數(shù)字)

表7.2

表7.3 至表7.8與上表形式完全相同,僅數(shù)值不同,為節(jié)省篇幅從略不表。
在B-3步中形成了48位的right值,

需要把48位的right值轉(zhuǎn)換成32位的right值。置換的方法如下:
第一步,先把right視為由8個(gè)6位二進(jìn)制塊組成, 即

a,b…. h都是6位二進(jìn)制數(shù),轉(zhuǎn)換成10進(jìn)制整數(shù)的值應(yīng)當(dāng)都不大于64。
第二步,a,b…h轉(zhuǎn)換成10進(jìn)制整數(shù)后,在對(duì)應(yīng)的表中根據(jù)轉(zhuǎn)換后整數(shù)值取得對(duì)應(yīng)位置的替代值。這些替代值都是一個(gè)16進(jìn)制的個(gè)位數(shù),因此,每個(gè)替代值只占有二進(jìn)制數(shù)4位。
轉(zhuǎn)換時(shí)各查各表:
a對(duì)應(yīng)表7.1;b對(duì)應(yīng)表7.2;c對(duì)應(yīng)表7.3;d對(duì)應(yīng)表7.4;e對(duì)應(yīng)表7.5;f對(duì)應(yīng)表7.6;g對(duì)應(yīng)表7.7;h對(duì)應(yīng)表7.8。
比如:
a = 32 ,則到表7.1中找到32的位置,把對(duì)應(yīng)的替代值16進(jìn)制的8賦給a ;
b = 53 ,則到表7.2中找到的位置,把對(duì)應(yīng)的替代值16進(jìn)制的c賦給b ;
g = 16, 則到表7.7中找到16的位置,把對(duì)應(yīng)的替代值16進(jìn)制的a賦給g ;
這樣,每6位用一個(gè)4位替換,就完成了從48位向32位數(shù)據(jù)的壓縮置換。


有些資料中介紹6位轉(zhuǎn)4位的實(shí)現(xiàn)方法與本文所采用的不同,但殊途同歸,最終的目的是相同的。
第B-5步 數(shù)據(jù)換位置換表8

把第B-4步形成的32位right
根據(jù)表8進(jìn)行轉(zhuǎn)換:
數(shù)據(jù)的原第16位換到第一位,原第7位換到第二位,……,依此類(lèi)推,最后得到新的32位數(shù)據(jù)。
第B-6步 交換數(shù)據(jù) 把right 和left按位異或后的值賦給right,然后將本輪輸入的原始right值賦給left。
第B-7步 迭代 RES算法需要進(jìn)行16次迭代,在完成16次迭代前,把第i-1次得到的的left和right的值作為第i次的輸入數(shù)據(jù),重復(fù)第B-3步到第B-6步的步驟。但是有一點(diǎn)要記?。涸诓襟E第B-3中第i次迭代要選擇第i次迭代生成的密鑰與數(shù)據(jù)進(jìn)行按位異或。
第B-8步 數(shù)據(jù)整理表9

為保證加密和解密的對(duì)稱(chēng)性,RES算法的前15次迭代每完成一次迭代都要交換left和right的值,第16次迭代不交換兩者的數(shù)值。
到此,把32位的left和right合并成64位的Data:

根據(jù)表9重新調(diào)整Data的位值,數(shù)據(jù)的原第40位換到第一位,原第8位換到第二位,。。。,依此類(lèi)推,最后得到新的64位。

好了,經(jīng)過(guò)了這么多次的數(shù)學(xué)運(yùn)算,我們最終得到的Data即為密文。
C 數(shù)據(jù)的解密操作 數(shù)據(jù)解密的算法與加密算法相同,區(qū)別在于第B-3步中和數(shù)據(jù)進(jìn)行按位異或的密鑰的使用順序不同,在加密中是按照第i次迭代就采用第i次迭代生成的密鑰進(jìn)行異或,而解密時(shí)第i次迭代就采用第17-i次迭代生成的密鑰和數(shù)據(jù)進(jìn)行異或。