VPN:DES加密算法原理
DES(Data Encryption Standard,數據加密標準)是1972年美國IBM公司研制的對稱密碼體制(加密和解密使用相同的密鑰)加密算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。
與AES算法相比,DES在參數特性方面主要區別體現在以下幾個方面:
DES的數據塊大小為8個字節,而AES的數據塊大小為16個字節。
DES的密鑰長度是64位(其中8位用于校驗),而AES的密鑰長度是128位(AES算法比DES算法更安全)。
當然,這兩種算法在加/解方面的具體原理是不一樣的,但DES加密算法的塊大小及密鑰長度都不能滿足現在的安全需求了,所以現在比較少使用這種加密算法,而是使用像AES或者3DES之類更高級的加密算法。
1. DES的數據塊填充
DES的加密過程與AES加密過程有些類似,首先也是需要對明文進行分塊。DES是按 64位進行分塊(AES是按128位分塊),密鑰長度為64位(事實上是僅56位參與DES運算,因為第8、16、24、32、40、48、56、64位是專用于校驗的,即密鑰中的每個字節的第8位均不參與加密運算)。這里也涉及到一個填充的問題,因為一個需加密的原始數據也可能不是64位(8個字節)的整數倍。
在 DES 加密算法中支持的填充方式也有好多,如 PKCS5Padding、ISO10126-2Padding、ISO7816-4Padding、X9.23Padding、TBCPadding、Zero Byte Padding、No Padding填充方式,但最常用的就是AES加密算法中的PKCS5Padding填充方式。
PKCS5Padding填充方式的填充方法就是原始數據塊與8字節相比差多少個字節就以所缺字節的值填充多少個字節。如一數據塊已有5個字節,即還差3個字節,此時就填充三個“3”(每個“3”用一個字節表示);如原始數據塊只有一個字節,即還差7個字節,則填充七個“7”(每個“7”也用一個字節表示)。另外要注意,如果原始數據塊恰好為8個字節的整數倍,也是要填充的,那就填充8個“8”(每個“8”也用一個字節表示),即要填充8個字節。這樣只要讀出最后一個字節的內容就知道哪些字節是填充的。
2. DES加/解密原理
DES加密算法與AES加密算法一樣,也有不同的工作模式,同樣包括ECB、CBC、CFB和OFB這幾類,各自的基本工作原理也是一樣的。
在DES算法中,加密的過程就是用56位密鑰對64位的明文數據塊進行16輪的加密處理,最終生成64位的密碼文。DES加密是對每個數據塊進行加密,所以輸入的參數為數據塊(64位)和密鑰(56位),明文數據塊需要經過置換和迭代,密鑰也需要置換和循環移位,以產生在分組明文加密過程中各輪迭代計算所需的子密鑰(48位)。整個加密過程可用圖1來描述。

圖1 DES算法加密的基本流程
(1)初始置換
初始置換(Initial Permutation)把輸入的64位明文數據塊按位重新組合,并把輸出分為L0、R0兩部分,每部分各長連續的32位。其置換規則為:將數據塊的第58位換到第1位,第50位換到第2位,以此類推,最后一位是原始數據塊的第7位。各位的對應的原來數據塊中的位數相差8,相當于將原明文數據塊各字節按列抽出來重新排列。圖2是原始明文數據塊中各位的位置(圖中的數字均代表對應的比特位號),圖3是經過初始置換后各比特位所對應的原始明文數據塊中的比特位號。L0、R0是置換后的兩部分,L0是輸出的高32位,R0是輸出的低32位。

圖2 原始明文密碼中各比特位所對應的比特位號

