于偉 黎玉香

摘 要:在對稱密碼體制中,發收雙方使用相同密鑰,有著同樣的加密密鑰和解密密鑰。在眾多的加密算法中影響最大的是DES加密算法。本文詳細介紹了DES加密的過程及其C語言實現。
關鍵詞:DES;密鑰;加密;C語言
0 引言
分組密碼是目前應用較為廣泛的一種密碼體制,而DES(Data Encryption Standard)加密算法是分組密碼的典型代表,也是第一個被公布出來的加密標準算法。它是第一個將密碼算法公開的加密標準,如果只知道算法但沒有正確的密鑰就不能單純的通過算法得到明文,其安全性得益于在破解密碼時計算上和時間上的復雜性。DES分組明文的長度為64位,加密階段卻沒有依照這個長度來處理,而是選擇了56位密鑰的方式來,由此生成對應的64為密文。
1 DES加密的流程步驟
對于DES加密而言,其操作步驟可以分為兩個環節:首先,是加密階段;接著就是子密鑰產生的階段,實現對于上述兩個階段的控制,可以完成加密的任務。
加密步驟如下:
(1)將明文以重新排列順序 64位分組后進行初始置換,且分為左右兩半,各32位;
(2)兩半分別經過16輪迭代,即進行16次相同的變換,每輪迭代中使用置換和代換技術。16輪迭代后兩半對調;
(3)在得到對應的兩半之后,需要進行逆初始置換,由此實現對應64為密文的生成,這就是第三步驟。
子密鑰的產生則由56位密鑰,產生16個48位子密鑰,分別供左半邊的16輪迭代加密使用。
1.1 初始置換
對于分組加密,初始置換是第一步,通過一個初始置換函數DES_IP_Transform()后將64位明文分成兩部分:左半部分L0和右半部分R0各32位。
1.2 新一輪數據的生成
左右兩半再經過16輪迭代,在每輪迭代中,使用函數 memcpy()將上一輪的右邊Ri-1直接變換為本輪的左邊Li,將上一輪的右邊Ri–1通過擴展置換函數DES_E_Transform(),由32位擴展到48位,再與48位子密鑰經函數DES_XOR()進行異或運算后,通過S盒函數DES_SBOX()壓縮成32位,經置換函數DES_P_Transform()得到32位的加密函數F,F與Li–1異或后作為本輪的右邊Ri。
16輪迭代后,使用函數DES_Swap()將左右兩半交換,再經逆初始置換函數DES_IP_1_Transform()得到64位密文。
1.3 S盒
在加密函數計算過程中使用了8個S盒,48位數據經過8個S盒后輸出32位數據,每個S盒都由4行、16列組成,定義成一個三維數組 S[8][4][16]。對于每個S盒,輸入6位,輸出4位。對于上述輸入數據進行分析,明確最高位和最低位,以兩者為基礎形成對應二進制數,由此去選擇S盒4行中的行。剩下還有4位數字,可以選擇S盒16列中的行。在上述行列選擇之后會看到行列存在交叉的部分,這就是此處要輸出的數據,最后將該數據轉換為4位二進制數。這樣,48位數據經過8個S盒后得到了32位。
2 子密鑰產生
首先將56位密鑰經過置換選擇1,這里使用函數DES_PC1_Transform()將其位置重新排列。并排列后的前28位用C0表示,后28位用D0表示,如圖1。
接下來要產生16個48位的子密鑰也需要經過16輪迭代。在實際迭代的過程中,原本28位的 Ci-1和Di-1因為函數循環作用,使得其出現位移的情況,一般表現為向左移動一位或者兩位,左移位數由數組int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}定義。通過移位我們可以獲取Ci和Di,接著就需要將這兩者實現合并,此時就可以得到對應56位,接著以置換的方式將其原來的次序打亂,具體過程可以參見圖2,由函數DES_PC2_Transform()實現,從56位中挑出48位作為該輪的子密鑰。
3 DES解密
DES解密過程和加密過程本質一致,有著相同的步驟和算法,另外DES加密算法屬于對稱加密技術,因此解密和加密使用相同的密鑰。不同之處在于:其一,解密時是將64位密文作為算法的輸入,其二,子密鑰在使用時是加密過程的逆序,K16是解密過程中第1輪的子密鑰,K15是第2輪的子密鑰,K1是最后一輪的子密鑰。
4 結束語
信息的加密和解密是數據傳輸中保證信息安全性和完整性的常用方法,而DES加密標準綜合使用了多種置換和代換技術,具有較高的安全性,在國際上被用來作為商用保密通信和計算機通信的有效算法。該加密標準的安全性不依賴于算法本身,而取決于密鑰,是一種高效、經濟的算法。
參考文獻
[1]郭亞軍,宋建華,李莉,等.信息安全原理與技術(第2版)[M].北京:清華大學出版社,2013.
[2]張潔,朱麗娟.DES加密算法分析與實現[J].軟件導刊,2007,(3):95-97.
[3]王昭,袁春.信息安全原理與應用[M].北京:電子工業出版社,2010