DES加密算法 + python代码
DES加密算法原理
1. 初始置换
(a) 初始置换 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
(b) 逆初始置换 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
© 选择拓展运算 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
(d) 置换运算 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
2. 轮结构
下图是DES加密算法的轮结构
每轮的变换可由如下公式表示:
L
i
=
R
i
−
1
R
i
=
L
i
−
1
⊕
F
(
R
i
−
1
,
K
i
)
L_i = R_{i-1}\\ R_i = L_{i-1} \oplus F\,(R_{i-1},\ K_i)
L i = R i − 1 R i = L i − 1 ⊕ F ( R i − 1 , K i )
其中,Ki 为48比特,函数F(R,K) 为 32比特明文经E拓展为48比特后,与置换选择2后的48比特密钥进行异或运算,再经过s盒以及P置换后的结果。
对于S盒,有6比特输入,第1和第6比特形成的2进制数用于选定行,中间四个比特用来选定列。
3. 密钥的产生
(a) 置换选择 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
(b) 置换选择 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
© 左循环移位位数
轮数 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
4. 解密
和 Feistel 密码一样,DES 的解密和加密使用同一算法,但子密钥使用的顺序相反。
代码部分:
Creat_Key.py
MaxTime = 16
PC_table1= [ 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 ]
PC_table2= [ 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 ]
def Listmove ( l, step) :
return l[ step: ] + l[ : step]
def Subkey ( key) :
keyresult = [ ]
key0 = [ 0 for i in range ( 56 ) ]
for i in range ( len ( PC_table1) ) :
key0[ i] = key[ PC_table1[ i] - 1 ]
for i in range ( MaxTime) :
key1 = [ 0 for i in range ( 48 ) ]
if ( i == 0 or i == 1 or i == 8 or i == 15 ) :
step = 1
else :
step = 2
tmp1 = key0[ 0 : 28 ]
tmp2 = key0[ 28 : 56 ]
tmp1 = Listmove( tmp1, step)
tmp2 = Listmove( tmp2, step)
key0 = tmp1 + tmp2
for i in range ( len ( PC_table2) ) :
key1[ i] = key0[ PC_table2[ i] - 1 ]
keyresult. append( key1)
return keyresult
F_Func.py
MaxTime = 16
IP_table= [ 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 ]
Inv_IP_table= [ 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 ]
S1= [ 14 , 4 , 13 , 1 , 2 , 15 , 11 , 8 , 3 , 10 , 6 , 12 , 5 , 9 , 0 , 7 ,
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 ]
S2= [ 15 , 1 , 8 , 14 , 6 , 11 , 3 , 4 , 9 , 7 , 2 , 13 , 12 , 0 , 5 , 10 ,
3 , 13 , 4 , 7 , 15 , 2 , 8 , 14 , 12 , 0 , 1 , 10 , 6 , 9 , 11 , 5 ,
0 , 14 , 7 , 11 , 10 , 4 , 13 , 1 , 5 , 8 , 12 , 6 , 9 , 3 , 2 , 15 ,
13 , 8 , 10 , 1 , 3 , 15 , 4 , 2 , 11 , 6 , 7 , 12 , 0 , 5 , 14 , 9 ]
S3= [ 10 , 0 , 9 , 14 , 6 , 3 , 15 , 5 , 1 , 13 , 12 , 7 , 11 , 4 , 2 , 8 ,
13 , 7 , 0 , 9 , 3 , 4 , 6 , 10 , 2 , 8 , 5 , 14 , 12 , 11 , 15 , 1 ,
13 , 6 , 4 , 9 , 8 , 15 , 3 , 0 , 11 , 1 , 2 , 12 , 5 , 10 , 14 , 7 ,
1 , 10 , 13 , 0 , 6 , 9 , 8 , 7 , 4 , 15 , 14 , 3 , 11 , 5 , 2 , 12 ]
S4= [ 7 , 13 , 14 , 3 , 0 , 6 , 9 , 10 , 1 , 2 , 8 , 5 , 11 , 12 , 4 , 15 ,
13 , 8 , 11 , 5 , 6 , 15 , 0 , 3 , 4 , 7 , 2 , 12 , 1 , 10 , 14 , 9 ,
10 , 6 , 9 , 0 , 12 , 11 , 7 , 13 , 15 , 1 , 3 , 14 , 5 , 2 , 8 , 4 ,
3 , 15 , 0 , 6 , 10 , 1 , 13 , 8 , 9 , 4 , 5 , 11 , 12 , 7 , 2 , 14 ]
S5= [ 2 , 12 , 4 , 1 , 7 , 10 , 11 , 6 , 8 , 5 , 3 , 15 , 13 , 0 , 14 , 9 ,
14 , 11 , 2 , 12 , 4 , 7 , 13 , 1 , 5 , 0 , 15 , 10 , 3 , 9 , 8 , 6 ,
4 , 2 , 1 , 11 , 10 , 13 , 7 , 8 , 15 , 9 , 12 , 5 , 6 , 3 , 0 , 14 ,
11 , 8 , 12 , 7 , 1 , 14 , 2 , 13 , 6 , 15 , 0 , 9 , 10 , 4 , 5 , 3 ]
S6= [ 12 , 1 , 10 , 15 , 9 , 2 , 6 , 8 , 0 , 13 , 3 , 4 , 14 , 7 , 5 , 11 ,
10 , 15 , 4 , 2 , 7 , 12 , 9 , 5 , 6 , 1 , 13 , 14 , 0 , 11 , 3 , 8 ,
9 , 14 , 15 , 5 , 2 , 8 , 12 , 3 , 7 , 0 , 4 , 10 , 1 , 13 , 11 , 6 ,
4 , 3 , 2 , 12 , 9 , 5 , 15 , 10 , 11 , 14 , 1 , 7 , 6 , 0 , 8 , 13 ]
S7= [ 4 , 11 , 2 , 14 , 15 , 0 , 8 , 13 , 3 , 12 , 9 , 7 , 5 , 10 , 6 , 1 ,
13 , 0 , 11 , 7 , 4 , 9 , 1 , 10 , 14 , 3 , 5 , 12 , 2 , 15 , 8 , 6 ,
1 , 4 , 11 , 13 , 12 , 3 , 7 , 14 , 10 , 15 , 6 , 8 , 0 , 5 , 9 , 2 ,
6 , 11 , 13 , 8 , 1 , 4 , 10 , 7 , 9 , 5 , 0 , 15 , 14 , 2 , 3 , 12 ]
S8= [ 13 , 2 , 8 , 4 , 6 , 15 , 11 , 1 , 10 , 9 , 3 , 14 , 5 , 0 , 12 , 7 ,
1 , 15 , 13 , 8 , 10 , 3 , 7 , 4 , 12 , 5 , 6 , 11 , 0 , 14 , 9 , 2 ,
7 , 11 , 4 , 1 , 9 , 12 , 14 , 2 , 0 , 6 , 10 , 13 , 15 , 3 , 5 , 8 ,
2 , 1 , 14 , 7 , 4 , 10 , 8 , 13 , 15 , 12 , 9 , 0 , 3 , 5 , 6 , 11 ]
S= [ S1, S2, S3, S4, S5, S6, S7, S8]
extend_table= [ 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 ]
P_table= [ 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 ]
def int2bit ( n) :
a= [ ]
for i in range ( 0 , 4 ) :
a. insert( 0 , str ( n% 2 ) )
n= int ( n/ 2 )
return a
def IP ( text, op) :
tmp = [ 0 for i in range ( 64 ) ]
if op == 0 :
for i in range ( 64 ) :
tmp[ i] = text[ IP_table[ i] - 1 ]
return tmp
if op == 1 :
for i in range ( 64 ) :
tmp[ i] = text[ Inv_IP_table[ i] - 1 ]
return tmp
def Extend ( text) :
extend = [ 0 for i in range ( 48 ) ]
for i in range ( 48 ) :
extend[ i] = text[ extend_table[ i] - 1 ]
return extend
def S_replace ( text) :
Sresult = [ 0 for k in range ( 32 ) ]
for k in range ( 8 ) :
row = 2 * int ( text[ k* 6 ] ) + int ( text[ k* 6 + 5 ] )
column = 8 * int ( text[ k* 6 + 1 ] ) + 4 * int ( text[ k* 6 + 2 ] ) + 2 * int ( text[ k* 6 + 3 ] ) + int ( text[ k* 6 + 4 ] )
tmp = S[ k] [ row* 16 + column]
for i in range ( 4 ) :
Sresult[ 4 * k + i] = int2bit( tmp) [ i]
return Sresult
def P_replace ( text) :
Presult = [ 0 for i in range ( 32 ) ]
for i in range ( 32 ) :
Presult[ i] = text[ P_table[ i] - 1 ]
return Presult
def Xor ( bit1, bit2) :
Xorresult = [ 0 for i in range ( len ( bit1) ) ]
for i in range ( len ( bit1) ) :
Xorresult[ i] = str ( int ( bit1[ i] ) ^ int ( bit2[ i] ) )
return Xorresult
DES_main
import Create_Key as cs
import F_Func as f
def Hex2bin ( text) :
result = [ ]
for i in range ( len ( text) ) :
result. extend( f. int2bit( int ( text[ i] , 16 ) ) )
return result
def bin2Hex ( text) :
result = [ ]
q = len ( text) // 4
for i in range ( q) :
dec = int ( text[ 4 * i] ) * 8 + int ( text[ 4 * i+ 1 ] ) * 4 + int ( text[ 4 * i+ 2 ] ) * 2 + int ( text[ 4 * i+ 3 ] ) * 1
x = hex ( dec) [ 2 : ] . upper( )
result. extend( x)
rs = '' . join( result)
return rs
def Encryption ( text, key) :
keylist = cs. Subkey( keybit)
text1 = f. IP( text, 0 )
L = [ text1[ i] for i in range ( 32 ) ]
R = [ text1[ i] for i in range ( 32 , 64 ) ]
for i in range ( 16 ) :
tmp = R
tmp = f. Extend( tmp)
tmp = f. Xor( tmp, keylist[ i] )
tmp = f. S_replace( tmp)
tmp = f. P_replace( tmp)
tmp = f. Xor( tmp, L)
L = R
R = tmp
L, R = R, L
ctext = L
ctext. extend( R)
ctext = f. IP( ctext, 1 )
return bin2Hex( ctext)
def Decryption ( text, key) :
keylist = cs. Subkey( keybit)
text1 = f. IP( text, 0 )
L = [ text1[ i] for i in range ( 32 ) ]
R = [ text1[ i] for i in range ( 32 , 64 ) ]
for i in range ( 16 ) :
tmp = R
tmp = f. Extend( tmp)
tmp = f. Xor( tmp, keylist[ 15 - i] )
tmp = f. S_replace( tmp)
tmp = f. P_replace( tmp)
tmp = f. Xor( tmp, L)
L = R
R = tmp
L, R = R, L
ctext = L
ctext. extend( R)
ctext = f. IP( ctext, 1 )
return bin2Hex( ctext)
if __name__ == '__main__' :
plaintext = input ( '请输入用十六进制表示的明文:' )
key = input ( '请输入用十六进制表示的密钥:' )
ptext = Hex2bin( plaintext)
keybit = Hex2bin( key)
print ( '输出的密文为:' + Encryption( ptext, keybit) )
Encryptext = Encryption( ptext, keybit)
ptext = Hex2bin( Encryptext)
keybit = Hex2bin( key)
print ( '解出的明文为:' + Decryption( ptext, keybit) )
个人博客:qinquanquan.com