DES算法原理
-
对称密码算法中的分组加密算法(对应于流密码)
-
密钥64位,56位参与运算+8位校验位(校验位为:8、16、24、32、40、48、56、64)
加密原理

1. IP置换
将明文数据转化为二进制数,并将它们按照每64bit/组分开。IP置换就是通过按照初始置换表中对应的索引找到对应的64bit中的索引值进行替换,例子如下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QaajUTRW-1675004582902)(DES加密算法.assets/image-20220304170023805.png)]](https://img-blog.csdnimg.cn/02123cb95d2749acb25ac0d9727ab939.png)
2. 轮函数
经过简单的变化位置后就来到了DES算法的核心加解密数据块区,全局加密流程如下图,图中可以看到由经过初始置换后的64bit -> 2组 * 32bit,然后以组32bit进行操作

2.1 E扩展置换
将32bit数据 -> 8组 * 4bit再对每组的首位增添1bit,其中首bit是前一组的最后一bit,尾bit是后一个组的首个bit,使最后的数据扩展为8组 * 6bit 也就是48bit,这样就完成了对32bit扩展置换为48bit。具体如图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s071vak4-1675004582904)(DES加密算法.assets/DES扩展置换E.jpg)]](https://img-blog.csdnimg.cn/d593bf8b9d8543a9886203e250f61699.jpeg)
2.2 S盒压缩处理
经过扩展后的48bit再通过与48位的子密钥(加密算法开始接触密钥,在这之前用于加解密的key也已经通过加密算法生成了一个密钥)进行异或处理。
将异或后的48bit进行分组 -> 8组 * 6bit ,对每组的6bit压缩成为4bit,具体实现如图所示:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AY082TOF-1675004582906)(DES加密算法.assets/image-20220304172438235.png)]](https://img-blog.csdnimg.cn/a07259048c164ea4a01f236138cb5bd5.png)
根据上面的计算得到了坐标为(3,15)的数据,那么再根据S盒表进行查找得到对应的码表值,部分S盒表如图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c2HQmM5Y-1675004582909)(DES加密算法.assets/image-20220304173407259.png)]](https://img-blog.csdnimg.cn/f08c936c05094babb03649d7354dc114.png)
(8次轮函数加密对应S1-S8)
根据坐标找到的值为13,将13(十) —> 1101(二),那么bin(“111111”) -> S盒压缩后 -> bin(“1101”) ,这样就完成了一轮压缩,由进入压缩前的48bit -> 32bit 。但是不会马上进入到第二轮而是进入到P盒置换
2.3 P盒置换
P盒置换和第一次的IP置换一样根据表中的值填入数据的索引值,如图:

那么此时32bit的数据经过移位置换操作后,再通过8次S盒压缩处理,最后将该32bit数据(已轮加密后)对L0(L0是首次对64bit数据分出来的一组数据32bit)进行异或就得到R1 即 $ R_1= L_0\ xor f(R_0,k) $ (f(R0,k)表示通过密钥轮加密的值) 这样就完成了第一轮函数加密 ,按照
L
1
=
R
0
L_1 = R_0
L1=R0,$ R_1= L_0\ xor f(R_0,k) $ 每次下标自增1在经过16次轮加密后(也就是
L
16
=
R
15
L_{16} = R_{15}
L16=R15,$ R_{16}= L_{15}\ xor f(R_{15},k) $)就得到了R16 和L16 完成16轮迭代
3. 逆置换
最后通过和首次的置换方法一样通过如下表中的值对数据进行索引取值,再进行替换最终得到明文64bit加密后的密文64bit完成一组加密。逆置换表如图:

密钥生成
在对一个明文使用DES加密时需要一个密钥,而这个密钥同样用于解密密文
密钥生成流程图:

- 首先经过如下图PC-1表,进行置换前去掉校验位(8、16、24、32、40、48、56、64)也就是每组的最后一个bit被去掉,得到56bit(可以看到PC-1表中并没有校验位的索引)

- 再通过对56bit进行分组为 2 * 28bit 表示为CiDi分别对2组的数据进行移位操作,如图移位次数表。对应下列表中的左移值可得出 C 1 = C 0 < < 1 C_1 = C_0 << 1 C1=C0<<1 同理 D 1 = D 0 < < 1 D_1 = D_0 << 1 D1=D0<<1

- 得到C1 和 D1后将C1D1的二进制拼接后得到一个56bit值,通过如图PC-2表进行置换,从表中可以注意到PC-2表只有48位,从而也就将56bit压缩成了48bit最终得到k1
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t25hyeRv-1675004582920)(DES加密算法.assets/image-20220304200826311.png)]](https://img-blog.csdnimg.cn/0342751a40dd45a6a5de9cd479db9e8e.png)
- 整体流程梳理图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qZmq6m02-1675004582922)(DES加密算法.assets/image-20220304202110925.png)]](https://img-blog.csdnimg.cn/866300c5ea454050abe8ce58bde9f2a2.png)
经过上图中的迭代重复16次后即可得到k1 -k16的数据作为最终的密钥,再配合算法进行明文加密



















