對稱密碼 (共享密鑰密碼)
——用相同的密鑰進(jìn)行加密和解密
此次主要介紹比特序列運(yùn)算和XOR(異或)運(yùn)算。這兩種運(yùn)算在計(jì)算機(jī)數(shù)據(jù)處理中經(jīng)常出現(xiàn),因此大家應(yīng)該在此屬性他們。
- 一次性密碼本 (絕對無法破解的密碼,這一點(diǎn)已經(jīng)得到證明)
- DES
- 三重DES
- AES
- 其他一些密碼算法
DES
? DES(Data Encryption)是1977年美國聯(lián)邦信息處理標(biāo)準(zhǔn)(FIPS)中所采用的一種對稱密碼(FIPS46-3)。DES一直以來被美國及其他國家的政府和銀行等廣泛使用。
?隨著計(jì)算機(jī)的進(jìn)步,現(xiàn)在DES已經(jīng)能夠被暴力破解,強(qiáng)度大不如前了。20世紀(jì)末,RSA公司舉辦過破譯DES密鑰的比賽,我們可以看一看RSA公司官方公布的比賽結(jié)果:1997年的DES Challenge I 中用了96天破譯密鑰,1998年的DES Challenge II-1中用了41天,1998年的DES Challenge II-2中用了56小時(shí),1999年的DES Challenge III 中只用了22小時(shí)15分鐘。
?由于DES的密文可以在短時(shí)間內(nèi)被破譯,因此除了用它來解密一起的密文以外,現(xiàn)在我們不應(yīng)該再使用DES了。
加密和解密
?DES是一種將64比特的明文加密成64比特的密文的對稱密碼算法,它的密鑰的長度是56比特。盡管從規(guī)格上來說,DES的密鑰長度是64比特,但由于每隔7比特會設(shè)置一個(gè)用于錯(cuò)誤檢查的比特,因此實(shí)質(zhì)上其密鑰長度是56比特。
?DES 是以64比特的明文(比特序列)為一個(gè)單位來進(jìn)行加密的,這個(gè)64比特的單位稱為分組 ,一般來說,以分組為單位進(jìn)行處理的密碼算法稱為分組密碼,DES就是分組密碼的一種。
?DES每次只能加密64比特的數(shù)據(jù),如果要加密的明文比較長,就需要對DES加密進(jìn)行迭代(反復(fù)),而迭代的具體方式就稱為模式。

DES的結(jié)構(gòu)(Feistel網(wǎng)絡(luò))
?DES的基本結(jié)構(gòu)是由Horst Feistel設(shè)計(jì)的,因此也稱為Feistel網(wǎng)絡(luò)(Feistel network)、Feistel結(jié)構(gòu)(Feistel structure)或者Feistel密碼(Feistel cipher)。這一結(jié)構(gòu)不僅被用于DES,在其他很多密碼算法中也有應(yīng)用。
?Feistel網(wǎng)絡(luò)中,加密的各個(gè)步驟稱為輪,整個(gè)加密過程就是進(jìn)行若干次輪的循環(huán),下圖,展現(xiàn)的是Feistel網(wǎng)絡(luò)中一輪的計(jì)算流程。DES是一種16輪循環(huán)的Feistel網(wǎng)絡(luò)。

? 上圖兩個(gè)方框表示Feistel網(wǎng)絡(luò)中的一輪的輸入(明文)。輸入的數(shù)據(jù)被等分為左右兩半分別進(jìn)行處理。在圖中,左半部分寫作“左側(cè)”,右半部分寫作“右側(cè)”。
?下圖的兩個(gè)方框表示本輪的輸出(密文)。輸出的左半部分寫作“加密后的左側(cè)”,右半部分寫作“右側(cè)”。
?中間的“子密鑰”指的是本輪加密所使用的的密鑰,在Feistel網(wǎng)絡(luò)中,每一輪都需要使用一個(gè)不同的子密鑰。由于密鑰只在一輪中使用,它只是一個(gè)局部的密鑰,因此才稱為子密鑰(subkey)。
? 輪函數(shù)的作用是根據(jù)“右側(cè)”和子密鑰生成對“左側(cè)”進(jìn)行加密的比特序列,它是密碼系統(tǒng)核心。將輪函數(shù)的輸出與“左側(cè)”進(jìn)行XOR運(yùn)算,其結(jié)果就是“加密后的左側(cè)”。也就是說,我們用XOR將輪函數(shù)的輸出與“左側(cè)”進(jìn)行合并。而輸入的“右側(cè)”則會直接成為輸出的“右側(cè)”。
總結(jié)一下,一輪的具體計(jì)算步驟如下。
- 將輸入的數(shù)據(jù)等分為左右兩個(gè)部分
- 將輸入的右側(cè)直接發(fā)送到輸出的右側(cè)
- 將輸入的右側(cè)發(fā)送到輪函數(shù)
- 輪函數(shù)根據(jù)右側(cè)數(shù)據(jù)和子密鑰,計(jì)算出一串看上去是隨機(jī)的比特序列
- 將上一步得到的比特序列與左側(cè)序列進(jìn)行XOR運(yùn)算,并將結(jié)果作為加密后的左側(cè)。
?但是,這樣看來,“右側(cè)”根本沒有加密,因此我們需要用不同的子密鑰對一輪的處理重復(fù)若干次,并在沒兩輪處理指間將左側(cè)和有責(zé)的數(shù)據(jù)對調(diào)。

上圖展現(xiàn)了一個(gè)3輪的Feistel網(wǎng)絡(luò),3輪加密計(jì)算需要進(jìn)行兩次左右對調(diào)。對調(diào)只在兩輪指間進(jìn)行,租后一輪結(jié)束不需要對調(diào)。
那么,F(xiàn)eistel網(wǎng)絡(luò)如何解密呢?

如上圖所示,通過上述操作都能夠?qū)⒚芪恼_的還原明文。

有多輪的情況也是一樣的,也就是說,F(xiàn)eistel網(wǎng)絡(luò)的解密操作,只要按照相反的順序來使用子密鑰就可以完成了,而Feistel網(wǎng)絡(luò)本身的結(jié)構(gòu),在加密和解密都是完全相同的。
Feistel網(wǎng)絡(luò)性質(zhì)
- Feistel網(wǎng)絡(luò),輪數(shù)可以任意增加。無論運(yùn)行多少輪的加密計(jì)算,都不會發(fā)生無法解密的情況
- Feistel網(wǎng)絡(luò),加密時(shí)無論使用任何函數(shù)作為輪函數(shù)都可以正確解密。
- Feistel網(wǎng)絡(luò),加密和解密可以用完全相同的結(jié)構(gòu)來實(shí)現(xiàn),這也是Feistel網(wǎng)絡(luò)的一個(gè)特點(diǎn)。
該系列的主要內(nèi)容來自《圖解密碼技術(shù)第三版》
我只是知識的搬運(yùn)工
文章中的插圖來源于原著