圖3 經過初始置換后各比特位所對應的原始明文數據塊中的比特號
(2)后續運算
經過初始置換后,再要經過16輪的加密迭代運算。經過16次迭代運算后得到L16、R16。最后一輪迭代的輸出有64位,將其左半部分(L16)和右半部分(R16)互換后產生預輸出。然后,預輸出再采用與初始置換(IP)相逆的操作——即逆初始置換(IP-1)運算,最終產生64位的密文塊。逆置換正好是初始置換的逆運算,例如,第1位經過初始置換后處于第40位,而通過逆置換又將第40位換回到第1位。
總體來說,加密迭代的整個過程主要是由加密函數f來實現。首先使用子密鑰k1對經過初始置換后的32位R進行加密處理,得到的結果也是32位的;然后再將這個32位的結果數據與經過初始置換后的32位L進行模2處理,從而再次得到一個32位的數據組。這樣經過一次迭代后將一個32位數據,它將作為第二次加密迭代的L1,往后的每一次迭代過程都與上述過程相同。
在結束了最后一輪加密迭代之后,會產生一個64位的數據信息組。然后將這個64位數據信息組按原有的數據排列順序平均分為左右兩等分,再將左右兩等分的部分進行位置調換,即原來左等分的數據整體位移至右側,而原來右等分的數據則整體位移至左側,這樣經過合并后的數據將再次經過逆初始置換IP-1的計算,最終將得到一組64位的密文。
(3)DES解密原理
DES解密和加密過程采用相同的算法,并采用相同的加密密鑰和解密密鑰,解密過程可以看成是加密過程的逆過程。主要體現在以下幾個方面:
DES加密是從L、R到L16、R16進行變換,而解密時是從L16、R16到L、R進行變換的;
DES加密時各輪的加密密鑰為k1、k2、……、k16,而解密時各輪的解密密鑰為k16、k15、……、k1;
DES加密時密鑰循環左移,解密時密鑰循環右移。
3. 子密鑰生成原理
各輪迭代運算中,每一輪都需要由密鑰單獨生成的子密鑰參與運算。這就涉及到子密鑰的生成問題,注意各輪運算中所生成的子密鑰是不一樣的。
首先要按如圖4所示的固定方式對原密鑰進行置換(注意:圖中的數字代表比特位號,不是數據),然后再把這56位分成連續的兩部分(C、D),每部分各28位,其中C包括高28位,D包括低28位(密鑰比特位的編號是從右下角開始,向依次遞增,即左上角代表最高比特位,右下角代表最低比特位)。

圖4 經過置換后各比特位所對應的原密鑰的比特位號
然后在每輪對數據塊進行迭代時,這兩部分對應的比特位分別在原密鑰或上輪子密鑰基礎上再循環左移1位或2位(具體是第1、2、9、16輪這兩部分循環左移一位,其他各輪這兩部分均左移2位)生成所需的子密鑰。如第一輪中的子密鑰就如圖5所示(C、D循環左移1位),第2輪的子密鑰就如圖6所示(C、D在第一輪子密鑰基礎上再循環左移1位)。

圖5 第1輪子密鑰各比特位對應于原密鑰的比特位

圖6 第2輪子密鑰各比特位對應于原密鑰的比特位
每進行一輪循環左移,就要進行一次壓縮置換,以最終得到一個48位的子密鑰。壓縮的規則是:第9、18、22、25、35、38、43、54位(共8位)數據被丟掉,后面的比特位左移。
4. 3DES算法簡介
由于計算機運算能力的增強,原版DES密碼的密鑰長度變得容易被暴力破解;3DES (Triple DES)即是設計用來提供一種相對簡單的方法,即通過增加DES的密鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼算法。它也有DES所支持的CBC、ECB、CFB和OFB等幾種工作模式,也支持PKCS5Padding、No Padding等填充方式。
在具體加密運算中,3DES是對每個數據塊使用3個DES的密鑰(即一共192位,實際參與運算的是168位)應用三次DES加密算法對數據塊(仍是64位,8個字節)進行三次加密。但所使用的3個密鑰不是合并成一個密鑰的,而是仍當作三個密鑰來使用(假設分別為密鑰1、密鑰2、密鑰3),在3DES加密時依次使用密鑰1、密鑰2、密鑰3對明文數據塊進行分別加密,在3DES解密時依次使用密鑰3、密鑰2、密鑰1對密文數據塊進行解密。