◆余启航 李斌勇 杨雄凯 姚 瑶
DES加密算法的过程分析研究
◆余启航 李斌勇 杨雄凯 姚 瑶
(成都信息工程大学网络空间安全学院 四川 610225)
本文围绕DES算法的加密问题,分析了DES算法的明文分组加密和子密钥生成过程。针对DES所涉及的核心算法模块,分别对IP初始置换、子密钥获取、E盒与S盒扩展、异或运算、P盒置换和逆初始置换模块进行了深入地研究与设计。在此基础上给出DES的部分核心算法的输入与输出实现,并对其安全性进行了分析。本文所开展的研究,为深入理解DES加密算法和常规应用加密问题,提供了可行的参考。
DES;子密钥;置换;加密算法
DES加密解密算法最初由美国IBM公司研究人员所设计发明,且为第一个公开的商用密码算法标准,自诞生以来便得到了ISO的一致认可。DES是分组密码算法的典型代表,它的明文分组长度为64bits,密钥长度为64bits,其中包括有8bits的奇偶校验,因此有效密钥长度为56bits。DES加密解密算法使用的过程相同,且可以随时均都可以进行变动。它们其中有极少数被认为是易破解的弱密钥,但是很容易抛开它们不使用,因此其自身安全性主要依赖于有效密钥。由于DES算法使用最大为64bits的逻辑运算以及标准算术,它的子密钥产生较为容易,可以适用于当前大部分计算机当中,因此近三十多年以来,其在保密通信密码算法的研究使用中,扮演着极其重要的作用。
DES算法加密过程首先先对明文分组进行操作,需要加密的明文分为每块64bits的固定大小。如图1所示左右两部分分别为64bits的明文分组加密过程和其16个子密钥生成的过程。
图1 DES加密算法流程
IP初始置换,在第一轮运算之前执行,对输入的分组采用如表1所示的IP初始变换,按照从左向右、从上向下进行置换。
表1 IP初始置换
子密钥的获取流程如图2所示。
图2 子密钥获取流程
Step1:此处,用户输入 64 位的密钥。根据密钥置换表PC-1,将 64 位变成 56 位密钥(此处去掉了奇偶校验位)。
Step2:PC-1 置换得到的56 位密钥。此处密钥被分为前28位 C0 和后28位 D0。分别对它们进行循环左移,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的二维矩阵,然后根据如表2所示的E盒扩展置换表扩展为8*6的二维矩阵。
表2 E盒扩展
将P盒置换的结果与最初的64bits分组的左半部分异或,然后左、右半部分交换,接着开始另一轮。
当产生了48bits密钥后就可以和明文进行异或运算,便可得到48bits的密文。再开始下轮的S盒迭代运算,其功能是把6bit数据变为4bits数据,每个S盒是一个4行、16列的表。每个S盒的使用方法为:S盒收到6bits的输入,6bits的第1个bit和最后1个bits构成的2位二进制为该S盒行号,中间的4bits二进制为该S盒的列号,然后根据行号和列号查S盒定义表得到对应的值(通常为十进制),该值就是S盒变换的输出,并转化为二进制。
S盒代替运算之后,输出32bits,作为F函数最后一个变换P盒置换的输入。将该 32bits位数据进行P盒置换,置换后得到一个仍然是 32 bits的结果,此处可得F函数的输出值。
DES完成16轮变换后,得到64bits数据作为IP-1逆初始置换的输入,经过IP-1逆初始置换表(如表3所示),64bits输入数据位置重新编排,就得到64bits的密文。
表3 逆初始置换
def UnitoHex(string):
return_string=''
for i in string:
return_string+="%02x"%ord(i)
return return_string
输入:unicode字符串
输出:十六进制数据流
def _CodeIP(self,code):
changed_code=''
for i in range(64):
changed_code+=code[ip[i]-1]
return changed_code
输入:明文或密文
输出:对明文或密文初始置换后的64bit数据
def _KeyIP (self,key):
changed_key=''
for i in range(56):
changed_key+=key[pc1[i]-1]
return changed_key
输入:初始密钥
输出:对密钥初始置换后的56bit数据
def _EBox(self,code):
return_list=''
for i in range(48):
return_list+=code[e[i]-1]
return return_list
输入:32bit数据
输出:E盒扩展置换后的48bit数据
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数据
输出:S盒代替选择置换后的32bit数据
def _PBox(self,code):
return_list=''
for i in range(32):
return_list+=code[p[i]-1]
return return_list
输入:32bit数据
输出:P盒置换后的32bit数据
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数据和PC-2的48bit子密钥。
输出:异或后的48bit数据。
由于DES算法中只用到64bits密钥中的其中56bits密钥,而第8、16、...64bits中的8个bits并未参与DES运算,可以发现即DES的安全性是基于除8、16、...64bits以外的其余56bits的排列组合才可以得到保证的。因此,在实际进行保密通信中,应尽量避免使用第8、16、24等bits作为有效数据位进行加密解密,以免在进行保密通信的系统中产生数据被破译的隐患。
DES加密解密算法较为复杂,其中用到多次不同置换方式,以及进制的转换和有效位的采用等,这给实现此算法带来了一定的难度。但是也正是因为此,它的安全性相比其他一般密码算法的安全性较高。在未来进一步研究中,应着力研究DES有效位的使用,以及完善加密解密的过程和简便其算法的实现过程,以增强其安全性,使之能更加广泛地解决日常应用加密问题。
[1]刘浪,周新卫.基于DES对称加密体制的探讨[J].科技广场,2012.
[2]方亮.DES加密算法IP模块实现[D].电子科技大学,2011.
[3]张芯苑.基于python的加密解密算法实现与研究[J].纺织报告,2017.
[4]徐洪波,李颖华.DES加密算法在保护文件传输中数据安全的应用[J].信息网络安全,2009.
[5]张温泉,赵红敏,郝晓东.一种高速高安全性的DES算法设计[J].微电子学与计算机,2014.
[6]张峰,郑春来,耶晓东. DES加密算法的FPGA实现[J]. 现代电子技术,2008.
四川省教育厅重点项目(17ZA0069)、成都信息工程大学科研基金资助项目(KYTZ201618)。