DES算法是第一个公开的密钥算法,是一个迭代型的分组算法。分组长度646464比特,密钥长度为646464比特,其中有效位长为565656比特,每个第888位都用作奇偶校验,不参与密码计算,迭代次数为161616次,每轮的迭代密钥为484848比特。
基本流程
DES算法的基本流程如下图所示:
初始置换(IPIPIP)与逆初始变换(IP−1IP^{-1}IP−1)
初始置换 IP
初始置换 IP | |||||||
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 |
例:
M=1001001000111010100100101010010110101101000011101010111010010011⟶IPC=0000000010000111011110001001100011011101010110100111001011100111\begin{aligned}
M = \begin{matrix} 10010010 \\ 00111010\\ 10010010\\10100101\\10101101\\00001110\\10101110\\10010011
\end{matrix}\stackrel{IP}{\longrightarrow} C = \begin{matrix} 00000000\\10 000111\\01111000\\10011000\\11011101\\01011010\\01110010\\11100111\end{matrix}
\end{aligned}M=1001001000111010100100101010010110101101000011101010111010010011⟶IPC=0000000010000111011110001001100011011101010110100111001011100111
逆初始置换是初始置换的逆变换,用表格表示如下
逆初始置换 | |||||||
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 | 59 | 26 |
33 | 1 | 41 | 9 | 49 | 17 | 57 | 25 |
例:
C=0000000010000111011110001001100011011101010110100111001011100111⟶IP−1M=1001001000111010100100101010010110101101000011101010111010010011\begin{aligned} C = \begin{matrix} 00000000\\10 000111\\01111000\\10011000\\11011101\\01011010\\01110010\\11100111 \end{matrix} \stackrel{IP^{-1}}{\longrightarrow} M = \begin{matrix} 10010010 \\ 00111010\\ 10010010\\10100101\\10101101\\00001110\\10101110\\10010011 \end{matrix} \end{aligned}C=0000000010000111011110001001100011011101010110100111001011100111⟶IP−1M=1001001000111010100100101010010110101101000011101010111010010011
轮变换(RoundnRound_nRoundn)
使用的是Feistel模型,数学描述如下:
Li=Ri−1Ri=Li−1⊕f(Ri−1,Ki)\begin{aligned} L_{i} &= R_{i-1}\\
R_{i}&=L_{i-1}\oplus f(R_{i-1}, K_i)
\end{aligned}LiRi=Ri−1=Li−1⊕f(Ri−1,Ki)
即,迭代过程中
- 输出的左32比特(LiL_{i}Li),为上一轮输出的右32比特(Ri−1R_{i-1}Ri−1)
- 输出的右32比特(RiR_{i}Ri),为上一轮输出的右32比特(Ri−1R_{i-1}Ri−1)与轮密钥(KiK_iKi)的fff函数再异或上一轮输出的左32比特(Li−1L_{i-1}Li−1)。
fff函数
其数学表达式为
f(R,K)=PS(E(R)⊕K)f(R,K) = PS(E(R)\oplus K)f(R,K)=PS(E(R)⊕K)
- 先对右323232比特输入进行E盒运算,得到484848比特输出;
- 再把运算结果和484848比特的轮密钥进行异或,输入至S1,S2,...S8S_1, S_2,...S_8S1,S2,...S8盒中;
- 每个S盒都是666进444出,综合得到4×8=324\times 8=324×8=32比特输出;
- 把结果输入至P盒中,进行P盒置换,最后得到323232位输出。
E盒扩展
E盒扩展的作用,是将323232比特输入扩展成484848比特的输出。扩展方式为:
- 把输入的323232比特从左至右编码,并把其写成8×48 \times 48×4的形式.
- 然后把第i−1i-1i−1行的最右比特和第i+1i+1i+1行的最左比特分别添加至第iii行的最左边和最右边。
这样一来,将323232比特的输入就扩展成484848比特的输出了。
例:
M=00001000011110011101010101111110⟶EC=000001010000001111110011111010101010101111111100\begin{aligned}
M = \begin{matrix} 0000\\10 00\\0111\\1001\\1101\\0101\\0111\\1110 \end{matrix} \stackrel{E}{\longrightarrow} C = \begin{matrix} 0&0000&1\\0&10 00&0\\0&0111&1\\1&1001&1\\1&1101&0\\1&0101&0\\1&0111&1\\1&1110&0 \end{matrix}
\end{aligned}M=00001000011110011101010101111110⟶EC=000111110000100001111001110101010111111010110010
S盒代替——压缩替代变换
S盒作用是将输入的48比特压缩为32比特的输出。
- 将484848比特输入,写成8×68 \times 68×6的形式;
- 将每行666比特,分别输入至S1,...S8S_1,...S_8S1,...S8盒中;
- 对每行的666比特的最高位和最低位组成的数字作为S盒的行数,中间444比特作为S盒的列数,输出对应的值。
888个666进444出的S盒对照表如下:
例:
M=000001010000001111110011111010101010101111111100⟶EC=00001001101001000011100001110101\begin{aligned}
M = \begin{matrix} 000001\\010 000\\001111\\110011\\111010\\101010\\101111\\111100 \end{matrix}\stackrel{E}{\longrightarrow} C = \begin{matrix} 0000\\10 01\\1010\\0100\\0011\\1000\\0111\\0101 \end{matrix}
\end{aligned}M=000001010000001111110011111010101010101111111100⟶EC=00001001101001000011100001110101
P盒置换——移位变换
P盒置换是对S盒的输出进行比特置换。
P盒置换 | |||
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 |
例:
M=00001001101001000011100001110101⟶PC=00110010000110000101110110100100\begin{aligned}
M = \begin{matrix} 0000\\10 01\\1010\\0100\\0011\\1000\\0111\\0101 \end{matrix} \stackrel{P}{\longrightarrow} C =\begin{matrix}0011\\ 0010\\ 0001 \\ 1000 \\01 0 1\\11 01 \\1010\\0100\end{matrix}
\end{aligned}M=00001001101001000011100001110101⟶PC=00110010000110000101110110100100
轮密钥生成
轮密钥生成过程如下图所示:
其生成过程如下:
- 646464比特的密钥经置换选择1得到565656比特的有效密钥;
- 将565656比特的有效密钥,分成左282828比特(CiC_iCi)和右282828比特(DiD_iDi),经过循环左移分别得到下一轮的左282828比特(Ci+1C_{i+1}Ci+1)和右282828比特(Di+1D_{i+1}Di+1),其中得到C/D1C/D_1C/D1,C/D2C/D_2C/D2,C/D9C/D_9C/D9,C/D16C/D_{16}C/D16前面的移位是循环左移222位,其余的为111位;
- 将每一轮移位后的Ci∣∣DiC_i||D_iCi∣∣Di作为置换选择2的输入,得到每轮的密钥KiK_iKi。
置换选择1
置换选择1的对照表如下:
置换选择1 | ||||||
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 |
例:
K=0000010110011011101000110100110100111000100011000111100101011010⟶置换选择1C0∣∣D0=00100110110010000101010011011000011000101001111110100010\begin{aligned} K = \begin{matrix} 00000101\\10 011011\\10100011\\01001101\\00111000\\10001100\\01111001\\01011010 \end{matrix} \stackrel{置换选择1}{\longrightarrow} C_0 ||D_0 =\begin{matrix}0010011\\0110010\\0001010\\10 01101\\1000011 \\0001010\\0111111\\0100010 \end{matrix} \end{aligned}K=0000010110011011101000110100110100111000100011000111100101011010⟶置换选择1C0∣∣D0=00100110110010000101010011011000011000101001111110100010
置换选择2
置换选择2的对照表如下:
置换选择2 | |||||
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 | 22 |
例:
将C0∣∣D0C_0||D_0C0∣∣D0循环左移2位,再经过置换选择2得到K1K_1K1.
C0∣∣D0=00100110110010000101010011011000011000101001111110100010⟶循环左移2位C1∣∣D1=10011011001000010101001101100001100010100111111010001000⟶置换选择2K1=001111000000100111111100000110000110111001110000\begin{aligned} C_0 ||D_0 =\begin{matrix}0010011\\0110010\\0001010\\10 01101\\1000011 \\0001010\\0111111\\0100010 \end{matrix} \stackrel{循环左移2位}{\longrightarrow} C_1 ||D_1 =\begin{matrix}1001101\\1001000\\0101010\\ 0110110\\0001100 \\0101001\\1111101\\0001000 \end{matrix}\stackrel{置换选择2}{\longrightarrow} K_1 =\begin{matrix}001111\\ 000000\\100111\\111100 \\000110\\000110 \\111001\\ 110000\end{matrix} \end{aligned}C0∣∣D0=00100110110010000101010011011000011000101001111110100010⟶循环左移2位C1∣∣D1=10011011001000010101001101100001100010100111111010001000⟶置换选择2K1=001111000000100111111100000110000110111001110000
3DES算法
由于 DES 算法的密钥长度只有 565656 位,为了提高安全性,人们在 DES 的基础上提出了 3DES 算法。顾名思义,3DES 算法是 333 次 DES 算法。在加密过程中,分别利用 333 个不同的 565656 位密钥,依次做 “加密,解密,加密”。具体地说:
- 用密钥 1 对明文做 DES 加密运算,得到中间结果 1;
- 将中间结果 1 利用密钥 2 做一次解密运算,得到中间结果 2;
- 将中间结果 2 用密钥 3 做一次加密,得到最终结果。
解密时,依次用密钥 3,密钥 2,密钥 1 做 “解密,加密,解密” 运算。3DES 算法在保证了对原有 DES 的兼容性的基础上,讲将密钥长度从 565656 为扩展到了 168168168位,增强了抗穷举攻击的能力。