DES算法xx.docx
《DES算法xx.docx》由会员分享,可在线阅读,更多相关《DES算法xx.docx(24页珍藏版)》请在冰豆网上搜索。
![DES算法xx.docx](https://file1.bdocx.com/fileroot1/2022-12/12/20c6bdfb-9550-4a2f-a2b2-dae83e14b065/20c6bdfb-9550-4a2f-a2b2-dae83e14b0651.gif)
DES算法xx
DES算法及其实现
美国国家标准局(NBS)于1997年公布了一个由IBM公司研制的一种加密算法,并且确定为非机要部门使用的数据加密标准,简称DES(DataEncryptonStandard)。
自公布之日起,DES算法作为国际上商用保密通信和计算机通信的最常用算法,一直活跃在国际保密通信的舞台上,扮演了十分突出的角色。
DES算法由加密、子密钥和解密的生成三部分组成。
现将DES算法介绍如下。
一.加密
DES算法处理的数据对象是一组64比特的明文串。
设该明文串为m=m1m2…m64(mi=0或1)。
明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。
其加密过程图示如下:
DES算法加密过程
对DES算法加密过程图示的说明如下:
待加密的64比特明文串m,经过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
该比特串被分为32位的L0和32位的R0两部分。
R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。
运算规则为:
f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。
L1与R0又做与以上完全相同的运算,生成L2,R2……一共经过16次运算。
最后生成R16和L16。
其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。
R16与L16合并成64位的比特串。
值得注意的是R16一定要排在L16前面。
R16与L16合并后成的比特串,经过置换IP-1(终结置换)后所得比特串的下标列表如下:
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
经过置换IP-1后生成的比特串就是密文e.。
变换f(Ri-1,Ki):
它的功能是将32比特的输入再转化为32比特的输出。
其过程如图所示:
f变换说明:
输入Ri-1(32比特)经过变换E(扩展置换E)后,膨胀为48比特。
膨胀后的比特串的下标列表如下:
E
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
膨胀后的比特串分为8组,每组6比特。
各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。
该32比特经过P变换(压缩置换P)后,其下标列表如下:
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
经过P变换后输出的比特串才是32比特的f(Ri-1,Ki)。
S盒的变换过程:
任取一S盒。
见图:
在其输入b1,b2,b3,b4,b5,b6中,计算出x=b1*2+b6,y=b5+b4*2+b3*4+b2*8,再从Si表中查出x行,y列的值Sxy。
将Sxy化为二进制,即得Si盒的输出。
S盒:
以上是DES算法加密原理
二、子密钥的生成
64比特的密钥生成16个48比特的子密钥。
其生成过程见图:
子密钥生成过程
具体解释如下:
64比特的密钥K,经过PC-1(置换A)后,生成56比特的串。
其下标如表所示:
PC-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
该比特串分为长度相等的比特串C0和D0。
然后C0和D0分别循环左移1位,得到C1和D1。
C1和D1合并起来生成C1D1。
C1D1经过PC-2(置换B)变换后即生成48比特的K1。
K1的下标列表为:
PC-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
32
C1、D1分别循环左移LS2位,再合并,经过PC-2,生成子密钥K2……依次类推直至生成子密钥K16。
注意:
Lsi(I=1,2,….16)的数值是不同的。
具体见下表:
迭代顺序
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
三.解密
DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2……K16的顺序倒过来。
即第一圈用第16个子密钥K16,第二圈用K15,其余类推。
第一圈:
加密后的结果
L=R15,R=L15⊕f(R15,K16)⊕f(R15,K16)=L15
同理R15=L14⊕f(R14,K15),L15=R14。
同理类推:
得L=R0,R=L0。
其程序源代码与加密相同。
四.示例
例如:
已知明文m=learning,密钥k=computer。
明文m的ASCII二进制表示:
m=0110110001100101011000010111001001101110011010010110111001100111
密钥k的ASCII二进制表示:
k=0110001101101111011011010111000001110101011101000110010101110010
第一步:
明文m经过IP置换(初始置换):
IP
58/1
50/1
42/1
34/1
26/1
18/1
10/1
2/1
60/0
52/0
44/0
36/0
28/1
20/0
12/0
4/0
62/1
54/1
46/0
38/1
30/0
22/0
14/1
6/1
64/1
56/0
48/1
40/0
32/0
24/1
16/1
8/0
57/0
49/0
41/0
33/0
25/0
17/0
9/0
1/0
59/1
51/1
43/1
35/1
27/1
19/1
11/1
3/1
61/0
53/1
45/1
37/1
29/0
21/0
13/0
5/1
63/1
55/1
47/0
39/1
31/1
23/0
15/0
7/0
得到:
m’=1111111100001000110100111010011000000000111111110111000111011000
第二步:
迭代:
1.第1次迭代:
m’等分为左右两段:
L0=11111111000010001101001110100110
R0=00000000111111110111000111011000
(1)R0经过变换E(扩展置换E)后,扩展为48位。
E
32/0
1/0
2/0
3/0
4/0
5/0
4/0
5/0
6/0
7/0
8/0
9/1
8/0
9/1
10/1
11/1
12/1
13/1
12/1
13/1
14/1
15/1
16/1
17/0
16/1
17/0
18/1
19/1
20/1
21/0
20/1
21/0
22/0
23/0
24/1
25/1
24/1
25/1
26/1
27/0
28/1
29/1
28/1
29/1
30/0
31/0
32/0
1/0
R0’=000000000001011111111110101110100011111011110000
(2)生成子密钥K1
①k=0110001101101111011011010111000001110101011101000110010101110010经过PC-1(置换A):
PC-1
57/0
49/0
41/0
33/0
25/0
17/0
9/0
1/0
58/1
50/1
42/1
34/1
26/1
18/1
10/1
2/1
59/1
51/1
43/1
35/1
27/1
19/1
11/1
3/1
60/1
52/0
44/1
36/1
63/1
55/0
47/0
39/0
31/0
23/0
15/1
7/1
62/0
54/1
46/1
38/1
30/0
22/1
14/1
6/0
61/0
53/0
45/0
37/0
29/0
21/1
13/1
5/0
28/1
20/0
12/0
4/0
后,得到C0和D0:
C0=0000000011111111111111111011D0=1000001101110110000001101000
②C0和D0分别循环左移1位,得到C1和D1:
C1=0000000111111111111111110110D1=0000011011101100000011010001
③C1D1经过PC-2(置换B):
PC-2
14/1
17/1
11/1
24/1
1/0
5/0
3/0
28/0
15/1
6/0
21/1
10/1
23/1
19/1
12/1
4/0
26/1
8/1
16/1
7/0
27/1
20/1
13/1
2/0
41/1
52/1
31/0
37/1
47/0
55/0
30/0
40/0
51/0
45/0
33/0
48/0
44/0
49/1
39/1
56/1
34/1
53/0
46/0
42/1
50/1
36/0
29/0
32/0
得到K1:
K1=111100001011111011101110110100000000011110011000
(3)f函数运算
①R0’与K1异或运算
R0’⊕K1=000000000001011111111110101110100011111011110000⊕
111100001011111011101110110100000000011110011000
=111100001010100100010000011010100011100101101000
②S盒运算
将R0’⊕K1按6位一组分配给8个S盒,输出8×4位数S1-8:
S1(111100)=S1(10,1110)=S1(2,14)=5
S2(001010)=S2(00,0101)=S2(0,5)=11
S3(100100)=S3(10,0010)=S3(2,2)=4
S4(010000)=S4(00,1000)=S4(0,8)=1
S5(011010)=S5(00,1101)=S5(0,13)=0
S6(100011)=S6(11,0001)=S6(3,1)=3
S7(100101)=S7(11,0010)=S7(3,2)=13
S8(101000)=S8(10,0100)=S8(2,4)=9
S1-8=01011011010000010000001111011001
③S1-8经过P变换(压缩置换P)压缩:
P
16/1
7/1
20/0
21/0
29/1
12/0
28/1
17/0
1/0
15/0
23/1
26/1
5/1
18/0
31/0
10/1
2/1
8/1
24/1
14/0
32/1
27/0
3/0
9/0
19/0
13/0
30/0
6/0
22/0
11/0
4/1
25/1
输出32位f1(R0,K1)=11001010001110011110100000000011
(4)计算R1、L1,第一次迭代结束。
R1=L0⊕f1=11111111000010001101001110100110⊕
11001010001110011110100000000011
=00110101001100010011101110100101
L1=R0=R0=00000000111111110111000111011000
2.第2次迭代:
(1)R1经过变换E(扩展置换E)后,扩展为48位。
E
32/1
1/0
2/0
3/1
4/1
5/0
4/1
5/0
6/1
7/0
8/1
9/0
8/1
9/0
10/0
11/1
12/1
13/0
12/1
13/0
14/0
15/0
16/1
17/0
16/1
17/0
18/0
19/1
20/1
21/1
20/1
21/1
22/0
23/1
24/1
25/1
24/1
25/1
26/0
27/1
28/0
29/0
28/0
29/0
30/1
31/0
32/1
1/0
R1’=100110101010100110100010100111110111110100001010
(2)生成子密钥K2
①C1和D1分别循环左移1位,得到C2和D2:
C2=0000001111111111111111101100D2=0000110111011000000110100010
②C2D2经过PC-2(置换B):
PC-2
14/1
17/1
11/1
24/0
1/0
5/0
3/0
28/0
15/1
6/0
21/1
10/1
23/1
19/1
12/1
4/0
26/1
8/1
16/1
7/1
27/0
20/1
13/1
2/0
41/1
52/0
31/0
37/1
47/0
55/1
30/0
40/1
51/1
45/0
33/1
48/1
44/0
49/1
39/0
56/0
34/1
53/0
46/0
42/0
50/0
36/1
29/0
32/0
得到K2=111000001011111011110110100101011011010010000100
(3)f函数运算
①R1’与K2异或运算
R1’⊕K2=100110101010100110100010100111110111110100001010⊕
111000001011111011110110100101011011010010000100
=011110100001011101010100000010101100100110001110
②S盒运算
将R1’⊕K2按6位一组分配给8个S盒,输出8×4位数S1-8:
S1(011110)=S1(00,1111)=S1(0,15)=7
S2(100001)=S2(11,0000)=S2(3,0)=13
S3(011101)=S3(01,1110)=S3(1,14)=15
S4(010100)=S4(00,1010)=S4(0,10)=8
S5(000010)=S5(00,0001)=S5(0,1)=12
S6(101100)=S6(10,0110)=S6(2,6)=12
S7(100110)=S7(10,0011)=S7(2,3)=13
S8(001110)=S8(00,0111)=S8(0,7)=1
S1-8=01111101111110001100110011010001
③S1-8经过P变换(压缩置换P)压缩:
P
16/0
7/0
20/0
21/1
29/0
12/1
28/1
17/1
1/0
15/0
23/0
26/1
5/1
18/1
31/0
10/1
2/1
8/1
24/0
14/0
32/1
27/0
3/1
9/1
19/0
13/1
30/0
6/1
22/1
11/1
4/1
25/1
输出32位f2(R0,K1)=00010111000111011100101101011111
(3)计算R2、L2,第二次迭代结束。
R2=L1⊕f2=00000000111111110111000111011000⊕
00010111000111011100101101011111
=00010111111000101011101010000111
L2=R1=00110101001100010011101110100101
3.第3次迭代:
。
。
。
。
。
。
16.第16次迭代:
。
。
。
L16=01010000111001001101110110100011R16=01111101101010000100110001100001
第三步:
终结置换:
①R16与L16合并成64位(R16排在L16前面)m”:
m”=0111110110101000010011000110000101010000111001001101110110100011。
②m”经过置换IP-1(终结置换):
IP-1
40/0
8/1
48/0
16/0
56/1
24/0
64/1
32/1
39/0
7/0
47/0
15/0
55/0
23/0
63/1
31/0
38/0
6/1
46/1
14/0
54/1
22/1
62/0
30/0
37/0
5/1
45/0
13/1
53/1
21/1
61/0
29/0
36/1
4/1
44/0
12/0
52/1
20/0
60/0
28/0
35/0
3/1
43/1
11/1
51/0
19/0
59/1
27/1
34/1
2/1
42/1
10/0
50/1
18/1
58/0
26/1
33/0
1/0
41/1
9/1
49/1
17/0
57/1
25/0
得到密文:
0100101100000010011011000101110011001000011100111110110100111010
经过16次迭代后,所得结果为:
L1=00000000111111110111000111011000R1=00110101001100010011101110100101
L2=00110101001100010011101110100101R2=00010111111000101011101010000111
L3=00010111111000101011101010000111R3=00111110101100010000101110000100
L4=00111110101100010000101110000100R4=11110111110101111111101000111110
L5=11110111110101111111101000111110R5=10010110011001110100111111100101
L6=10010110011001110100111111100101R6=11001011001010000101110110100111
L7=11001011001010000101110110100111R7=01100011110011101000111011011001
L8=01100011110011101000111011011001R8=01001011110100001111001000000100
L9=01001011110100001111001000000100R9=00011101001101111010111011100001L
10=00011101001101111010111011100001R10=11101110111110111111010100000101L
11=111011*********11111010100000101R11=01101101111011011110010111111000
L12=011011011110110111100101111110