本文实例讲述了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程序设计有所帮助。