1
2
3
4
5
6
7
8
9
10
11 """ this module supposedly emulates the unix crypt() routine.
12
13 don't ask me how it works, because I have no clue. I just
14 ported Crypt::UnixCrypt from perl into python.. :)
15
16 encryptedtext = crypt(plaintext, salt)
17
18 NOTE: supposedly, it doesn't work the same way unix does
19 when salt is not in [A-Za-z0-9./]{2}
20
21 0423.2000: I CAN't get this working. I'm going to try
22 porting Crypt::PasswdMD5...
23 """
24
25 ITERATIONS = 16
26
27 con_salt = (
28 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
29 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
34 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
35 0x0A, 0x0B, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
36 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12,
37 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
38 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22,
39 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24,
40 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C,
41 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34,
42 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C,
43 0x3D, 0x3E, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,)
44
45 shifts2 = (
46 0, 0, 1, 1, 1, 1, 1, 1,
47 0, 1, 1, 1, 1, 1, 1, 0,)
48
49 skb0 = (
50
51 0x00000000, 0x00000010, 0x20000000, 0x20000010,
52 0x00010000, 0x00010010, 0x20010000, 0x20010010,
53 0x00000800, 0x00000810, 0x20000800, 0x20000810,
54 0x00010800, 0x00010810, 0x20010800, 0x20010810,
55 0x00000020, 0x00000030, 0x20000020, 0x20000030,
56 0x00010020, 0x00010030, 0x20010020, 0x20010030,
57 0x00000820, 0x00000830, 0x20000820, 0x20000830,
58 0x00010820, 0x00010830, 0x20010820, 0x20010830,
59 0x00080000, 0x00080010, 0x20080000, 0x20080010,
60 0x00090000, 0x00090010, 0x20090000, 0x20090010,
61 0x00080800, 0x00080810, 0x20080800, 0x20080810,
62 0x00090800, 0x00090810, 0x20090800, 0x20090810,
63 0x00080020, 0x00080030, 0x20080020, 0x20080030,
64 0x00090020, 0x00090030, 0x20090020, 0x20090030,
65 0x00080820, 0x00080830, 0x20080820, 0x20080830,
66 0x00090820, 0x00090830, 0x20090820, 0x20090830,)
67
68 skb1 = (
69
70 0x00000000, 0x02000000, 0x00002000, 0x02002000,
71 0x00200000, 0x02200000, 0x00202000, 0x02202000,
72 0x00000004, 0x02000004, 0x00002004, 0x02002004,
73 0x00200004, 0x02200004, 0x00202004, 0x02202004,
74 0x00000400, 0x02000400, 0x00002400, 0x02002400,
75 0x00200400, 0x02200400, 0x00202400, 0x02202400,
76 0x00000404, 0x02000404, 0x00002404, 0x02002404,
77 0x00200404, 0x02200404, 0x00202404, 0x02202404,
78 0x10000000, 0x12000000, 0x10002000, 0x12002000,
79 0x10200000, 0x12200000, 0x10202000, 0x12202000,
80 0x10000004, 0x12000004, 0x10002004, 0x12002004,
81 0x10200004, 0x12200004, 0x10202004, 0x12202004,
82 0x10000400, 0x12000400, 0x10002400, 0x12002400,
83 0x10200400, 0x12200400, 0x10202400, 0x12202400,
84 0x10000404, 0x12000404, 0x10002404, 0x12002404,
85 0x10200404, 0x12200404, 0x10202404, 0x12202404,)
86
87 skb2 = (
88
89 0x00000000, 0x00000001, 0x00040000, 0x00040001,
90 0x01000000, 0x01000001, 0x01040000, 0x01040001,
91 0x00000002, 0x00000003, 0x00040002, 0x00040003,
92 0x01000002, 0x01000003, 0x01040002, 0x01040003,
93 0x00000200, 0x00000201, 0x00040200, 0x00040201,
94 0x01000200, 0x01000201, 0x01040200, 0x01040201,
95 0x00000202, 0x00000203, 0x00040202, 0x00040203,
96 0x01000202, 0x01000203, 0x01040202, 0x01040203,
97 0x08000000, 0x08000001, 0x08040000, 0x08040001,
98 0x09000000, 0x09000001, 0x09040000, 0x09040001,
99 0x08000002, 0x08000003, 0x08040002, 0x08040003,
100 0x09000002, 0x09000003, 0x09040002, 0x09040003,
101 0x08000200, 0x08000201, 0x08040200, 0x08040201,
102 0x09000200, 0x09000201, 0x09040200, 0x09040201,
103 0x08000202, 0x08000203, 0x08040202, 0x08040203,
104 0x09000202, 0x09000203, 0x09040202, 0x09040203,)
105
106
107
108 skb3 = (
109
110 0x00000000, 0x00100000, 0x00000100, 0x00100100,
111 0x00000008, 0x00100008, 0x00000108, 0x00100108,
112 0x00001000, 0x00101000, 0x00001100, 0x00101100,
113 0x00001008, 0x00101008, 0x00001108, 0x00101108,
114 0x04000000, 0x04100000, 0x04000100, 0x04100100,
115 0x04000008, 0x04100008, 0x04000108, 0x04100108,
116 0x04001000, 0x04101000, 0x04001100, 0x04101100,
117 0x04001008, 0x04101008, 0x04001108, 0x04101108,
118 0x00020000, 0x00120000, 0x00020100, 0x00120100,
119 0x00020008, 0x00120008, 0x00020108, 0x00120108,
120 0x00021000, 0x00121000, 0x00021100, 0x00121100,
121 0x00021008, 0x00121008, 0x00021108, 0x00121108,
122 0x04020000, 0x04120000, 0x04020100, 0x04120100,
123 0x04020008, 0x04120008, 0x04020108, 0x04120108,
124 0x04021000, 0x04121000, 0x04021100, 0x04121100,
125 0x04021008, 0x04121008, 0x04021108, 0x04121108,)
126
127 skb4 = (
128
129 0x00000000, 0x10000000, 0x00010000, 0x10010000,
130 0x00000004, 0x10000004, 0x00010004, 0x10010004,
131 0x20000000, 0x30000000, 0x20010000, 0x30010000,
132 0x20000004, 0x30000004, 0x20010004, 0x30010004,
133 0x00100000, 0x10100000, 0x00110000, 0x10110000,
134 0x00100004, 0x10100004, 0x00110004, 0x10110004,
135 0x20100000, 0x30100000, 0x20110000, 0x30110000,
136 0x20100004, 0x30100004, 0x20110004, 0x30110004,
137 0x00001000, 0x10001000, 0x00011000, 0x10011000,
138 0x00001004, 0x10001004, 0x00011004, 0x10011004,
139 0x20001000, 0x30001000, 0x20011000, 0x30011000,
140 0x20001004, 0x30001004, 0x20011004, 0x30011004,
141 0x00101000, 0x10101000, 0x00111000, 0x10111000,
142 0x00101004, 0x10101004, 0x00111004, 0x10111004,
143 0x20101000, 0x30101000, 0x20111000, 0x30111000,
144 0x20101004, 0x30101004, 0x20111004, 0x30111004,)
145
146 skb5 = (
147
148 0x00000000, 0x08000000, 0x00000008, 0x08000008,
149 0x00000400, 0x08000400, 0x00000408, 0x08000408,
150 0x00020000, 0x08020000, 0x00020008, 0x08020008,
151 0x00020400, 0x08020400, 0x00020408, 0x08020408,
152 0x00000001, 0x08000001, 0x00000009, 0x08000009,
153 0x00000401, 0x08000401, 0x00000409, 0x08000409,
154 0x00020001, 0x08020001, 0x00020009, 0x08020009,
155 0x00020401, 0x08020401, 0x00020409, 0x08020409,
156 0x02000000, 0x0A000000, 0x02000008, 0x0A000008,
157 0x02000400, 0x0A000400, 0x02000408, 0x0A000408,
158 0x02020000, 0x0A020000, 0x02020008, 0x0A020008,
159 0x02020400, 0x0A020400, 0x02020408, 0x0A020408,
160 0x02000001, 0x0A000001, 0x02000009, 0x0A000009,
161 0x02000401, 0x0A000401, 0x02000409, 0x0A000409,
162 0x02020001, 0x0A020001, 0x02020009, 0x0A020009,
163 0x02020401, 0x0A020401, 0x02020409, 0x0A020409,)
164
165
166 skb6 = (
167
168 0x00000000, 0x00000100, 0x00080000, 0x00080100,
169 0x01000000, 0x01000100, 0x01080000, 0x01080100,
170 0x00000010, 0x00000110, 0x00080010, 0x00080110,
171 0x01000010, 0x01000110, 0x01080010, 0x01080110,
172 0x00200000, 0x00200100, 0x00280000, 0x00280100,
173 0x01200000, 0x01200100, 0x01280000, 0x01280100,
174 0x00200010, 0x00200110, 0x00280010, 0x00280110,
175 0x01200010, 0x01200110, 0x01280010, 0x01280110,
176 0x00000200, 0x00000300, 0x00080200, 0x00080300,
177 0x01000200, 0x01000300, 0x01080200, 0x01080300,
178 0x00000210, 0x00000310, 0x00080210, 0x00080310,
179 0x01000210, 0x01000310, 0x01080210, 0x01080310,
180 0x00200200, 0x00200300, 0x00280200, 0x00280300,
181 0x01200200, 0x01200300, 0x01280200, 0x01280300,
182 0x00200210, 0x00200310, 0x00280210, 0x00280310,
183 0x01200210, 0x01200310, 0x01280210, 0x01280310,)
184
185
186 skb7 = (
187
188 0x00000000, 0x04000000, 0x00040000, 0x04040000,
189 0x00000002, 0x04000002, 0x00040002, 0x04040002,
190 0x00002000, 0x04002000, 0x00042000, 0x04042000,
191 0x00002002, 0x04002002, 0x00042002, 0x04042002,
192 0x00000020, 0x04000020, 0x00040020, 0x04040020,
193 0x00000022, 0x04000022, 0x00040022, 0x04040022,
194 0x00002020, 0x04002020, 0x00042020, 0x04042020,
195 0x00002022, 0x04002022, 0x00042022, 0x04042022,
196 0x00000800, 0x04000800, 0x00040800, 0x04040800,
197 0x00000802, 0x04000802, 0x00040802, 0x04040802,
198 0x00002800, 0x04002800, 0x00042800, 0x04042800,
199 0x00002802, 0x04002802, 0x00042802, 0x04042802,
200 0x00000820, 0x04000820, 0x00040820, 0x04040820,
201 0x00000822, 0x04000822, 0x00040822, 0x04040822,
202 0x00002820, 0x04002820, 0x00042820, 0x04042820,
203 0x00002822, 0x04002822, 0x00042822, 0x04042822,)
204
205 SPtrans0 = (
206
207 0x00820200, 0x00020000, 0x80800000, 0x80820200,
208 0x00800000, 0x80020200, 0x80020000, 0x80800000,
209 0x80020200, 0x00820200, 0x00820000, 0x80000200,
210 0x80800200, 0x00800000, 0x00000000, 0x80020000,
211 0x00020000, 0x80000000, 0x00800200, 0x00020200,
212 0x80820200, 0x00820000, 0x80000200, 0x00800200,
213 0x80000000, 0x00000200, 0x00020200, 0x80820000,
214 0x00000200, 0x80800200, 0x80820000, 0x00000000,
215 0x00000000, 0x80820200, 0x00800200, 0x80020000,
216 0x00820200, 0x00020000, 0x80000200, 0x00800200,
217 0x80820000, 0x00000200, 0x00020200, 0x80800000,
218 0x80020200, 0x80000000, 0x80800000, 0x00820000,
219 0x80820200, 0x00020200, 0x00820000, 0x80800200,
220 0x00800000, 0x80000200, 0x80020000, 0x00000000,
221 0x00020000, 0x00800000, 0x80800200, 0x00820200,
222 0x80000000, 0x80820000, 0x00000200, 0x80020200,)
223
224
225 SPtrans1 = (
226
227 0x10042004, 0x00000000, 0x00042000, 0x10040000,
228 0x10000004, 0x00002004, 0x10002000, 0x00042000,
229 0x00002000, 0x10040004, 0x00000004, 0x10002000,
230 0x00040004, 0x10042000, 0x10040000, 0x00000004,
231 0x00040000, 0x10002004, 0x10040004, 0x00002000,
232 0x00042004, 0x10000000, 0x00000000, 0x00040004,
233 0x10002004, 0x00042004, 0x10042000, 0x10000004,
234 0x10000000, 0x00040000, 0x00002004, 0x10042004,
235 0x00040004, 0x10042000, 0x10002000, 0x00042004,
236 0x10042004, 0x00040004, 0x10000004, 0x00000000,
237 0x10000000, 0x00002004, 0x00040000, 0x10040004,
238 0x00002000, 0x10000000, 0x00042004, 0x10002004,
239 0x10042000, 0x00002000, 0x00000000, 0x10000004,
240 0x00000004, 0x10042004, 0x00042000, 0x10040000,
241 0x10040004, 0x00040000, 0x00002004, 0x10002000,
242 0x10002004, 0x00000004, 0x10040000, 0x00042000,)
243
244
245 SPtrans2 = (
246
247 0x41000000, 0x01010040, 0x00000040, 0x41000040,
248 0x40010000, 0x01000000, 0x41000040, 0x00010040,
249 0x01000040, 0x00010000, 0x01010000, 0x40000000,
250 0x41010040, 0x40000040, 0x40000000, 0x41010000,
251 0x00000000, 0x40010000, 0x01010040, 0x00000040,
252 0x40000040, 0x41010040, 0x00010000, 0x41000000,
253 0x41010000, 0x01000040, 0x40010040, 0x01010000,
254 0x00010040, 0x00000000, 0x01000000, 0x40010040,
255 0x01010040, 0x00000040, 0x40000000, 0x00010000,
256 0x40000040, 0x40010000, 0x01010000, 0x41000040,
257 0x00000000, 0x01010040, 0x00010040, 0x41010000,
258 0x40010000, 0x01000000, 0x41010040, 0x40000000,
259 0x40010040, 0x41000000, 0x01000000, 0x41010040,
260 0x00010000, 0x01000040, 0x41000040, 0x00010040,
261 0x01000040, 0x00000000, 0x41010000, 0x40000040,
262 0x41000000, 0x40010040, 0x00000040, 0x01010000,)
263
264
265 SPtrans3 = (
266
267 0x00100402, 0x04000400, 0x00000002, 0x04100402,
268 0x00000000, 0x04100000, 0x04000402, 0x00100002,
269 0x04100400, 0x04000002, 0x04000000, 0x00000402,
270 0x04000002, 0x00100402, 0x00100000, 0x04000000,
271 0x04100002, 0x00100400, 0x00000400, 0x00000002,
272 0x00100400, 0x04000402, 0x04100000, 0x00000400,
273 0x00000402, 0x00000000, 0x00100002, 0x04100400,
274 0x04000400, 0x04100002, 0x04100402, 0x00100000,
275 0x04100002, 0x00000402, 0x00100000, 0x04000002,
276 0x00100400, 0x04000400, 0x00000002, 0x04100000,
277 0x04000402, 0x00000000, 0x00000400, 0x00100002,
278 0x00000000, 0x04100002, 0x04100400, 0x00000400,
279 0x04000000, 0x04100402, 0x00100402, 0x00100000,
280 0x04100402, 0x00000002, 0x04000400, 0x00100402,
281 0x00100002, 0x00100400, 0x04100000, 0x04000402,
282 0x00000402, 0x04000000, 0x04000002, 0x04100400,)
283
284
285 SPtrans4 = (
286
287 0x02000000, 0x00004000, 0x00000100, 0x02004108,
288 0x02004008, 0x02000100, 0x00004108, 0x02004000,
289 0x00004000, 0x00000008, 0x02000008, 0x00004100,
290 0x02000108, 0x02004008, 0x02004100, 0x00000000,
291 0x00004100, 0x02000000, 0x00004008, 0x00000108,
292 0x02000100, 0x00004108, 0x00000000, 0x02000008,
293 0x00000008, 0x02000108, 0x02004108, 0x00004008,
294 0x02004000, 0x00000100, 0x00000108, 0x02004100,
295 0x02004100, 0x02000108, 0x00004008, 0x02004000,
296 0x00004000, 0x00000008, 0x02000008, 0x02000100,
297 0x02000000, 0x00004100, 0x02004108, 0x00000000,
298 0x00004108, 0x02000000, 0x00000100, 0x00004008,
299 0x02000108, 0x00000100, 0x00000000, 0x02004108,
300 0x02004008, 0x02004100, 0x00000108, 0x00004000,
301 0x00004100, 0x02004008, 0x02000100, 0x00000108,
302 0x00000008, 0x00004108, 0x02004000, 0x02000008,)
303
304
305 SPtrans5 = (
306
307 0x20000010, 0x00080010, 0x00000000, 0x20080800,
308 0x00080010, 0x00000800, 0x20000810, 0x00080000,
309 0x00000810, 0x20080810, 0x00080800, 0x20000000,
310 0x20000800, 0x20000010, 0x20080000, 0x00080810,
311 0x00080000, 0x20000810, 0x20080010, 0x00000000,
312 0x00000800, 0x00000010, 0x20080800, 0x20080010,
313 0x20080810, 0x20080000, 0x20000000, 0x00000810,
314 0x00000010, 0x00080800, 0x00080810, 0x20000800,
315 0x00000810, 0x20000000, 0x20000800, 0x00080810,
316 0x20080800, 0x00080010, 0x00000000, 0x20000800,
317 0x20000000, 0x00000800, 0x20080010, 0x00080000,
318 0x00080010, 0x20080810, 0x00080800, 0x00000010,
319 0x20080810, 0x00080800, 0x00080000, 0x20000810,
320 0x20000010, 0x20080000, 0x00080810, 0x00000000,
321 0x00000800, 0x20000010, 0x20000810, 0x20080800,
322 0x20080000, 0x00000810, 0x00000010, 0x20080010,)
323
324
325 SPtrans6 = (
326
327 0x00001000, 0x00000080, 0x00400080, 0x00400001,
328 0x00401081, 0x00001001, 0x00001080, 0x00000000,
329 0x00400000, 0x00400081, 0x00000081, 0x00401000,
330 0x00000001, 0x00401080, 0x00401000, 0x00000081,
331 0x00400081, 0x00001000, 0x00001001, 0x00401081,
332 0x00000000, 0x00400080, 0x00400001, 0x00001080,
333 0x00401001, 0x00001081, 0x00401080, 0x00000001,
334 0x00001081, 0x00401001, 0x00000080, 0x00400000,
335 0x00001081, 0x00401000, 0x00401001, 0x00000081,
336 0x00001000, 0x00000080, 0x00400000, 0x00401001,
337 0x00400081, 0x00001081, 0x00001080, 0x00000000,
338 0x00000080, 0x00400001, 0x00000001, 0x00400080,
339 0x00000000, 0x00400081, 0x00400080, 0x00001080,
340 0x00000081, 0x00001000, 0x00401081, 0x00400000,
341 0x00401080, 0x00000001, 0x00001001, 0x00401081,
342 0x00400001, 0x00401080, 0x00401000, 0x00001001,)
343
344 SPtrans7 = (
345
346 0x08200020, 0x08208000, 0x00008020, 0x00000000,
347 0x08008000, 0x00200020, 0x08200000, 0x08208020,
348 0x00000020, 0x08000000, 0x00208000, 0x00008020,
349 0x00208020, 0x08008020, 0x08000020, 0x08200000,
350 0x00008000, 0x00208020, 0x00200020, 0x08008000,
351 0x08208020, 0x08000020, 0x00000000, 0x00208000,
352 0x08000000, 0x00200000, 0x08008020, 0x08200020,
353 0x00200000, 0x00008000, 0x08208000, 0x00000020,
354 0x00200000, 0x00008000, 0x08000020, 0x08208020,
355 0x00008020, 0x08000000, 0x00000000, 0x00208000,
356 0x08200020, 0x08008020, 0x08008000, 0x00200020,
357 0x08208000, 0x00000020, 0x00200020, 0x08008000,
358 0x08208020, 0x00200000, 0x08200000, 0x08000020,
359 0x00208000, 0x00008020, 0x08008020, 0x08200000,
360 0x00000020, 0x08208000, 0x00208020, 0x00000000,
361 0x08000000, 0x08200020, 0x00008000, 0x00208020,)
362
363
364 cov_2char = (
365 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
366 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44,
367 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C,
368 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54,
369 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62,
370 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
371 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72,
372 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,)
373
374
376 """only for ints! (mimics the Java >>> operator)"""
377
378 s = s & 0x1f;
379 return( (n >> s) & (~0 >> s) )
380
381
382
383
385 """this turns value into a shortint.."""
386
387
388
389 value = value & 0xff
390 if (value & 0x80):
391 value = -((~value & 0xff)+1)
392
393
394
395 return value
396
397
398
400 if value & 0x80000000:
401 value = - ((~value & 0xffffffff) + 1)
402 return value
403
404
406 if value >= 0:
407 return value
408 else:
409 return value + 256
410
411
420
421
423
424 b[offset] = toByte(ushr(iValue, 0) & 0xff)
425 b[offset+1] = toByte(ushr(iValue, 8) & 0xff)
426 b[offset+2] = toByte(ushr(iValue,16) & 0xff)
427 b[offset+3] = toByte(ushr(iValue,24) & 0xff)
428
429 return None
430
431
433
434 t = (ushr(a,n) ^ b) & m
435 a = a ^ (t << n)
436 b = b ^ t
437
438 results[0] = toInt(a)
439 results[1] = toInt(b)
440
441 return None
442
443
444
446
447 t = ((a << (16 - n)) ^ a) & m
448 a = a ^ t ^ ushr(t, 16 - n)
449
450 return toInt(a)
451
452
454
455 schedule = [None] * (ITERATIONS * 2)
456
457
458
459 c = fourBytesToInt(key, 0)
460 d = fourBytesToInt(key, 4)
461
462 results = [None, None]
463
464
465 PERM_OP(d, c, 4, 0x0f0f0f0f, results)
466 d = results[0]
467 c = results[1]
468
469 c = HPERM_OP(c, -2, 0xcccc0000)
470 d = HPERM_OP(d, -2, 0xcccc0000)
471
472 PERM_OP(d, c, 1, 0x55555555, results)
473 d = results[0]
474 c = results[1]
475
476 PERM_OP(c, d, 8, 0x00ff00ff, results)
477 c = results[0]
478 d = results[1]
479
480 PERM_OP(d, c, 1, 0x55555555, results)
481 d = results[0]
482 c = results[1]
483
484 d = ( ((d & 0x000000ff) << 16) | (d & 0x0000ff00) |
485 ushr(d & 0x00ff0000, 16) | ushr(c & 0xf0000000, 4))
486
487 c = c & 0x0fffffff
488
489 j = 0
490
491 for i in range(ITERATIONS):
492 if (shifts2[i]):
493 c = ushr(c, 2) | (c << 26)
494 d = ushr(d, 2) | (d << 26)
495 else:
496 c = ushr(c, 1) | (c << 27)
497 d = ushr(d, 1) | (d << 27)
498
499 c = c & 0x0fffffff
500 d = d & 0x0fffffff
501
502 s = skb0[ (c ) & 0x3f ]| \
503 skb1[(ushr(c, 6) & 0x03) | (ushr(c, 7) & 0x3c)]| \
504 skb2[(ushr(c,13) & 0x0f) | (ushr(c,14) & 0x30)]| \
505 skb3[(ushr(c,20) & 0x01) | (ushr(c,21) & 0x06) | \
506 (ushr(c,22) & 0x38)]
507
508 t = skb4[ (d ) & 0x3f ]| \
509 skb5[(ushr(d, 7) & 0x03) | (ushr(d, 8) & 0x3c) ]| \
510 skb6[ ushr(d,15) & 0x3f ]| \
511 skb7[(ushr(d,21) & 0x0f) | (ushr(d,22) & 0x30)]
512
513 schedule[j] = ( (t << 16) | (s & 0x0000ffff)) & 0xffffffff
514 s = (ushr(s, 16) | (t & 0xffff0000))
515 j = j + 1
516
517 s = (s << 4) | ushr(s,28)
518 schedule[j] = s & 0xffffffff;
519 j = j + 1
520
521 return schedule
522
523
524
544
545
546
547
548 -def body(schedule, Eswap0, Eswap1):
549
550 left = 0
551 right = 0
552 t = 0
553
554
555 for j in range(25):
556
557 for i in range(0, ITERATIONS * 2, 4):
558 left = D_ENCRYPT(left, right, i, Eswap0, Eswap1, schedule)
559 right = D_ENCRYPT(right, left, i + 2, Eswap0, Eswap1, schedule)
560
561 left, right = right, left
562
563 t = right;
564
565 right = ushr(left, 1) | (left << 31)
566 left = ushr(t , 1) | (t << 31)
567
568 left = left & 0xffffffff
569 right = right & 0xffffffff
570
571 results = [None, None]
572
573
574
575 PERM_OP(right, left, 1, 0x55555555, results)
576 right = results[0]
577 left = results[1]
578
579 PERM_OP(left, right, 8, 0x00ff00ff, results)
580 left = results[0]
581 right = results[1]
582
583 PERM_OP(right, left, 2, 0x33333333, results)
584 right = results[0]
585 left = results[1]
586
587 PERM_OP(left, right, 16, 0x0000ffff, results)
588 left = results[0]
589 right = results[1]
590
591 PERM_OP(right, left, 4, 0x0f0f0f0f, results)
592 right = results[0]
593 left = results[1]
594
595 return [left, right]
596
597
598
599
600
601
602 -def crypt(plaintext, salt):
603 buffer = ''
604
605 if salt=='':
606 return buffer
607
608 if len(salt)<2:
609 salt = salt + salt
610
611 buffer = salt[:2]
612
613 Eswap0 = con_salt[ord(salt[0])]
614 Eswap1 = con_salt[ord(salt[1])] << 4
615
616 key = [0] * 8
617
618 iChar = map( lambda c: ord(c) << 1, plaintext)
619
620 for i in range(len(key)):
621 if i >= len(iChar):
622 break
623 key[i] = toByte(iChar[i])
624
625
626 schedule = des_set_key(key)
627 out = body(schedule, Eswap0, Eswap1)
628
629 b = [None] * 9
630
631 intToFourBytes(out[0], b, 0)
632 intToFourBytes(out[1], b, 4)
633 b[8] = 0
634
635
636 y = 0
637 u = 0x80
638
639 for i in range(2, 13):
640
641 c = 0
642 for j in range(6):
643 c = c << 1
644
645 if (b[y] & u) != 0:
646 c = c | 1
647
648 u = u >> 1
649
650 if(u == 0):
651 y = y + 1
652 u = 0x80
653
654 buffer = buffer + chr(cov_2char[c])
655
656 return buffer
657
658
659 if __name__=="__main__":
660 print crypt("cat","hat")
661