目录
本文主要参照B站博主可 可厉害的土豆 所作笔记,博主讲的很好,具体可参照 DES加密
一、DES算法简介
DES(Data Encryption Standard)加密算法属于对称加密(对应于非对称加密)算法中的分组加密(对应于流密码)算法。
所谓对称加密,即加密与解密所用的密钥是相同的,而非对称加密中,存在公钥与私钥,公钥可解密私钥加密的数据,私钥可解密公钥加密的数据。
所谓分组加密(又叫块加密),是将明文分为字节块,然后对每个字节块进行加密最终拼接在一起得到密文(DES算法分组大小是64位),流密码是按照一个字节一个字节进行加密。
二、DES算法流程简介
DES加密算法流程:
- 对明文进行IP置换。
- 将 64bit 明文数据左右对半分为 L 0 L_0 L0(32bit) 与 R 0 R_0 R0(32bit) 两部分。
- 将 R 0 R_0 R0 直接赋值给 L 1 L_1 L1 。
- 将 L 0 L_0 L0 与 f ( R 0 K 1 ) f(R_0 K_1) f(R0K1) 的值赋值给 R 1 R_1 R1。
(1). 对于 f f f 函数,首先使用 E 扩展将 32 位明文转换为 48 位。
(2). 然后用明文与所给的密钥 K K K 进行异或。
(3). 通过 S 盒将文段压缩为 32 位。
(4). 再对文段进行 P 置换。 - 对2~4过程进行16轮。
- IP逆置换得到密文。
具体算法流程如下面图示:


三、DES算法具体执行过程
1. IP置换
IP 置换是指按照一定的规则,将原来的64位二进制重新排序,具体置换表如下图所示:
图中的 Initial Permutation 对应为最开始的 IP 置换表,Final Permutation对应为最后的逆置换表。
Initial Permutation表中第一个数字 58 表示将原始明文中的 58 位放到当前的第一位,第二个数字50表示将原始明文中的50位放到当前的第二位…以此类推,通过置换表将原始明文进行置换。
具体可参见一下实例:
2.轮函数–E扩展置换
E 扩展置换主要功能是将 32 位的输入扩展为 48 位输出(使 32 位的 R 0 R_0 R0 能够与 48 位的 K 进行异或操作),具体操作过程可参照下图:
上图中的表与前面所讲的置换表功能类似,表中对应的数字 i 代表将32位的文段中第 i 位的二进制写入 i 在表中的位置。
扩展的过程也可以通过图中下方的图的规律的到,即将 32 位的文段分为 8 块,将这八块二进制文段循环排列,将每一块的最后一位放到后一块的最前面,将每一块的最前一位放到前一块的最后面,这样每一块就多加了两位,8 块总共增加了 16 位,所以文段就由原来的 32 位扩展成了 48 位。
具体例子如下图所示:
原始数据:

得到以上 48 位的数据之后,即可与密钥 K 进行异或操作了。
3.轮函数–S盒压缩处理
S盒压缩处理即是将异或操作得到的 48 位数据压缩为 32 位,具体操作如下:
- 将 48 位的数据分为 8 块 6 位的数据。
- 将每块 6 位数据的头和尾二进制数转换成十进制数记为行数,将中间的四位二进制数据转换成十进制记为列数。
- 然后通过下面的表格,根据行数和列数找到对应的十进制数,然后将该十进制数转换为四位二进制。
- 原来的 6 位二进制数转换成了 4 位,每块少了两位,共 8 块,在48位的基础上少了 16 位,即将原来的 48 位二进制数压缩成了32位。
具体实例可参照下图:
按照上面的表格得到 3 行 15 列数据为 13,然后将13转换为二进制即得到压缩后的数据:
4.轮函数–P盒置换
P盒置换操作与之前的初始置换操作相同,其置换表如下所示:
将 P 盒置换后的数据与 L 0 L_0 L0 进行异或操作后即得到了 R 1 R_1 R1 ,对以上过程重复进行 16 次即可得到 L 16 L_{16} L16 与 R 16 R_{16} R16 ,然后对 L 16 L_{16} L16 与 R 16 R_{16} R16 进行拼接将得到的数据进行IP逆置换即得到了所求的密文。
5.补充–密钥生成
1. 密钥生成过程
密钥的生成总的操作如下图所示:

- 取一个 64 位的种子密钥,然后通过以下置换表,即可得到 56 位的密钥:

- 然后将56位的密钥对半分为两部分C与D根据移位次数表进行循环左移操作。
- 最后将移位完成的数据参照以下置换表进行置换,得到最终的 48 位密钥。

2. 密钥生成具体实例
- 原始种子密钥(64位)如下图所示

2.通过 PC-1 表置换后得到如下结果

- 通过对上面数据的对半截取可得到 C 0 C_0 C0 与 D 0 D_0 D0

- 根据移位次数表根据不同的迭代次数可以求得不同的 C i C_i Ci 与 D i D_i Di

- 将 C i C_i Ci 与 D i D_i Di 进行拼接,然后通过 PC-2置换表即可得到不同迭代轮次的密钥 K i K_i Ki