一、DES简介
- DES算法属于分组加密算法
- 信息按照固定长度进行分组,分组长度为64位
- 混淆和扩散是它采用的两个最重要的安全特性
- 混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。
- 扩散是指明文和密钥中的每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码的安全。
需要注意的地方是掌握DES算法的16轮加、解密流程以及子密钥的产生流程。
二、DES实现大纲
在我的另一篇博客《加密算法之对称加密–DES》已经提到过DES算法的大致过程,整个流程如下图:
为了深入理解整个流程,我们将细化讲解DES算法里十六轮迭代变化中的子密钥生成以及F函数。
三、DES算法之子密钥生成
1. 子密钥生成流程
流程图
子密钥置换选择1(把64位的密钥变为56位长)
假设原密钥为 K s = k 1 , k 2 , k 3 , . . . . . . , k 64 K_s= k_1,k_2,k_3,......,k_{64} Ks=k1,k2,k3,......,k64
DES算法的实际密钥长度为56,因为64位原密钥每8位的最后一位,即第8,16,24,32,40,48,56,64位为校验位。通过如下的置换规则,将实际的 56 56 56为位密钥选择出来并置乱:
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 \begin{array}{lllllll} 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 \end{array} 57110196371421495821155626134150593475461533425160394653282534435231384520172635442330371291827361522294
因此通过置换选择1之后,56位密钥为 K s ′ = k 1 , k 2 , k 3 . . . . . . k 56 K_{s' }= k_1,k_2,k_3......k_{56} Ks′=k1,k2,k3......k56,其中 k 1 = K s [ 57 ] , k 2 = K s [ 49 ] , k 3 = K s [ 41 ] , . . . . . . k 56 = K s [ 4 ] k_1 = K_{s[57]}, k_2 = K_{s[49]},k_3 = K_{s[41]},......k_{56} = K_{s[4]} k1=Ks[57],k2=Ks[49],k3=Ks[41],......k56=Ks[4]。
子密钥迭代变换
实际密钥 K s ′ = k 1 , k 2 , k 3 . . . . . . k 56 K_{s' }= k_1,k_2,k_3......k_{56} Ks′=k1,k2,k3......k56
(1)分组:将56位实际密钥分为Ci和Di两组
- C i = k 1 , k 2 , . . . . . . , k 28 C_i = k_1,k_2,......,k_{28} Ci=k1,k2,......,k28
- D i = k 29 , k 30 , . . . . . . k 56 D_i = k_{29},k_{30},......k_{56} Di=k29,k30,......k56
(2)循环移位(左移)
- 移位判断表:
1 1 9 1 2 1 10 2 3 2 11 2 4 2 12 2 5 2 13 2 6 2 14 2 7 2 15 2 8 2 16 1 \begin{array}{llll} 1 & 1 & 9 & 1 \\ 2 & 1 & 10 & 2 \\ 3 & 2 & 11 & 2 \\ 4 & 2 & 12 & 2 \\ 5 & 2 & 13 & 2 \\ 6 & 2 & 14 & 2 \\ 7 & 2 & 15 & 2 \\ 8 & 2 & 16 & 1 \end{array} 123456781122222291011121314151612222221
第一列和第三列代表迭代次数,第二列和第四列代表对应的循环左移位数。 - 第1,2,9,16轮迭代时循环左移一位,其余循环左移两位
- 最终得到:
- 循环左移一位: C i ′ = k 2 , k 3 , . . . . . . k 28 , k 1 ; D i ′ = K 30 , k 31 , . . . . . . k 56 , k 29 C_{i'}=k_2,k_3,......k_{28},k_1;D_{i'}=K_{30},k_{31},......k_{56},k_{29} Ci′=k2