DES加密算法(Data Encryption Standard, DES)
算法描述
DES算法对定长(64-bits)的数据块进行处理。每一个64 bit的数据块会被分为左半部分(用L表示)和右半部分(用R表示),每一部分的长度为32 bit。
例如:用M表示一个待加密的信息,令M=0123456789ABCDEF(16进制),将其转换成二进制,得到:
M = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
L = 0000 0001 0010 0011 0100 0101 0110 0111
R = 1000 1001 1010 1011 1100 1101 1110 1111
我们定义M的第一bit是0,最后一个bit是1(即M是从左至右的顺序排列的)
DES用一个56 bit的密钥对64 bit的数据块进行操作。该密钥表面上看是64 bit,但是由于每个第8个 bit(第8, 16, 24, 32, 40, 48, 56, 64个bit)没有被使用,实际上起作用的只有剩下的56 bit。但是在后面的叙述中,我们仍然将M的每一个bit从1到64进行编号,没有使用的8个 bit仅仅在生成子密钥时被去除了。
例如:令K = 133457799BBCDFF1(16进制),将其转换成二进制就是:
K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
上述转换中,将1(16进制)转换成了0001(二进制),将3(16进制)转换成了0011(二进制),并且将相邻的8 bit设置成一组(每一组的最后一个bit将不会被使用)
然后,DES加密算法将按照以下步骤进行加密
步骤一:生成16个子密钥,每个密钥长度为48 bit
64 bit的密钥首先将按照下表(表1)进行重新排列,以打乱密钥的顺序,生成新的密钥K+。例如表1中第一个数字是57,意味着将原密钥中的第57个bit放置到新密钥K+的第一个bit。同理,表1中第二个数字是49,意味着将原密钥中的第49 bit放置到新密钥K+的第二 bit。原密钥中的第四 bit将成为K+的最后一个bit。需要注意的是,表1中只有56个数字,意味着打乱顺序后新生成的密钥K+也变成了56 bit。
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 |
表1:密钥变换规则表
例如:从64 bit的原始密钥
K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
得到重新排序后的新密钥
K+ = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
然后将新密钥K+均分成两部分,左侧的28 bit记为C0,右侧的28 bit记为D0。
例如:根据K+,可以得到
C0 = 1111000 0110011 0010101 0101111
D0 = 0101010 1011001 1001111 0001111
得到和D0后,就以生成16个Cn和Dn,其中1<=n<=16,每个Cn和Dn 由Cn-1和Dn-1经过变换而来。具体变换方法是,每个Cn和Dn(1<=n<=16)都由Cn-1和Dn-1向左移动特定次数得到。进行一次向左移动操作时,后一bit都取代前一bit的位置,第一个bit将会被移动到最后一个位置。对于标号为n的Cn和Dn需要向左移动的位置个数由表2确定。
n |
左移的次数 |
1 |
1 |
2 |
1 |
3 |
2 |
4 |
2 |
5 |
2 |
6 |
2 |
7 |
2 |
8 |
2 |
9 |
1 |
10 |
2 |
11 |
2 |
12 |
2 |
13 |
2 |
14 |
2 |
15 |
2 |
16 |
1 |
表2:Cn,Dn左移次数对照表
例如,要从C2生成C3,需要经过2次左移操作;从D2生成D3也需要经过2次左移操作。通过C15生成C16需要经过1次左移操作;通过D15生成D16需要经过1次左移操作。总之,一个标号由1到28的字符串经过一次左移变换后将会变成2, 3, …, 28, 1。
于是,从上面的C0和D0,可以得到:
C1 = 1110000 1100110 0101010 1011111
D1 = 1010101 0110011 0011110 0011110
C2 = 1100001 1001100 1010101 0111111
D2 = 0101010 1100110 0111100 0111101
C3 = 0000110 0110010 1010101 1111111
D3 = 0101011 0011001 1110001 1110101
C4 = 0011001 1001010 1010111 1111100
D4 = 0101100 1100111 1000111 1010101
C5 = 1100110 0101010 1011111 1110000
D5 = 0110011 0011110 0011110 1010101
C6 = 0011001 0101010 1111111 1000011
D6 = 1001100 1111000 1111010 1010101
C7 = 1100101 0101011 1111110 0001100
D7 = 0110011 1100011 1101010 1010110
C8 = 0010101 0101111 1111000 0110011
D8 = 1001111 0001111 0101010 1011001
C9 = 0101010 1011111 1110000 1100110
D9 = 0011110 0011110 1010101 0110011
C10 = 0101010 1111111 1000011 0011001
D10 = 1111000 1111010 1010101 1001100
C11 = 0101011 1111110 0001100 1100101
D11 = 1100011 1101010 1010110 0110011
C12 = 0101111 1111000 0110011 0010101
D12 = 0001111 0101010 1011001 1001111
C13 = 0111111 1100001 1001100 1010101
D13 = 0111101 0101010 1100110 0111100
C14 = 1111111 0000110 0110010 1010101
D14 = 1110101 0101011 0011001 1110001
C15 = 1111100 0011001 1001010 1010111
D15 = 1010101 0101100 1100111 1000111
C16 = 1111000 0110011 0010101 0101111
D16 = 0101010 1011001 1001111 0001111
现在可以根据Cn和Dn生成Kn(1<=n<=16)。将Cn和Dn相连(56 bit)后根据表3进行重新排序。对于每个56 bit的CnDn,只有其中的48位被使用了。
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:密钥生成对照表
因此,第n个密钥Kn的第1个bit是CnDn的第14个bit,同理Kn的第2个bit是CnDn的第17个bit,而且Kn的第48个bit是CnDn的第32个bit。
例如:对于C1D1 = 1110000 1100110 0101010 1011111 1010101 0110011 0011110 0011110
经过表3重新排序后,得到
K1 = 000110 110000 001011 101111 111111 000111 000001 110010
因此我们可以得到其他的密钥
K2 = 011110 011010 111011 011001 110110 111100 100111 100101
K3 = 01101 011111 110010 001010 010000 101100 111110 011001
K4 = 011100 101010 110111 010110 110110 110011 010100 011101
K5 = 011111 001110 110000 000111 111010 110101 001110 101000
K6 = 011000 111010 010100 111110 010100 000111 101100 101111
K7 = 111011 001000 010010 110111 111101 100001 100010 111100
K8 = 111101 111000 101000 111010 110000 010011 101111 111011
K9 = 111000 001101 101111 101011 111011 011110 011110 000001
K10 = 101100 011111 001101 000111 101110 100100 011001 001111
K11 =001000 010101 111111 010011 110111 101101 001110 000110
K12 =011101 010111 000111 110101 100101 000110 011111 101001
K13 = 100101 111100 010111 010001 111110 101011 101001 000001
K14 = 010111 110100 001110 110111 111100 101110 011100 111010
K15 =101111 111001 000110 001101 001111 010011 111100 001010
K16 = 110010 110011 110110 001011 000011 100001 011111 110101
密钥的相关生产操作到此已经完成。
第二步 编码一个64-bit数据块
对于一个数据块M,首先根据以下的表4打乱顺序,生成一个新的序列N。根据表4,N的第1个bit是数据块M的第58个bit;N的第2个bit是数据块M的第50个bit;N的第64个bit是数据块M的第7个bit。
58 |
50 |
42 |
34 |
26 |
18 |
10 |
2 |
60 |
52 |
44 |
36 |
28 |
20 |