a)简介
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦*的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级*通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
b)算法流程
DES的整个操作可以分为三部分:
1)初始置换和逆初始置换
初始置换是在第一轮迭代之前进行的,目的是将原明文块的位进行换位。逆初始置换是初始置换的逆置换。数据块经过初始置换和逆初始置换后,可以恢复到原有的位置。初始置换和逆初始置换的置换表都是固定且公开的,这步操作主要目的是为了在硬件实现时,更容易的将明文和密文以字节的大小存放入DES芯片中。
2)轮函数
DES的轮函数有四部分组成:扩展置换(E盒)、密钥加、非线性代换(S盒)和线性置换(P盒)。
扩展置换,它将32位输入扩展为48位输出。扩展方法为:将48位输出按8行6列的次序排列,排列时,将输入位序号按32、1、2、…、31、32、1的次序依次排列,且上一行的最后两位依次在下一行的起始位置得到重用。
密钥加层的运算就是把E盒扩展输出的48位数据与48位字密钥进行逐位异或运算,输出48位数据。
非线性代换,利用S盒将E盒扩展生成的48位数据又重新压缩为32位数据。S盒实质是一个查表运算,8个S盒分别对应8个非线性的代换表,每个S盒的输入均为6位,输出为4位。再查表前,要将输入的48位数据分为8组,每组6位,然后分别进入8个S盒,进行运算。
S盒具体的查表方法:设S盒的6位输入为b1、b2、b3、b4、b5、b6。将b1、b6位组合为2位的二进制数,其相应的十进制数对应表的行号;b2、b3、b4和b5构成4位的二进制数,其相应的十进制数对应表的列号。
线性置换用来进行简单的位置置换,它按照给定的列表进行位置调换,不进行扩展和压缩。
3)密钥编排
DES的初始64位密钥通过置换选择PC-1,来得到有效的56位密钥。这56位密钥分为2个28位数据C0和D0。每轮生成字密钥的迭代中,Ci-1盒Di-1分别循环左移1位或2位,移位后的值作为下一轮的输入,同时,也作为置换选择PC-2的输入,通过置换选择PC-2产生一个48位的输入,即产生一个子密钥。
c)算法实现
置换:
图3.1.1 存表
图3.1.2 总置换
S盒:
图3.1.3 S盒压缩
异或:
图3.1.4 异或
F函数:
图3.1.5 F函数
类型转换:
图3.1.6 类型转换
子密钥生成:
图3.1.7 子密钥生成
加密:
图3.1.8 加密
解密:
图3.1.9 解密
d)算法验证
图3.1.10 des验证
e)算法分析
自从DES诞生,针对DES的讨论和攻击就没有停止,安全性主要包括四个方面:互补性、弱密钥、迭代轮数和密钥长度。
互补性: DES有补码的特性,明文和密钥都取补时,密文也取补。在选择明文攻击下,可以对明文的补用同一密钥加密,这样由DES互补性就可以得到密钥的补对明文的加密结果。当穷举搜索密钥时,若输出密文为正常明文加密结果,则加密密钥就是现在所用的密钥;若输出密文是明文用密钥补的加密结果,则加密密钥就是现在所用密钥的补。利用DES的互补性,可以使穷举搜索的工作量由256将为255,减少了一半,能极大地加快破解速度。
弱密钥: DES有四个弱密钥,使用它们作为子密钥,将使得DES加密两次后,数据仍为原来的数据,或者说是,加密和解密有同样的效果。还有12个半弱密钥,使用一个半弱密钥K1加密,相当于使用其对应的半弱密钥K2解密,会减少攻击工作量。因为弱密钥和半弱密钥的数量非常少,在实际使用时,可以检测事先检测一下密钥是否为弱密钥或半弱密钥,再使用,去避免不必要的风险。
迭代轮数: DES的迭代轮数为16轮,为什么是16轮呢?因为使用差分分析方法时,对于8轮迭代的DES,在个人计算机上只需要几分钟就可以破解。而当DES进行16轮迭代的时候,差分分析攻击就没有穷举攻击有效了。所以DES的迭代轮数不应当减少,过多又会降低效率,这才定为16轮迭代。
密钥长度:在DES刚诞生的时候,56位的有效密钥就被认为是不安全的,因为它是从112位削减过来的。但即便这样,以当时的计算机处理能力想要穷举搜索256的密钥量,是非常困难的。1977年,Diffie和Hellman设想了一种机器可以在1μs之内完成一次加密,使平均搜索时间降到10个小时,但机器的造价在当时是2000万美元,很不切实际。但随着计算机性能的不断提高,用穷举攻击来破解DES成为现实。1998年,一台25万美元的计算机在56小时内破解了DES,这个时间内,破译的密钥仍具有时效性,意味着DES已经不再安全。只得转向三重DES,来增大密钥长度,缓解密钥长度不足带来的安全问题。
f)实现难点
流程清楚但实现复杂步骤多,需要拆分实现的同时注意对接类型一致。