什么是DES
数据加密标准,即DES(Data Encryption Standard)。在发音时,DES作为缩写按字母来读的话:(/ˌdiːˌiːˈɛs/);作为一个单独的词来读的话:(/ˈdɛz/)。
对称算法有两种类型:块密码和流密码。而DES算法就是采用了块密码,每一次处理固定长度输入块,每一个输入块,有生成了一个输出块。对于DES来说,它的块长度为64位。
DES算法结构
DES算法要进行16次相同过程的处理,叫做“回次”。而在初始和结尾处各有一次置换的处理,分别称为IP和IP-1(也叫做FP,即反函数).
初始置换IP
DES会对64位明文分组操作。这64位的明文通过初始置换IP产生64 位置换后的置换文x0,置换表格如下
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 |
初始置换把明文的第58位换到了第1位,把50放到了第2位,后面依次类推。
紧接着,这个64位的数据块,被分成2个32位的半块,并且分别处理;这种交叉的方式叫做費斯妥结构。斯妥结构可以保证加密和解密过程可以足够相似,而唯一的区别在于子密钥在解密是逆向的,其余的一样。这种设计理念简化了算法。
图片中的⊕符号表示异或(XOR)处理。F函数把数据半块和某一个子密钥进行处理。然后,一个F函数的输出与另一个半块异或,在把原来的半块组合交换顺序。进入后面一回的处理。在完成最后一次回次后,两个半块交换顺序。
費斯妥函数(F函数)
1. 扩展置换(E)
把数据的友半块从32位扩展到48位。扩展置换表如下
32 | 1 | 2 | 3 | 4 | 5 |
4 | 5 | 6 | 7 | 8 | 9 |
8 | 9 | 10 | 11 | 12 | 13 |
12 | 13 | 14 | 15 | 16 | 17 |
16 | 17 | 18 | 19 | 20 | 21 |
20 | 21 | 22 | 23 | 24 | 25 |
24 | 25 | 26 | 27 | 28 | 29 |
28 | 29 | 30 | 31 | 32 | 1 |
32位的半块扩展到了48位后,以8个6位的块输出。每块包含4位对应的输入位,加上两个邻接的块中紧邻的位。
2. 异或
扩展后的输出与一个密钥通过异或结合。
3. S盒
在和子密钥混合后48位被分成8份6位的块,然后使用S盒置换处理。8个S盒都使用查找表方式提供非线性的变换把6位输出变成了4位的输出。S盒提供了DES的核心安全性—如果没有S盒,密码会是线性的,很容易破解。
S盒的具体置换如下:某一个Si盒的6位输入的第一位和第六位形成了一个2位的二进制数(即0~3),对应表中的某一行;而中间4位构成的4位二进制数(即0~15)对应表中的某一列(PS:行和列从0开始计数)。
S盒如下
S1 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
x0000x | x0001x | x0010x | x0011x | x0100x | x0101x | x0110x | x0111x | x1000x | x1001x | x1010x | x1011x | x1100x | x1101x | x1110x | x1111x | |
0yyyy0 | 14 | 4 | 13 | 1 | 2 | 15 | 11 | 8 | 3 | 10 | 6 | 12 | 5 | 9 | 0 | 7 |
0yyyy1 | 0 | 15 | 7 | 4 | 14 | 2 | 13 | 1 | 10 | 6 | 12 | 11 | 9 | 5 | 3 | 8 |
1yyyy0 | 4 | 1 | 14 | 8 | 13 | 6 | 2 | 11 | 15 | 12 | 9 | 7 | 3 | 10 | 5 | 0 |
1yyyy1 | 15 | 12 | 8 | 2 | 4 |