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