1.首先,要明确几个简单的概念
- key:8个字节共64位的工作密钥,必须是8字节。但是实际用到的是56字节,剩下的8字节用于校验
- data:8个字节共64位的需要被加密或被解密的数据
2. 流程图
下图为16轮重复运算的具体过程
3.算法的流程简单分析
1)IP置换–处理data
IP置换目的是将输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位。
置换规则如下表所示:表格中的数字为位置,这点要注意,不是内容,以后的表中的内容也只是位置,而不是数据!!!!一定要注意
这张映射表的内容是固定的,不用纠结
58 | 50 | 42 | 34 | 26 | 18 | 10 | 2 |
60 | 52 | 44 | 36 | 28 | 20 | 12 | 4 |
62 | 54 | 46 | 38 | 30 | 22 | 14 | 6 |
64 | 56 | 48 | 40 | 32 | 24 | 16 | 8 |
57 | 49 | 41 | 33 | 25 | 17 | 9 | 1 |
59 | 51 | 43 | 35 | 27 | 19 | 11 | 3 |
61 | 53 | 45 | 37 | 29 | 21 | 13 | 5 |
63 | 55 | 47 | 39 | 31 | 23 | 15 | 7 |
然后就这个8*8的表格就被分成了左右两个,即L0和R0
2)秘钥置换–处理key
- 要把64为秘钥改成56位,删掉8,16,24,32,40,48,56和64这8位,见下表
57 | 49 | 41 | 33 | 25 | 17 | 9 | 1 | 58 | 50 | 42 | 34 | 26 | 18 |
10 | 2 | 59 | 51 | 43 | 35 | 27 | 19 | 11 | 3 | 60 | 52 | 44 | 36 |
63 | 55 | 47 | 39 | 31 | 23 | 15 | 7 | 62 | 54 | 46 | 38 | 30 | 22 |
14 | 6 | 61 | 53 | 45 | 37 | 29 | 21 | 13 | 5 | 28 | 20 | 12 | 4 |
- 将剩下的56位分成两组,每组28位,分别为C0和D0。划分结果如下
- 在DES的每一轮中(要进行16轮,后面会说),从56位密钥产生出不同的48位子密钥,确定这些子密钥的方式如下为:
根据轮数,这两部分分别循环左移1位或2位。每轮移动的位数如下表:
轮数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
位数 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
为了方便理解,简单解释一下怎么左移,第一轮,位数为1,则:
C0:
现在C1:
49-41-33-25-17-------------57
就是整体向前移动一位,后面D0也是一样的道理。
- 最终从56位得到48位,表中没有9,18,22,25,35,38,43和54这8位
14 | 17 | 11 | 24 | 1 | 5 | 3 | 28 | 15 | 6 | 21 | 10 |
23 | 19 | 12 | 4 | 26 | 8 | 16 | 7 | 27 | 20 | 13 | 2 |
41 | 52 | 31 | 37 | 47 | 55 | 30 | 40 | 51 | 45 | 33 | 48 |
44 | 49 | 39 | 56 | 34 | 53 | 46 | 42 | 50 | 36 | 29 | 32 |
3)扩展置换
目的是将有半段R0由32位拓展为48位
如上图所示,第一列和第六列均为拓展内容,拓展的规则我已经标注好,这样便于理解。
4)与秘钥异或操作
经过上面的操作,秘钥长度已经从64位控制位48位,与R0长度一致,进行异或操作,得出结果。
5)进行S盒变换
得到的异或后的48位后,将其分成8组,放入8个S盒中。每个S盒有6位输入4位输出。最终输出为32位
每个S盒的映射表都是固定的,为了方便,我这列出其中一个盒子的映射表
13 | 2 | 8 | 4 | 6 | 15 | 11 | 1 | 10 | 9 | 3 | 14 | 5 | 0 | 12 | 7 |
1 | 15 | 13 | 8 | 10 | 3 | 7 | 4 | 12 | 5 | 6 | 11 | 0 | 14 | 9 | 2 |
7 | 11 | 4 | 1 | 9 | 12 | 14 | 2 | 0 | 6 | 10 | 13 | 15 | 3 | 5 | 8 |
2 | 1 | 14 | 7 | 4 | 10 | 8 | 13 | 15 | 12 | 9 | 0 | 3 | 5 | 6 | 11 |
例如,假设S盒8的输入为110011,第1位和第6位组合为11,11对应十进制为3,对应于S盒8的第3行;第2位到第5位为1001,1001对应十进制为9,对应于S盒8的第9列。最终结果为12 (都是从下标为0开始计算的)
6)P盒变换
比较简单,将32位对应映射表进行映射即可(表示确定好的,不要纠结这个)
16 | 7 | 20 | 21 | 29 | 12 | 28 | 17 |
1 | 15 | 23 | 26 | 5 | 18 | 31 | 10 |
2 | 8 | 24 | 14 | 32 | 27 | 3 | 9 |
19 | 13 | 30 | 6 | 22 | 11 | 4 | 25 |
7)结果与L0异或
8)重复 2)-7)步骤 ,总共16次
9)将L15和R15组合成64位
10)IP-1末置换
按照映射表,进行映射即可
40 | 8 | 48 | 16 | 56 | 24 | 64 | 32 |
39 | 7 | 47 | 15 | 55 | 23 | 63 | 31 |
38 | 6 | 46 | 14 | 54 | 22 | 62 | 30 |
37 | 5 | 45 | 13 | 53 | 21 | 61 | 29 |
36 | 4 | 44 | 12 | 52 | 20 | 60 | 28 |
35 | 3 | 43 | 11 | 51 | 19 | 59 | 27 |
34 | 2 | 42 | 10 | 50 | 18 | 58 | 26 |
33 | 1 | 41 | 9 | 49 | 17 | 57 | 25 |
最后得出密文!!