4. 数据加密标准(DES)
(Data Encryption Standard)
4.1 分组密码概述
一、分组密码体制的设计有下面的技术要求:
(1)分组长度m要足够大,以防止明文穷举的攻击。
(2)密钥量应足够大,以防止密钥穷举的攻击。
(3)密码的法足够复杂,使破译者除了采用穷举法攻击以外,找不到其它简洁的数字破译算法。
二.密文块的长度与明文块长度间关系。
4.2 数据加密标准(DES)
一、DES加密算法简介
二、DES加密算法的粗框
以每一个明文块的加密过程为例给出DES加密的过程,简单的用一句话可概述这个加密过程:将64bit的明文块在56bit的密钥控制下变换为64bit的密文块,其加密过程包括16次选代(即16圈)每次选代都由替代和移位的复合而形成的。
粗框说明
第i圈:
输入:L(i-1) R(i-1)
输出:L(i)=R(i-1) R(i)=gk(i)(R(i-1))Å L(i-1)
或令Pi-1= gk(i)(R(i-1))
则R(i)=P i -1 Å L(i-1)
R(i)= gk(i) ( L(i-1))Å L(i-1)
逆初始置换(IP) |
密文块y= y1y2…y64 |
L(16) |
R(16) |
K(16) |
L(16)=l1(16),…,l32(16) |
R(16)=r1(16),…,r32(16) |
g |
R(15)=r1(15),…,r32(15)
|
L(15)=l1(15),…,l32(15) |
R(2)=r1(2),…,r32(2) |
L(2)=l1(2),…,l32(2)
|
g |
R(1)=r1(1),…,r32(1) |
L(1)=l1(1),…,l32(1) |
g |
K(1) |
初始置换IP |
明文块 X=x1 x2。。。。。。。。x 64 |
简单移位变换 |
L(0)=l1(0),…,l32(0) |
R(0)=r1(0),…,r32(0) |
K(2) |
三、DES加密算法的详细说明
1、内部密钥的派生
对于每一个明文信息,其加密过程要给定一个56位的密钥K来确定明—密文块的对应关系,16个内部密钥K(1),K(2),…,K(16)如何由给定的密钥K(外部密钥)产生,其过程如下:
外部密钥K=K1 K2…K64 |
置换选择1 PC-1 |
C0 |
D0 |
循环左移h(1)位 |
循环左移h(1)位 |
C1 |
D1 |
循环左移h(2)位 |
循环左移h(2)位 |
置换选择2 PC----2 |
K(1) |
C2 |
D2 |
PC-----2 |
K(2) |
C15 |
D15 |
置换选择2 PC----2 |
K(15) |
循环左移h(16)位 |
循环左移h(16)位 |
C16 |
D16 |
置换选择2 PC----2 |
K(16) |
内部密钥产生过程 |
表1 对应不同i的左循环移位位数
选代次数i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
左移位数h(i) | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 1 |
置换选择1
(1) PC-1的作用是将外部密钥剩下的56位分成两个部分,称为左半部分C0和右半部分D0,各具28位。具体分割算法如下:
左半部分
C0 = K57 K49 K41 K33 K25 K17 K9 K1
K58 K50 K42 K34 K26 K18 K10 K 2
K59 K51 K43 K35 K27 K19 K11 K3
K60 K52 K44 K36
右半部分
D0 = K63 K55 K47 K39 K31 K23 K15 K7
K62 K54 K46 K38 K30 K22 K14 K6
K61 K53 K45 K37 K29 K21 K13 K5
K28 K20 K12 K4
分划的规则是什么呢?也就是说K中哪些位属于C0,哪些位属于D0。如何确定呢?有什么规律呢?
我们用下面的方法来描述它的分划原则:
将外部密钥K= K1 K2…K64的各位排成8行8列的矩阵。
① ② ③ ④ ⑤ ⑥ ⑦ ⑧
K1 K 2 K3 K4 K5 K6 K7 K8
K9 K10 K11 K12 K13 K14 K15 K16
K17 K18 K19 K20 K21 K22 K23 K24
K25 K25 K27 K28 K29 K30 K31 K32
K33 K34 K35 K36 K37 K38 K39 K40
K41 K42 K43 K44 K45 K46 K47 K48
K49 K50 K51 K52 K53 K54 K55 K56
K57 K58 K59 K60 K61 K62 K63 K64
(2) C0 和D0生成后,生成K(1)按如下步骤进行
(a) 将C0 和D0各循环左移h(1)=1位,分别得到C1和D1
(b) 通过置换选择2(PC-2),将56位的向量(C1,D1)变成48位的密钥
向量 K(1)。
置换选择2(PC-2)
假设C=c 1c 2 ¼ c28 D=d29d30¼d56
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
K(1)= C 14 C 17 C 11 C 24 C 1 C 5 C 3 C 28 C 15 C 6 C 21 C 10
C 23 C 19 C 12 C 4 C 26 C 8 C 16 C 7 C 27 C 20 C 13 C 2
d41 d52 d31 d37 d47 d55 d30 d40 d51 d45 d33 d48
d44 d49 d39 d56 d34 d53 d46 d42 d50 d36 d29 d32
(3) Ci-1 和D i-1生成后,生成K(i)的步骤与(2)相同
(a) 将Ci-1 和D i-1各循环左移h(i)位,分别得到Ci 和 D i
左移位数h(i)随着i的不同,而有所差异(见表1)
(b) 通过置换选择2将56位的向量(Ci D i)变换成48位的密钥向量K(i)
K(i)=K1(i)K2(i)…K24(i)K25(i)…K48(i)。
DES进入加密算法之前,首先必须将内部密钥K(1),…K(16)派生
出来。
2、 初始置换IP:
初始置换的作用是将64位的明文块 X 分成两部分,左半部分L(0)
和右半部分R(0),每一部分均匀为32位。具体分法是:
L(0)=X58 X50 X42 X34 X26 X18 X10 X2
X60 X52 X44 X36 X28 X20 X12 X4
X62 X54 X46 X38 X30 X22 X14 X6
X64 X56 X48 X40 X32 X24 X16 X8
R(0)= X57 X49 X41 X33 X25 X17 X9 X1
X59 X51 X43 X35 X27 X19 X11 X3
X61 X53 X45 X37 X29 X21 X13 X5
X63 X55 X47 X39 X31 X23 X15 X7
分割的规则是什么呢?亦即如何确定L(0)和R(0)各是由些什么位组成,按什么样的次序组成呢?下面介绍生成L(0)和R(0)的方法。
将明文块X=X1X2…X64排成8行8列的矩阵(如下)
R(0)
① ③ ⑤ ⑦
X1 X2 X3 X4 X5 X6 X7 X8
X9 X10 X11 X12 X13 X14 X15 X16
X17 X18 X19 X20 X21 X22 X23 X24
X25 X25 X27 X28 X29 X30 X31 X32
X33 X34 X35 X36 X37 X38 X39 X40
X41 X42 X43 X44 X45 X46 X47 X48
X49 X50 X51 X52 X53 X54 X55 X56
X57 X58 X59 X60 X61 X62 X63 X64
② ④ ⑥ ⑧
L(0)
3、 逆初始置换(IP-1)
两个32bit的予输出数据块R(16),L(16)要经过逆初始置换,才能产生出真正的64bit的密文块y=y1 y1…y64
假设R(16),L(16)=r1(16)r2(16)…r32(16),l1(16) l2(16)…l32(16)
简记作 R(16)=r1 r2 r3 r4 r5 r6 r7 r8
r9 r10 r11 r12 r13 r14 r15 r16
r17 r18 r19 r20 r21 r22 r23 r24
r25 r26 r27 r28 r29 r30 r30 r32
L(16)= l 1 l 2 l 3 l 4 l 5 l 6 l 7 l 8
l 9 l 10 l 11 l 12 l 13 l 14 l 15 l 16
l 17 l 18 l 19 l 20 l 21 l 22 l 23 l 24
l 25 l 26 l 27 l 28 l 29 l 30 l 31 l 32
l8 r 8 l 16 r 16 l 24 r 24 l 32 r32
l7 r 7 l 15 r 15 l 23 r 223 l 31 r31
l6 r 6 l 14 r 14 l 22 r 22 l 30 r30
l5 r 5 l 13 r 13 l 21 r 21 l 29 r29
l4 r 4 l 12 r 12 l 20 r 20 l 28 r28
l3 r 3 l 11 r 11 l 19 r 19 l 27 r27
l2 r 2 l 10 r 10 l 18 r 18 l 26 r26
l1 r 1 l 9 r 9 l 17 r 17 l 25 r25
初始置换与逆初始置换的比较:
初始置换:
明文块X= X1X2…X 64 L (0)R(0)
(1)将X按行的自然递增次序逐位填入8*8矩阵的各行中。
(2)在矩阵中按照从上至下的方式依次取出2、4、6、8列中的元素构成左半部L(0)的32bit
(3)在矩阵中按照从下至上的方式依次取出1、3、5、7列中的元素构成右半部R(0)的32bit。
逆初始置换:
R(16),L(16)=密文块y=y 1y 2… y64
(2)将左半部R(16)的32bit按照(2)中取出的方式逐位还原填入矩阵的2、4、6、8列中;
(4)将右半部L(16)的32bit按照(3)中取出的方式逐位还原填入矩阵的1、3、5、7列中。
(5)将8*8矩阵中的元素按照行的自然递增顺序逐位取出。
四、 加密函数g的详细说明 (这是DES的核心部分)
R(i-1) |
1、
E扩展 E(R(i-1)) |
A=E(R(i-1) K(i) |
S1 |
S8 |
B |
P(B) |
R(i)=L(i-1)+P(B) |
E 扩展
R(i-1)是32位,E扩展将它扩展为48位的E(R(i-1)),其扩展算法如下:
设R(i-1)=r1r2r3… r31r32
将其分成8组,每4位一组(每一组扩展成6位)。
r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16
r32 r1 r2 r3 r4 r5 r4 r5 r6 r7 r8 r9 r8 r9 r10 r11 r12 r13 r12 r13 r14 r15 r16 r17
r16 r17 r18 r19 r20 r21 r20 r21 r22 r23 r24 r25 r24 r25 r26 r27 r28 r29 r28 r29 r30 r30 r32 r1
则E(R(i-1))= r32 r1 r2 r3 r4 r5 r6 r7 r8 r9
r8 r9 r10 r11 r12 r13 r14 r15 r16 r17
r16 r17 r18 r19 r20 r21 r22 r23 r24 r25
r24 r25 r26 r27 r28 r29 r30 r30 r32 r1
2、替代运算(S盒)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
| 0 | 14 | 4 | 13 | 1 | 2 | 15 | 11 | 8 | 3 | 10 | 6 | 12 | 5 | 9 | 0 | 7 |
S1 | 1 2 3 | 0 | 15 | 7 | 4 | 14 | 2 | 13 | 1 | 10 | 6 | 12 | 11 | 9 | 5 | 3 | 8 |
4 | 1 | 14 | 8 | 13 | 6 | 2 | 11 | 15 | 12 | 9 | 7 | 3 | 10 | 5 | 0 | ||
15 | 12 | 8 | 2 | 4 | 9 | 1 | 7 | 5 | 11 | 3 | 14 | 10 | 0 | 6 | 13 |
3、P置换(移位变换)
设B= b1b2… b32
则P(B)= b16 b7 b20 b21 b29 b12 b28 b17
b1 b15 b23 b26 b5 b18 b31 b10
b2 b8 b24 b14 b32 b27 b3 b9
b19 b13 b30 b6 b22 b11 b4 b25
DES解脱密算
一、DES脱密算法
(1)一个64bit的数据块分成两个32位的数据块
(2)逆初始置换:是将两个32位的数据合并成一个64位的数据块合并的方法是(例如XL XR)逆初始置换是初始置换的逆变换。
X |
初始置换 |
XL XR
初始置换 |
X
因为初始置换将明文块X=X1 X2 … X64 分成了L(0),R(0),所以必可将L(0),R(0)合并成X=X1 X2 … X64 。
(3)每一圈输出与输入的关系
每一圈中输出对输入的一个函数依赖关系。
L(i)=R(i-1)…(1) (i=1,2,…,16)
R(i)=L(i-1) gK(i)(R(i-1))…(2)
2、进行第一圈脱密时,R(16)C (由脱密过程的推图的第一圈)
R(16)=L(15) gK(16)(L(15))=L(15) gK(16)(L(16))
由异或运算的性质(若A B=C则B C=A A C=B)可得
DES脱密算法
密文块y=y1y2 … y64 |
初始置换 |
R(16) |
L(16) |
g |
k(16)
L(15) |
R(15) |
g |
k(15)
g |
L(1) |
R(1) |
R(14)
|
L(14) |
k(1)
R(0) |
L(0) |
R(0) |
L(0)
|
逆初始置换 |
明文块X=X1X2 … Xn
|