本文实例讲述了Python基于DES算法加密解密实现方法。分享给大家供大家参考。具体实现方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
#coding=utf-8
from functools import partial
import base64
class DES( object ):
"""
DES加密算法
interface: input_key(s, base=10), encode(s), decode(s)
"""
__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 ,
]
__ip1 = [
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 ,
]
__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 ,
]
__s = [
[
0xe , 0x4 , 0xd , 0x1 , 0x2 , 0xf , 0xb , 0x8 , 0x3 , 0xa , 0x6 , 0xc , 0x5 , 0x9 , 0x0 , 0x7 ,
0x0 , 0xf , 0x7 , 0x4 , 0xe , 0x2 , 0xd , 0x1 , 0xa , 0x6 , 0xc , 0xb , 0x9 , 0x5 , 0x3 , 0x8 ,
0x4 , 0x1 , 0xe , 0x8 , 0xd , 0x6 , 0x2 , 0xb , 0xf , 0xc , 0x9 , 0x7 , 0x3 , 0xa , 0x5 , 0x0 ,
0xf , 0xc , 0x8 , 0x2 , 0x4 , 0x9 , 0x1 , 0x7 , 0x5 , 0xb , 0x3 , 0xe , 0xa , 0x0 , 0x6 , 0xd ,
],
[
0xf , 0x1 , 0x8 , 0xe , 0x6 , 0xb , 0x3 , 0x4 , 0x9 , 0x7 , 0x2 , 0xd , 0xc , 0x0 , 0x5 , 0xa ,
0x3 , 0xd , 0x4 , 0x7 , 0xf , 0x2 , 0x8 , 0xe , 0xc , 0x0 , 0x1 , 0xa , 0x6 , 0x9 , 0xb , 0x5 ,
0x0 , 0xe , 0x7 , 0xb , 0xa , 0x4 , 0xd , 0x1 , 0x5 , 0x8 , 0xc , 0x6 , 0x9 , 0x3 , 0x2 , 0xf ,
0xd , 0x8 , 0xa , 0x1 , 0x3 , 0xf , 0x4 , 0x2 , 0xb , 0x6 , 0x7 , 0xc , 0x0 , 0x5 , 0xe , 0x9 ,
],
[
0xa , 0x0 , 0x9 , 0xe , 0x6 , 0x3 , 0xf , 0x5 , 0x1 , 0xd , 0xc , 0x7 , 0xb , 0x4 , 0x2 , 0x8 ,
0xd , 0x7 , 0x0 , 0x9 , 0x3 , 0x4 , 0x6 , 0xa , 0x2 , 0x8 , 0x5 , 0xe , 0xc , 0xb , 0xf , 0x1 ,
0xd , 0x6 , 0x4 , 0x9 , 0x8 , 0xf , 0x3 , 0x0 , 0xb , 0x1 , 0x2 , 0xc , 0x5 , 0xa , 0xe , 0x7 ,
0x1 , 0xa , 0xd , 0x0 , 0x6 , 0x9 , 0x8 , 0x7 , 0x4 , 0xf , 0xe , 0x3 , 0xb , 0x5 , 0x2 , 0xc ,
],
[
0x7 , 0xd , 0xe , 0x3 , 0x0 , 0x6 , 0x9 , 0xa , 0x1 , 0x2 , 0x8 , 0x5 , 0xb , 0xc , 0x4 , 0xf ,
0xd , 0x8 , 0xb , 0x5 , 0x6 , 0xf , 0x0 , 0x3 , 0x4 , 0x7 , 0x2 , 0xc , 0x1 , 0xa , 0xe , 0x9 ,
0xa , 0x6 , 0x9 , 0x0 , 0xc , 0xb , 0x7 , 0xd , 0xf , 0x1 , 0x3 , 0xe , 0x5 , 0x2 , 0x8 , 0x4 ,
0x3 , 0xf , 0x0 , 0x6 , 0xa , 0x1 , 0xd , 0x8 , 0x9 , 0x4 , 0x5 , 0xb , 0xc , 0x7 , 0x2 , 0xe ,
],
[
0x2 , 0xc , 0x4 , 0x1 , 0x7 , 0xa , 0xb , 0x6 , 0x8 , 0x5 , 0x3 , 0xf , 0xd , 0x0 , 0xe , 0x9 ,
0xe , 0xb , 0x2 , 0xc , 0x4 , 0x7 , 0xd , 0x1 , 0x5 , 0x0 , 0xf , 0xa , 0x3 , 0x9 , 0x8 , 0x6 ,
0x4 , 0x2 , 0x1 , 0xb , 0xa , 0xd , 0x7 , 0x8 , 0xf , 0x9 , 0xc , 0x5 , 0x6 , 0x3 , 0x0 , 0xe ,
0xb , 0x8 , 0xc , 0x7 , 0x1 , 0xe , 0x2 , 0xd , 0x6 , 0xf , 0x0 , 0x9 , 0xa , 0x4 , 0x5 , 0x3 ,
],
[
0xc , 0x1 , 0xa , 0xf , 0x9 , 0x2 , 0x6 , 0x8 , 0x0 , 0xd , 0x3 , 0x4 , 0xe , 0x7 , 0x5 , 0xb ,
0xa , 0xf , 0x4 , 0x2 , 0x7 , 0xc , 0x9 , 0x5 , 0x6 , 0x1 , 0xd , 0xe , 0x0 , 0xb , 0x3 , 0x8 ,
0x9 , 0xe , 0xf , 0x5 , 0x2 , 0x8 , 0xc , 0x3 , 0x7 , 0x0 , 0x4 , 0xa , 0x1 , 0xd , 0xb , 0x6 ,
0x4 , 0x3 , 0x2 , 0xc , 0x9 , 0x5 , 0xf , 0xa , 0xb , 0xe , 0x1 , 0x7 , 0x6 , 0x0 , 0x8 , 0xd ,
],
[
0x4 , 0xb , 0x2 , 0xe , 0xf , 0x0 , 0x8 , 0xd , 0x3 , 0xc , 0x9 , 0x7 , 0x5 , 0xa , 0x6 , 0x1 ,
0xd , 0x0 , 0xb , 0x7 , 0x4 , 0x9 , 0x1 , 0xa , 0xe , 0x3 , 0x5 , 0xc , 0x2 , 0xf , 0x8 , 0x6 ,
0x1 , 0x4 , 0xb , 0xd , 0xc , 0x3 , 0x7 , 0xe , 0xa , 0xf , 0x6 , 0x8 , 0x0 , 0x5 , 0x9 , 0x2 ,
0x6 , 0xb , 0xd , 0x8 , 0x1 , 0x4 , 0xa , 0x7 , 0x9 , 0x5 , 0x0 , 0xf , 0xe , 0x2 , 0x3 , 0xc ,
],
[
0xd , 0x2 , 0x8 , 0x4 , 0x6 , 0xf , 0xb , 0x1 , 0xa , 0x9 , 0x3 , 0xe , 0x5 , 0x0 , 0xc , 0x7 ,
0x1 , 0xf , 0xd , 0x8 , 0xa , 0x3 , 0x7 , 0x4 , 0xc , 0x5 , 0x6 , 0xb , 0x0 , 0xe , 0x9 , 0x2 ,
0x7 , 0xb , 0x4 , 0x1 , 0x9 , 0xc , 0xe , 0x2 , 0x0 , 0x6 , 0xa , 0xd , 0xf , 0x3 , 0x5 , 0x8 ,
0x2 , 0x1 , 0xe , 0x7 , 0x4 , 0xa , 0x8 , 0xd , 0xf , 0xc , 0x9 , 0x0 , 0x3 , 0x5 , 0x6 , 0xb ,
],
]
__k1 = [
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 ,
]
__k2 = [
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 ,
]
__k0 = [
1 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 1 ,
]
__hex_bin = {
'0' : '0000' , '1' : '0001' , '2' : '0010' , '3' : '0011' ,
'4' : '0100' , '5' : '0101' , '6' : '0110' , '7' : '0111' ,
'8' : '1000' , '9' : '1001' , 'a' : '1010' , 'b' : '1011' ,
'c' : '1100' , 'd' : '1101' , 'e' : '1110' , 'f' : '1111' ,
' ' : '0000'
}
__re = lambda t, s: ''.join(s[i - 1 ] for i in t)
__IP = partial(__re, __ip)
__IP1 = partial(__re, __ip1)
__E = partial(__re, __e)
__P = partial(__re, __p)
__K1 = partial(__re, __k1)
__K2 = partial(__re, __k2)
__B = partial( lambda hex_bin, s: ''.join(hex_bin[w]
for w in ' '.join(' % 2x ' % ord (w) for w in s))
, __hex_bin)
__DB = partial( lambda s: ''.join( chr ( int (s[i:i + 8 ], 2 )) for i in range ( 0 , len (s), 8 )))
__S = partial( lambda hex_bin, __s, s: ' '.join(hex_bin[' % x' % __s[i][
int (s[i * 6 ] + s[i * 6 + 5 ], 2 ) * 16 + int (s[i * 6 + 1 :i * 6 + 5 ], 2 )]] for i in range ( 8 ))
, __hex_bin, __s)
__F = partial( lambda s, k: ' '.join(' 0 ' if s[i]==k[i] else ' 1 ' for i in range ( len (s))))
__K0 = partial( lambda k0, K2, k: map (K2,
(k[k0[i]: 28 ] + k[ 0 :k0[i]] + k[k0[i] + 28 : 56 ] + k[ 28 :k0[i] + 28 ] for i in range ( 16 )))
, __k0, __K2)
__K = partial( lambda K1, K0, k: K0(K1(k))
, __K1, __K0)
def __init__( self ):
pass
def input_key( self , key, base = 10 ):
if base = = 2 :
pass
elif base = = 16 :
key = ''.join( self .__class__.__hex_bin[w] for w in key)
else :
key = self .__class__.__B(key)
self .__k = self .__class__.__K(key)
def __code( self , s, k):
s = self .__IP(s)
l, r = s[ 0 : 32 ], s[ 32 : 64 ]
for i in range ( 16 ):
r_t = r
r = self .__E(r)
r = self .__F(r, k[i])
r = self .__S(r)
r = self .__P(r)
r = self .__F(r, l)
l = r_t
return self .__class__.__IP1(r + l)
def encode( self , s):
a = ''
s + = ' ' * (( 8 - len (s) % 8 ) % 8 )
for i in range ( 0 , len (s), 8 ):
before = self .__class__.__B(s[i:i + 8 ])
after = self .__code(before, self .__k)
a + = '%16x' % int (after, 2 )
return ' '.join(w if w!=' ' else ' 0 ' for w in a)
def decode( self , s):
a = ''
s.lower()
for i in range ( 0 , len (s), 16 ):
before = ''.join( self .__class__.__hex_bin[s[j]] for j in range (i, i + 16 ))
after = self .__code(before, self .__k[:: - 1 ])
a + = self .__class__.__DB(after)
return a.rstrip().decode( 'utf-8' )
if __name__ = = '__main__' :
d = DES()
d.input_key( '123456789' )
s = '再来一段中文'
a = d.encode(s)
print a
b = d.decode(a)
print b
|
希望本文所述对大家的Python程序设计有所帮助。