◆余啟航 李斌勇 楊雄凱 姚 瑤
DES加密算法的過程分析研究
◆余啟航 李斌勇 楊雄凱 姚 瑤
(成都信息工程大學網(wǎng)絡(luò)空間安全學院 四川 610225)
本文圍繞DES算法的加密問題,分析了DES算法的明文分組加密和子密鑰生成過程。針對DES所涉及的核心算法模塊,分別對IP初始置換、子密鑰獲取、E盒與S盒擴展、異或運算、P盒置換和逆初始置換模塊進行了深入地研究與設(shè)計。在此基礎(chǔ)上給出DES的部分核心算法的輸入與輸出實現(xiàn),并對其安全性進行了分析。本文所開展的研究,為深入理解DES加密算法和常規(guī)應用加密問題,提供了可行的參考。
DES;子密鑰;置換;加密算法
DES加密解密算法最初由美國IBM公司研究人員所設(shè)計發(fā)明,且為第一個公開的商用密碼算法標準,自誕生以來便得到了ISO的一致認可。DES是分組密碼算法的典型代表,它的明文分組長度為64bits,密鑰長度為64bits,其中包括有8bits的奇偶校驗,因此有效密鑰長度為56bits。DES加密解密算法使用的過程相同,且可以隨時均都可以進行變動。它們其中有極少數(shù)被認為是易破解的弱密鑰,但是很容易拋開它們不使用,因此其自身安全性主要依賴于有效密鑰。由于DES算法使用最大為64bits的邏輯運算以及標準算術(shù),它的子密鑰產(chǎn)生較為容易,可以適用于當前大部分計算機當中,因此近三十多年以來,其在保密通信密碼算法的研究使用中,扮演著極其重要的作用。
DES算法加密過程首先先對明文分組進行操作,需要加密的明文分為每塊64bits的固定大小。如圖1所示左右兩部分分別為64bits的明文分組加密過程和其16個子密鑰生成的過程。
圖1 DES加密算法流程
IP初始置換,在第一輪運算之前執(zhí)行,對輸入的分組采用如表1所示的IP初始變換,按照從左向右、從上向下進行置換。
表1 IP初始置換
子密鑰的獲取流程如圖2所示。
圖2 子密鑰獲取流程
Step1:此處,用戶輸入 64 位的密鑰。根據(jù)密鑰置換表PC-1,將 64 位變成 56 位密鑰(此處去掉了奇偶校驗位)。
Step2:PC-1 置換得到的56 位密鑰。此處密鑰被分為前28位 C0 和后28位 D0。分別對它們進行循環(huán)左移,C0 左移得到 C1,D0 左移得到 D1。
Step3:將 C1 和 D1 合并變成 56 位。然后通過PC-2表進行壓縮置換,得到此輪的 48 位子密鑰 K1。
Step4:再對 C1 和 D1 進行相同的左移和壓縮置換,獲取下一輪的子密鑰……一共進行16輪,于是可以得到 16 個 48 bits的子密鑰。
E盒擴展置換,則是將右半部分32bits按照8行4列方式依次排列,得到一個8*4的二維矩陣,然后根據(jù)如表2所示的E盒擴展置換表擴展為8*6的二維矩陣。
表2 E盒擴展
將P盒置換的結(jié)果與最初的64bits分組的左半部分異或,然后左、右半部分交換,接著開始另一輪。
當產(chǎn)生了48bits密鑰后就可以和明文進行異或運算,便可得到48bits的密文。再開始下輪的S盒迭代運算,其功能是把6bit數(shù)據(jù)變?yōu)?bits數(shù)據(jù),每個S盒是一個4行、16列的表。每個S盒的使用方法為:S盒收到6bits的輸入,6bits的第1個bit和最后1個bits構(gòu)成的2位二進制為該S盒行號,中間的4bits二進制為該S盒的列號,然后根據(jù)行號和列號查S盒定義表得到對應的值(通常為十進制),該值就是S盒變換的輸出,并轉(zhuǎn)化為二進制。
S盒代替運算之后,輸出32bits,作為F函數(shù)最后一個變換P盒置換的輸入。將該 32bits位數(shù)據(jù)進行P盒置換,置換后得到一個仍然是 32 bits的結(jié)果,此處可得F函數(shù)的輸出值。
DES完成16輪變換后,得到64bits數(shù)據(jù)作為IP-1逆初始置換的輸入,經(jīng)過IP-1逆初始置換表(如表3所示),64bits輸入數(shù)據(jù)位置重新編排,就得到64bits的密文。
表3 逆初始置換
def UnitoHex(string):
return_string=''
for i in string:
return_string+="%02x"%ord(i)
return return_string
輸入:unicode字符串
輸出:十六進制數(shù)據(jù)流
def _CodeIP(self,code):
changed_code=''
for i in range(64):
changed_code+=code[ip[i]-1]
return changed_code
輸入:明文或密文
輸出:對明文或密文初始置換后的64bit數(shù)據(jù)
def _KeyIP (self,key):
changed_key=''
for i in range(56):
changed_key+=key[pc1[i]-1]
return changed_key
輸入:初始密鑰
輸出:對密鑰初始置換后的56bit數(shù)據(jù)
def _EBox(self,code):
return_list=''
for i in range(48):
return_list+=code[e[i]-1]
return return_list
輸入:32bit數(shù)據(jù)
輸出:E盒擴展置換后的48bit數(shù)據(jù)
def _SBox(self, key):
return_list=''
for i in range(8):
row=int(str(key[i*6])+str(key[i*6+5]),2) raw=int(str( key[i*6+1])+str(key[i*6+2])+str(key[i*6+3])+str(key[i*6+4]),2)
return_list+=self._toByte(s[i][row][raw],4)
return return_list
輸入:48bit數(shù)據(jù)
輸出:S盒代替選擇置換后的32bit數(shù)據(jù)
def _PBox(self,code):
return_list=''
for i in range(32):
return_list+=code[p[i]-1]
return return_list
輸入:32bit數(shù)據(jù)
輸出:P盒置換后的32bit數(shù)據(jù)
def _Xor(self,code,key):
code_len=len(key)
return_list=''
for i in range(code_len):
if code[i]==key[i]:
return_list+='0'
else:
return_list+='1'
return return_list
輸入:E盒擴展置換后的48bit數(shù)據(jù)和PC-2的48bit子密鑰。
輸出:異或后的48bit數(shù)據(jù)。
由于DES算法中只用到64bits密鑰中的其中56bits密鑰,而第8、16、...64bits中的8個bits并未參與DES運算,可以發(fā)現(xiàn)即DES的安全性是基于除8、16、...64bits以外的其余56bits的排列組合才可以得到保證的。因此,在實際進行保密通信中,應盡量避免使用第8、16、24等bits作為有效數(shù)據(jù)位進行加密解密,以免在進行保密通信的系統(tǒng)中產(chǎn)生數(shù)據(jù)被破譯的隱患。
DES加密解密算法較為復雜,其中用到多次不同置換方式,以及進制的轉(zhuǎn)換和有效位的采用等,這給實現(xiàn)此算法帶來了一定的難度。但是也正是因為此,它的安全性相比其他一般密碼算法的安全性較高。在未來進一步研究中,應著力研究DES有效位的使用,以及完善加密解密的過程和簡便其算法的實現(xiàn)過程,以增強其安全性,使之能更加廣泛地解決日常應用加密問題。
[1]劉浪,周新衛(wèi).基于DES對稱加密體制的探討[J].科技廣場,2012.
[2]方亮.DES加密算法IP模塊實現(xiàn)[D].電子科技大學,2011.
[3]張芯苑.基于python的加密解密算法實現(xiàn)與研究[J].紡織報告,2017.
[4]徐洪波,李穎華.DES加密算法在保護文件傳輸中數(shù)據(jù)安全的應用[J].信息網(wǎng)絡(luò)安全,2009.
[5]張溫泉,趙紅敏,郝曉東.一種高速高安全性的DES算法設(shè)計[J].微電子學與計算機,2014.
[6]張峰,鄭春來,耶曉東. DES加密算法的FPGA實現(xiàn)[J]. 現(xiàn)代電子技術(shù),2008.
四川省教育廳重點項目(17ZA0069)、成都信息工程大學科研基金資助項目(KYTZ201618)。