DES简介
DES是一种对称密码体制加密算法,明文和密钥均由64位二进制位构成,其中,密钥实际作用位共56位(第8的整数倍的位均为奇偶校验位,使密钥中8个为一组的二进制位组中保证有奇数个1,不发生作用)
目前除了穷举搜索法,还没有发现的攻击DES有效算法,安全性较高。
DES加密流程详解
DES加密算法的过程中涉及到很多位数的改变,如32位变为48位,48位编程32位等等,所以理清DES算法最重要的一个点就是要弄明白“什么数据在什么时候发生了什么变化”。
在这份详解中,我将所有的中间数据全用“(名称)位数”的格式来命名,如data_64,来区分不同过程中数据的形式。
1.< 处理明文>
将明文data_64通过IP置换操作,转写成新的二进制位串,即IP_64。
转换过程如下,数组元素表示新的IP数据每一位放置哪一个旧data位,如58表示IP第1位为data的第58位,IP第2位为data第50位,以此类推(后文置换变化方法相同)
1 | int IpTrans[64] = {58,50,42,34,26,18,10,2, |
2. <分解IP>
将IP分为左右两部分L0_32和R0_32,即前32位和后32位
3. <处理密钥>
将密钥key64通过PC_1置换操作,转写成新的二进制位串,即newKey56,此时,操作产生的56位密钥newKey,相当于将key去掉8个奇偶校验位后再进行置换得到的新串,PC_1置换表如下(我们可以发现此时的置换表中没有8的倍数位,即等同于将奇偶校验位去掉)
1 | int PC_1[56] = {57,49,41,33,25,17,9, |
4. <分解密钥>
如同分解IP一样,将密钥分为左右两部分C0_28和D0_28,不同的是要增加其他操作
(1) C0和D0分别连续进行16次循环向左移位,产生16个新的C和D,并依次记为C1…C16和D1..D16,16次移位数如下
1 | int left_shift[16] = {1,1,2,2,2,2,2,2, 1,2,2,2,2,2,2,1}; |
(2)将Cn合并得到DnCn_56后,通过PC_2置换操作得到16个Kn48,即此时由56位变为48位(n≠0)
1 | int PC_2[48] = {14,17,11,24,1,5, |
5. <循环操作>
通过如下函数关系,我们对L和R进行16次循环操作 Ln=Rn-1
其中,f函数包括以下三个步骤,异或,缩位,置换
(1)异或:R与K进行异或,我们需要把R(上文IP的右侧)从32位变为48位,此时需要E置换,置换后按位异或
1 | int E[48] = {32,1,2,3,4,5, |
(2)缩位:为了产生新的32位R,我们将得到的48位串经过s盒变换转写成32位
->首先把48位6位一组分成8组,这8组分别匹配8个S盒,每个S盒6位输入后输出4位,S盒内部结构是4行16列的二维数组,数组元素范围为0-15,为最后的4位输出,8组共32位
->S盒工作方法是:首位与末尾合并表示行,中间四位表示列,在盒子中选择对应的数组元素的二进制表达作为输出
->如第一组数据是110010,则行数为首位末尾结合的10,列号为中间4位1001,则输出S1盒的table[2][9]的二进制1100
1 | // 使用一维数组的形式代替了二维数组 |
(3)将上面得到的32位串进行P盒变换,得到新的R,下角标+1
1 | int P[32] = {16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10, |
6. <逆置换IP>
根据上述流程得到L_16和R_16后,我们对其进行逆置换,即初始IP置换的逆置换,得到密文
如我们开始将第58位放置于第1位,那逆置换就是把第1位放回58位
1 | int IP_inTrans[64] = {40,8,48,16,56,24,64,32, |
DES加密流程总结
置换明文为IP并分为左右两部分L和R
置换并缩小密钥位数后分为左右两部分C和D
将密钥的左右两部分循环左移得到16个K
利用K、L、R、异或、S盒、P盒得到新的L和R
将L16R16逆置换,得到最后的密文