DES背景
DES算法是第一个公开的密码算法,它是一个迭代型分组密码算法,分组长度64比特,密钥长度64比特,有效密钥长度56比特,迭代圈数16圈,圈密钥长度48比特。DES算法概述
基本流程
DES算法的基本流程如下图所示,对于一个64位的分组(用m1,m2...m64分别表示第1到第64个比特),首先对它进行初始置换,然后进行16圈的迭代,迭代中每一圈的密钥不同,分别是k1,k2。。。k16。之后对结果进行逆初始置换,得到密文c1,c2...c64。如下图所示(来自老师上课课件):初始置换和逆初始置换
对于明文M = m1m2...m64,按照下图所示的初始置换IP指示的顺序从输出中取出指定的位放在这一位上,得到输出,比如c1 = c58,c2=c50.。。。以此类推逆初始置换是初始置换的逆变换,用表格表示如下图,
设输入为m1m2...m64,输出为c1c2...c64,则 c1c2c3c4c5c6c7c8 = m40m8m48m16m56m24m64m32 ... 它的效果和初始置换刚好互逆,即如果把初始置换的输出作为它的输入,则输出为初始置换的输入。
圈函数
初始置换之后的输出要进行16圈迭代。 圈函数使用的是Feistel模型,它的数学描述如下:第1,2.。。。15圈的圈加密结构图如下
每一圈迭代过程中:
- 输出的左32位就是输入的右32位
- 输出的右32位是输入的右32位和圈密钥k进行f函数运算后和输入左32位异或运算得到。
圈函数
f函数
f函数的数学表达式如下f函数的运算流程如下图所示:
- 先对右32位输入进行E盒运算得到48位输出
- 再把运算结果和48位的圈密钥进行异或之后输入到s1,s2...s8盒中
- 每个S盒都是6进4出(输入为6比特,输出4比特),综合得到32位输出
- 把结果输入到P盒中,进行P盒置换,最后得到32位输出。
E盒扩展
E盒扩展的作用是把32比特的输入扩展成48比特,扩展的方式如下图所示,把输入的32比特从左到右编号为1,2,3.。。。32,并把 这32比特写成每行4个,共8行的形式。然后把第i-1行最右比特和第i+1行最左比特添加到第i行的左边和右边,这样就得到了48bit的输出。(即c1c2c3c4c5c6 = m32m1m2m3m4m5 .... 以此类推)。S盒代替——压缩替代变换
S盒的作用是将输入的48比特数据压缩为32比特。8个6进4出的S盒如下图所示,每个S盒有4行,记为第0,1,2,3行,有16列,记为第0,1,2,3.。。。,15列。
以s6为例解释s盒的使用方法: 对于6位输入b1b2b3b4b5b6,用b1b6组成的二进制数表示行标,b2b3b4b5组成的二进制数表示列标,查s盒的表,表中的十进制数字转为4位二进制即为输出
P盒置换——移位变换
P盒置换是对S盒变换后的32比特数据进行比特置换,置换后得到的32比特数据即为f函数的输出。 P盒置换的方式和初始置换相同,如c1c2c3c4 = m16m7m20m21 .... 如下图所示,以此类推。圈密钥生成算法
64位的密钥首先进行置换选择1,得到56位的有效密钥,置换选择1如下图所示,进行方式同初始置换,c1c2c3c4c5c6c7 = m57m49m41m33m25m17m9,以此类推。之后每一圈的48位圈密钥生成过程如下图所示:
把56位有效密钥分成左28位Ci和右28位Di,经过移位变换后得到Ci+1, Di+1,其中得到C/D1,C/D2,C/D9,C/D16前面的移位是循环左移两位,其余的为循环左移1位。 Ci和Di作为输入进行选择置换2,得到48位的输出为Ki。选择置换2如下图所示:
再次回顾DES算法加密的框图,我们已经掌握了算法流程中的每一个细节: )