1 | ;(function (root, factory, undef) {
|
2 | if (typeof exports === "object") {
|
3 |
|
4 | module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
|
5 | }
|
6 | else if (typeof define === "function" && define.amd) {
|
7 |
|
8 | define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
|
9 | }
|
10 | else {
|
11 |
|
12 | factory(root.CryptoJS);
|
13 | }
|
14 | }(this, function (CryptoJS) {
|
15 |
|
16 | (function () {
|
17 |
|
18 | var C = CryptoJS;
|
19 | var C_lib = C.lib;
|
20 | var WordArray = C_lib.WordArray;
|
21 | var BlockCipher = C_lib.BlockCipher;
|
22 | var C_algo = C.algo;
|
23 |
|
24 |
|
25 | var PC1 = [
|
26 | 57, 49, 41, 33, 25, 17, 9, 1,
|
27 | 58, 50, 42, 34, 26, 18, 10, 2,
|
28 | 59, 51, 43, 35, 27, 19, 11, 3,
|
29 | 60, 52, 44, 36, 63, 55, 47, 39,
|
30 | 31, 23, 15, 7, 62, 54, 46, 38,
|
31 | 30, 22, 14, 6, 61, 53, 45, 37,
|
32 | 29, 21, 13, 5, 28, 20, 12, 4
|
33 | ];
|
34 |
|
35 |
|
36 | var PC2 = [
|
37 | 14, 17, 11, 24, 1, 5,
|
38 | 3, 28, 15, 6, 21, 10,
|
39 | 23, 19, 12, 4, 26, 8,
|
40 | 16, 7, 27, 20, 13, 2,
|
41 | 41, 52, 31, 37, 47, 55,
|
42 | 30, 40, 51, 45, 33, 48,
|
43 | 44, 49, 39, 56, 34, 53,
|
44 | 46, 42, 50, 36, 29, 32
|
45 | ];
|
46 |
|
47 |
|
48 | var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
|
49 |
|
50 |
|
51 | var SBOX_P = [
|
52 | {
|
53 | 0x0: 0x808200,
|
54 | 0x10000000: 0x8000,
|
55 | 0x20000000: 0x808002,
|
56 | 0x30000000: 0x2,
|
57 | 0x40000000: 0x200,
|
58 | 0x50000000: 0x808202,
|
59 | 0x60000000: 0x800202,
|
60 | 0x70000000: 0x800000,
|
61 | 0x80000000: 0x202,
|
62 | 0x90000000: 0x800200,
|
63 | 0xa0000000: 0x8200,
|
64 | 0xb0000000: 0x808000,
|
65 | 0xc0000000: 0x8002,
|
66 | 0xd0000000: 0x800002,
|
67 | 0xe0000000: 0x0,
|
68 | 0xf0000000: 0x8202,
|
69 | 0x8000000: 0x0,
|
70 | 0x18000000: 0x808202,
|
71 | 0x28000000: 0x8202,
|
72 | 0x38000000: 0x8000,
|
73 | 0x48000000: 0x808200,
|
74 | 0x58000000: 0x200,
|
75 | 0x68000000: 0x808002,
|
76 | 0x78000000: 0x2,
|
77 | 0x88000000: 0x800200,
|
78 | 0x98000000: 0x8200,
|
79 | 0xa8000000: 0x808000,
|
80 | 0xb8000000: 0x800202,
|
81 | 0xc8000000: 0x800002,
|
82 | 0xd8000000: 0x8002,
|
83 | 0xe8000000: 0x202,
|
84 | 0xf8000000: 0x800000,
|
85 | 0x1: 0x8000,
|
86 | 0x10000001: 0x2,
|
87 | 0x20000001: 0x808200,
|
88 | 0x30000001: 0x800000,
|
89 | 0x40000001: 0x808002,
|
90 | 0x50000001: 0x8200,
|
91 | 0x60000001: 0x200,
|
92 | 0x70000001: 0x800202,
|
93 | 0x80000001: 0x808202,
|
94 | 0x90000001: 0x808000,
|
95 | 0xa0000001: 0x800002,
|
96 | 0xb0000001: 0x8202,
|
97 | 0xc0000001: 0x202,
|
98 | 0xd0000001: 0x800200,
|
99 | 0xe0000001: 0x8002,
|
100 | 0xf0000001: 0x0,
|
101 | 0x8000001: 0x808202,
|
102 | 0x18000001: 0x808000,
|
103 | 0x28000001: 0x800000,
|
104 | 0x38000001: 0x200,
|
105 | 0x48000001: 0x8000,
|
106 | 0x58000001: 0x800002,
|
107 | 0x68000001: 0x2,
|
108 | 0x78000001: 0x8202,
|
109 | 0x88000001: 0x8002,
|
110 | 0x98000001: 0x800202,
|
111 | 0xa8000001: 0x202,
|
112 | 0xb8000001: 0x808200,
|
113 | 0xc8000001: 0x800200,
|
114 | 0xd8000001: 0x0,
|
115 | 0xe8000001: 0x8200,
|
116 | 0xf8000001: 0x808002
|
117 | },
|
118 | {
|
119 | 0x0: 0x40084010,
|
120 | 0x1000000: 0x4000,
|
121 | 0x2000000: 0x80000,
|
122 | 0x3000000: 0x40080010,
|
123 | 0x4000000: 0x40000010,
|
124 | 0x5000000: 0x40084000,
|
125 | 0x6000000: 0x40004000,
|
126 | 0x7000000: 0x10,
|
127 | 0x8000000: 0x84000,
|
128 | 0x9000000: 0x40004010,
|
129 | 0xa000000: 0x40000000,
|
130 | 0xb000000: 0x84010,
|
131 | 0xc000000: 0x80010,
|
132 | 0xd000000: 0x0,
|
133 | 0xe000000: 0x4010,
|
134 | 0xf000000: 0x40080000,
|
135 | 0x800000: 0x40004000,
|
136 | 0x1800000: 0x84010,
|
137 | 0x2800000: 0x10,
|
138 | 0x3800000: 0x40004010,
|
139 | 0x4800000: 0x40084010,
|
140 | 0x5800000: 0x40000000,
|
141 | 0x6800000: 0x80000,
|
142 | 0x7800000: 0x40080010,
|
143 | 0x8800000: 0x80010,
|
144 | 0x9800000: 0x0,
|
145 | 0xa800000: 0x4000,
|
146 | 0xb800000: 0x40080000,
|
147 | 0xc800000: 0x40000010,
|
148 | 0xd800000: 0x84000,
|
149 | 0xe800000: 0x40084000,
|
150 | 0xf800000: 0x4010,
|
151 | 0x10000000: 0x0,
|
152 | 0x11000000: 0x40080010,
|
153 | 0x12000000: 0x40004010,
|
154 | 0x13000000: 0x40084000,
|
155 | 0x14000000: 0x40080000,
|
156 | 0x15000000: 0x10,
|
157 | 0x16000000: 0x84010,
|
158 | 0x17000000: 0x4000,
|
159 | 0x18000000: 0x4010,
|
160 | 0x19000000: 0x80000,
|
161 | 0x1a000000: 0x80010,
|
162 | 0x1b000000: 0x40000010,
|
163 | 0x1c000000: 0x84000,
|
164 | 0x1d000000: 0x40004000,
|
165 | 0x1e000000: 0x40000000,
|
166 | 0x1f000000: 0x40084010,
|
167 | 0x10800000: 0x84010,
|
168 | 0x11800000: 0x80000,
|
169 | 0x12800000: 0x40080000,
|
170 | 0x13800000: 0x4000,
|
171 | 0x14800000: 0x40004000,
|
172 | 0x15800000: 0x40084010,
|
173 | 0x16800000: 0x10,
|
174 | 0x17800000: 0x40000000,
|
175 | 0x18800000: 0x40084000,
|
176 | 0x19800000: 0x40000010,
|
177 | 0x1a800000: 0x40004010,
|
178 | 0x1b800000: 0x80010,
|
179 | 0x1c800000: 0x0,
|
180 | 0x1d800000: 0x4010,
|
181 | 0x1e800000: 0x40080010,
|
182 | 0x1f800000: 0x84000
|
183 | },
|
184 | {
|
185 | 0x0: 0x104,
|
186 | 0x100000: 0x0,
|
187 | 0x200000: 0x4000100,
|
188 | 0x300000: 0x10104,
|
189 | 0x400000: 0x10004,
|
190 | 0x500000: 0x4000004,
|
191 | 0x600000: 0x4010104,
|
192 | 0x700000: 0x4010000,
|
193 | 0x800000: 0x4000000,
|
194 | 0x900000: 0x4010100,
|
195 | 0xa00000: 0x10100,
|
196 | 0xb00000: 0x4010004,
|
197 | 0xc00000: 0x4000104,
|
198 | 0xd00000: 0x10000,
|
199 | 0xe00000: 0x4,
|
200 | 0xf00000: 0x100,
|
201 | 0x80000: 0x4010100,
|
202 | 0x180000: 0x4010004,
|
203 | 0x280000: 0x0,
|
204 | 0x380000: 0x4000100,
|
205 | 0x480000: 0x4000004,
|
206 | 0x580000: 0x10000,
|
207 | 0x680000: 0x10004,
|
208 | 0x780000: 0x104,
|
209 | 0x880000: 0x4,
|
210 | 0x980000: 0x100,
|
211 | 0xa80000: 0x4010000,
|
212 | 0xb80000: 0x10104,
|
213 | 0xc80000: 0x10100,
|
214 | 0xd80000: 0x4000104,
|
215 | 0xe80000: 0x4010104,
|
216 | 0xf80000: 0x4000000,
|
217 | 0x1000000: 0x4010100,
|
218 | 0x1100000: 0x10004,
|
219 | 0x1200000: 0x10000,
|
220 | 0x1300000: 0x4000100,
|
221 | 0x1400000: 0x100,
|
222 | 0x1500000: 0x4010104,
|
223 | 0x1600000: 0x4000004,
|
224 | 0x1700000: 0x0,
|
225 | 0x1800000: 0x4000104,
|
226 | 0x1900000: 0x4000000,
|
227 | 0x1a00000: 0x4,
|
228 | 0x1b00000: 0x10100,
|
229 | 0x1c00000: 0x4010000,
|
230 | 0x1d00000: 0x104,
|
231 | 0x1e00000: 0x10104,
|
232 | 0x1f00000: 0x4010004,
|
233 | 0x1080000: 0x4000000,
|
234 | 0x1180000: 0x104,
|
235 | 0x1280000: 0x4010100,
|
236 | 0x1380000: 0x0,
|
237 | 0x1480000: 0x10004,
|
238 | 0x1580000: 0x4000100,
|
239 | 0x1680000: 0x100,
|
240 | 0x1780000: 0x4010004,
|
241 | 0x1880000: 0x10000,
|
242 | 0x1980000: 0x4010104,
|
243 | 0x1a80000: 0x10104,
|
244 | 0x1b80000: 0x4000004,
|
245 | 0x1c80000: 0x4000104,
|
246 | 0x1d80000: 0x4010000,
|
247 | 0x1e80000: 0x4,
|
248 | 0x1f80000: 0x10100
|
249 | },
|
250 | {
|
251 | 0x0: 0x80401000,
|
252 | 0x10000: 0x80001040,
|
253 | 0x20000: 0x401040,
|
254 | 0x30000: 0x80400000,
|
255 | 0x40000: 0x0,
|
256 | 0x50000: 0x401000,
|
257 | 0x60000: 0x80000040,
|
258 | 0x70000: 0x400040,
|
259 | 0x80000: 0x80000000,
|
260 | 0x90000: 0x400000,
|
261 | 0xa0000: 0x40,
|
262 | 0xb0000: 0x80001000,
|
263 | 0xc0000: 0x80400040,
|
264 | 0xd0000: 0x1040,
|
265 | 0xe0000: 0x1000,
|
266 | 0xf0000: 0x80401040,
|
267 | 0x8000: 0x80001040,
|
268 | 0x18000: 0x40,
|
269 | 0x28000: 0x80400040,
|
270 | 0x38000: 0x80001000,
|
271 | 0x48000: 0x401000,
|
272 | 0x58000: 0x80401040,
|
273 | 0x68000: 0x0,
|
274 | 0x78000: 0x80400000,
|
275 | 0x88000: 0x1000,
|
276 | 0x98000: 0x80401000,
|
277 | 0xa8000: 0x400000,
|
278 | 0xb8000: 0x1040,
|
279 | 0xc8000: 0x80000000,
|
280 | 0xd8000: 0x400040,
|
281 | 0xe8000: 0x401040,
|
282 | 0xf8000: 0x80000040,
|
283 | 0x100000: 0x400040,
|
284 | 0x110000: 0x401000,
|
285 | 0x120000: 0x80000040,
|
286 | 0x130000: 0x0,
|
287 | 0x140000: 0x1040,
|
288 | 0x150000: 0x80400040,
|
289 | 0x160000: 0x80401000,
|
290 | 0x170000: 0x80001040,
|
291 | 0x180000: 0x80401040,
|
292 | 0x190000: 0x80000000,
|
293 | 0x1a0000: 0x80400000,
|
294 | 0x1b0000: 0x401040,
|
295 | 0x1c0000: 0x80001000,
|
296 | 0x1d0000: 0x400000,
|
297 | 0x1e0000: 0x40,
|
298 | 0x1f0000: 0x1000,
|
299 | 0x108000: 0x80400000,
|
300 | 0x118000: 0x80401040,
|
301 | 0x128000: 0x0,
|
302 | 0x138000: 0x401000,
|
303 | 0x148000: 0x400040,
|
304 | 0x158000: 0x80000000,
|
305 | 0x168000: 0x80001040,
|
306 | 0x178000: 0x40,
|
307 | 0x188000: 0x80000040,
|
308 | 0x198000: 0x1000,
|
309 | 0x1a8000: 0x80001000,
|
310 | 0x1b8000: 0x80400040,
|
311 | 0x1c8000: 0x1040,
|
312 | 0x1d8000: 0x80401000,
|
313 | 0x1e8000: 0x400000,
|
314 | 0x1f8000: 0x401040
|
315 | },
|
316 | {
|
317 | 0x0: 0x80,
|
318 | 0x1000: 0x1040000,
|
319 | 0x2000: 0x40000,
|
320 | 0x3000: 0x20000000,
|
321 | 0x4000: 0x20040080,
|
322 | 0x5000: 0x1000080,
|
323 | 0x6000: 0x21000080,
|
324 | 0x7000: 0x40080,
|
325 | 0x8000: 0x1000000,
|
326 | 0x9000: 0x20040000,
|
327 | 0xa000: 0x20000080,
|
328 | 0xb000: 0x21040080,
|
329 | 0xc000: 0x21040000,
|
330 | 0xd000: 0x0,
|
331 | 0xe000: 0x1040080,
|
332 | 0xf000: 0x21000000,
|
333 | 0x800: 0x1040080,
|
334 | 0x1800: 0x21000080,
|
335 | 0x2800: 0x80,
|
336 | 0x3800: 0x1040000,
|
337 | 0x4800: 0x40000,
|
338 | 0x5800: 0x20040080,
|
339 | 0x6800: 0x21040000,
|
340 | 0x7800: 0x20000000,
|
341 | 0x8800: 0x20040000,
|
342 | 0x9800: 0x0,
|
343 | 0xa800: 0x21040080,
|
344 | 0xb800: 0x1000080,
|
345 | 0xc800: 0x20000080,
|
346 | 0xd800: 0x21000000,
|
347 | 0xe800: 0x1000000,
|
348 | 0xf800: 0x40080,
|
349 | 0x10000: 0x40000,
|
350 | 0x11000: 0x80,
|
351 | 0x12000: 0x20000000,
|
352 | 0x13000: 0x21000080,
|
353 | 0x14000: 0x1000080,
|
354 | 0x15000: 0x21040000,
|
355 | 0x16000: 0x20040080,
|
356 | 0x17000: 0x1000000,
|
357 | 0x18000: 0x21040080,
|
358 | 0x19000: 0x21000000,
|
359 | 0x1a000: 0x1040000,
|
360 | 0x1b000: 0x20040000,
|
361 | 0x1c000: 0x40080,
|
362 | 0x1d000: 0x20000080,
|
363 | 0x1e000: 0x0,
|
364 | 0x1f000: 0x1040080,
|
365 | 0x10800: 0x21000080,
|
366 | 0x11800: 0x1000000,
|
367 | 0x12800: 0x1040000,
|
368 | 0x13800: 0x20040080,
|
369 | 0x14800: 0x20000000,
|
370 | 0x15800: 0x1040080,
|
371 | 0x16800: 0x80,
|
372 | 0x17800: 0x21040000,
|
373 | 0x18800: 0x40080,
|
374 | 0x19800: 0x21040080,
|
375 | 0x1a800: 0x0,
|
376 | 0x1b800: 0x21000000,
|
377 | 0x1c800: 0x1000080,
|
378 | 0x1d800: 0x40000,
|
379 | 0x1e800: 0x20040000,
|
380 | 0x1f800: 0x20000080
|
381 | },
|
382 | {
|
383 | 0x0: 0x10000008,
|
384 | 0x100: 0x2000,
|
385 | 0x200: 0x10200000,
|
386 | 0x300: 0x10202008,
|
387 | 0x400: 0x10002000,
|
388 | 0x500: 0x200000,
|
389 | 0x600: 0x200008,
|
390 | 0x700: 0x10000000,
|
391 | 0x800: 0x0,
|
392 | 0x900: 0x10002008,
|
393 | 0xa00: 0x202000,
|
394 | 0xb00: 0x8,
|
395 | 0xc00: 0x10200008,
|
396 | 0xd00: 0x202008,
|
397 | 0xe00: 0x2008,
|
398 | 0xf00: 0x10202000,
|
399 | 0x80: 0x10200000,
|
400 | 0x180: 0x10202008,
|
401 | 0x280: 0x8,
|
402 | 0x380: 0x200000,
|
403 | 0x480: 0x202008,
|
404 | 0x580: 0x10000008,
|
405 | 0x680: 0x10002000,
|
406 | 0x780: 0x2008,
|
407 | 0x880: 0x200008,
|
408 | 0x980: 0x2000,
|
409 | 0xa80: 0x10002008,
|
410 | 0xb80: 0x10200008,
|
411 | 0xc80: 0x0,
|
412 | 0xd80: 0x10202000,
|
413 | 0xe80: 0x202000,
|
414 | 0xf80: 0x10000000,
|
415 | 0x1000: 0x10002000,
|
416 | 0x1100: 0x10200008,
|
417 | 0x1200: 0x10202008,
|
418 | 0x1300: 0x2008,
|
419 | 0x1400: 0x200000,
|
420 | 0x1500: 0x10000000,
|
421 | 0x1600: 0x10000008,
|
422 | 0x1700: 0x202000,
|
423 | 0x1800: 0x202008,
|
424 | 0x1900: 0x0,
|
425 | 0x1a00: 0x8,
|
426 | 0x1b00: 0x10200000,
|
427 | 0x1c00: 0x2000,
|
428 | 0x1d00: 0x10002008,
|
429 | 0x1e00: 0x10202000,
|
430 | 0x1f00: 0x200008,
|
431 | 0x1080: 0x8,
|
432 | 0x1180: 0x202000,
|
433 | 0x1280: 0x200000,
|
434 | 0x1380: 0x10000008,
|
435 | 0x1480: 0x10002000,
|
436 | 0x1580: 0x2008,
|
437 | 0x1680: 0x10202008,
|
438 | 0x1780: 0x10200000,
|
439 | 0x1880: 0x10202000,
|
440 | 0x1980: 0x10200008,
|
441 | 0x1a80: 0x2000,
|
442 | 0x1b80: 0x202008,
|
443 | 0x1c80: 0x200008,
|
444 | 0x1d80: 0x0,
|
445 | 0x1e80: 0x10000000,
|
446 | 0x1f80: 0x10002008
|
447 | },
|
448 | {
|
449 | 0x0: 0x100000,
|
450 | 0x10: 0x2000401,
|
451 | 0x20: 0x400,
|
452 | 0x30: 0x100401,
|
453 | 0x40: 0x2100401,
|
454 | 0x50: 0x0,
|
455 | 0x60: 0x1,
|
456 | 0x70: 0x2100001,
|
457 | 0x80: 0x2000400,
|
458 | 0x90: 0x100001,
|
459 | 0xa0: 0x2000001,
|
460 | 0xb0: 0x2100400,
|
461 | 0xc0: 0x2100000,
|
462 | 0xd0: 0x401,
|
463 | 0xe0: 0x100400,
|
464 | 0xf0: 0x2000000,
|
465 | 0x8: 0x2100001,
|
466 | 0x18: 0x0,
|
467 | 0x28: 0x2000401,
|
468 | 0x38: 0x2100400,
|
469 | 0x48: 0x100000,
|
470 | 0x58: 0x2000001,
|
471 | 0x68: 0x2000000,
|
472 | 0x78: 0x401,
|
473 | 0x88: 0x100401,
|
474 | 0x98: 0x2000400,
|
475 | 0xa8: 0x2100000,
|
476 | 0xb8: 0x100001,
|
477 | 0xc8: 0x400,
|
478 | 0xd8: 0x2100401,
|
479 | 0xe8: 0x1,
|
480 | 0xf8: 0x100400,
|
481 | 0x100: 0x2000000,
|
482 | 0x110: 0x100000,
|
483 | 0x120: 0x2000401,
|
484 | 0x130: 0x2100001,
|
485 | 0x140: 0x100001,
|
486 | 0x150: 0x2000400,
|
487 | 0x160: 0x2100400,
|
488 | 0x170: 0x100401,
|
489 | 0x180: 0x401,
|
490 | 0x190: 0x2100401,
|
491 | 0x1a0: 0x100400,
|
492 | 0x1b0: 0x1,
|
493 | 0x1c0: 0x0,
|
494 | 0x1d0: 0x2100000,
|
495 | 0x1e0: 0x2000001,
|
496 | 0x1f0: 0x400,
|
497 | 0x108: 0x100400,
|
498 | 0x118: 0x2000401,
|
499 | 0x128: 0x2100001,
|
500 | 0x138: 0x1,
|
501 | 0x148: 0x2000000,
|
502 | 0x158: 0x100000,
|
503 | 0x168: 0x401,
|
504 | 0x178: 0x2100400,
|
505 | 0x188: 0x2000001,
|
506 | 0x198: 0x2100000,
|
507 | 0x1a8: 0x0,
|
508 | 0x1b8: 0x2100401,
|
509 | 0x1c8: 0x100401,
|
510 | 0x1d8: 0x400,
|
511 | 0x1e8: 0x2000400,
|
512 | 0x1f8: 0x100001
|
513 | },
|
514 | {
|
515 | 0x0: 0x8000820,
|
516 | 0x1: 0x20000,
|
517 | 0x2: 0x8000000,
|
518 | 0x3: 0x20,
|
519 | 0x4: 0x20020,
|
520 | 0x5: 0x8020820,
|
521 | 0x6: 0x8020800,
|
522 | 0x7: 0x800,
|
523 | 0x8: 0x8020000,
|
524 | 0x9: 0x8000800,
|
525 | 0xa: 0x20800,
|
526 | 0xb: 0x8020020,
|
527 | 0xc: 0x820,
|
528 | 0xd: 0x0,
|
529 | 0xe: 0x8000020,
|
530 | 0xf: 0x20820,
|
531 | 0x80000000: 0x800,
|
532 | 0x80000001: 0x8020820,
|
533 | 0x80000002: 0x8000820,
|
534 | 0x80000003: 0x8000000,
|
535 | 0x80000004: 0x8020000,
|
536 | 0x80000005: 0x20800,
|
537 | 0x80000006: 0x20820,
|
538 | 0x80000007: 0x20,
|
539 | 0x80000008: 0x8000020,
|
540 | 0x80000009: 0x820,
|
541 | 0x8000000a: 0x20020,
|
542 | 0x8000000b: 0x8020800,
|
543 | 0x8000000c: 0x0,
|
544 | 0x8000000d: 0x8020020,
|
545 | 0x8000000e: 0x8000800,
|
546 | 0x8000000f: 0x20000,
|
547 | 0x10: 0x20820,
|
548 | 0x11: 0x8020800,
|
549 | 0x12: 0x20,
|
550 | 0x13: 0x800,
|
551 | 0x14: 0x8000800,
|
552 | 0x15: 0x8000020,
|
553 | 0x16: 0x8020020,
|
554 | 0x17: 0x20000,
|
555 | 0x18: 0x0,
|
556 | 0x19: 0x20020,
|
557 | 0x1a: 0x8020000,
|
558 | 0x1b: 0x8000820,
|
559 | 0x1c: 0x8020820,
|
560 | 0x1d: 0x20800,
|
561 | 0x1e: 0x820,
|
562 | 0x1f: 0x8000000,
|
563 | 0x80000010: 0x20000,
|
564 | 0x80000011: 0x800,
|
565 | 0x80000012: 0x8020020,
|
566 | 0x80000013: 0x20820,
|
567 | 0x80000014: 0x20,
|
568 | 0x80000015: 0x8020000,
|
569 | 0x80000016: 0x8000000,
|
570 | 0x80000017: 0x8000820,
|
571 | 0x80000018: 0x8020820,
|
572 | 0x80000019: 0x8000020,
|
573 | 0x8000001a: 0x8000800,
|
574 | 0x8000001b: 0x0,
|
575 | 0x8000001c: 0x20800,
|
576 | 0x8000001d: 0x820,
|
577 | 0x8000001e: 0x20020,
|
578 | 0x8000001f: 0x8020800
|
579 | }
|
580 | ];
|
581 |
|
582 |
|
583 | var SBOX_MASK = [
|
584 | 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
|
585 | 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
|
586 | ];
|
587 |
|
588 | |
589 |
|
590 |
|
591 | var DES = C_algo.DES = BlockCipher.extend({
|
592 | _doReset: function () {
|
593 |
|
594 | var key = this._key;
|
595 | var keyWords = key.words;
|
596 |
|
597 |
|
598 | var keyBits = [];
|
599 | for (var i = 0; i < 56; i++) {
|
600 | var keyBitPos = PC1[i] - 1;
|
601 | keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
|
602 | }
|
603 |
|
604 |
|
605 | var subKeys = this._subKeys = [];
|
606 | for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
|
607 |
|
608 | var subKey = subKeys[nSubKey] = [];
|
609 |
|
610 |
|
611 | var bitShift = BIT_SHIFTS[nSubKey];
|
612 |
|
613 |
|
614 | for (var i = 0; i < 24; i++) {
|
615 |
|
616 | subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
|
617 |
|
618 |
|
619 | subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
|
620 | }
|
621 |
|
622 |
|
623 |
|
624 |
|
625 | subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
|
626 | for (var i = 1; i < 7; i++) {
|
627 | subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
|
628 | }
|
629 | subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
|
630 | }
|
631 |
|
632 |
|
633 | var invSubKeys = this._invSubKeys = [];
|
634 | for (var i = 0; i < 16; i++) {
|
635 | invSubKeys[i] = subKeys[15 - i];
|
636 | }
|
637 | },
|
638 |
|
639 | encryptBlock: function (M, offset) {
|
640 | this._doCryptBlock(M, offset, this._subKeys);
|
641 | },
|
642 |
|
643 | decryptBlock: function (M, offset) {
|
644 | this._doCryptBlock(M, offset, this._invSubKeys);
|
645 | },
|
646 |
|
647 | _doCryptBlock: function (M, offset, subKeys) {
|
648 |
|
649 | this._lBlock = M[offset];
|
650 | this._rBlock = M[offset + 1];
|
651 |
|
652 |
|
653 | exchangeLR.call(this, 4, 0x0f0f0f0f);
|
654 | exchangeLR.call(this, 16, 0x0000ffff);
|
655 | exchangeRL.call(this, 2, 0x33333333);
|
656 | exchangeRL.call(this, 8, 0x00ff00ff);
|
657 | exchangeLR.call(this, 1, 0x55555555);
|
658 |
|
659 |
|
660 | for (var round = 0; round < 16; round++) {
|
661 |
|
662 | var subKey = subKeys[round];
|
663 | var lBlock = this._lBlock;
|
664 | var rBlock = this._rBlock;
|
665 |
|
666 |
|
667 | var f = 0;
|
668 | for (var i = 0; i < 8; i++) {
|
669 | f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
|
670 | }
|
671 | this._lBlock = rBlock;
|
672 | this._rBlock = lBlock ^ f;
|
673 | }
|
674 |
|
675 |
|
676 | var t = this._lBlock;
|
677 | this._lBlock = this._rBlock;
|
678 | this._rBlock = t;
|
679 |
|
680 |
|
681 | exchangeLR.call(this, 1, 0x55555555);
|
682 | exchangeRL.call(this, 8, 0x00ff00ff);
|
683 | exchangeRL.call(this, 2, 0x33333333);
|
684 | exchangeLR.call(this, 16, 0x0000ffff);
|
685 | exchangeLR.call(this, 4, 0x0f0f0f0f);
|
686 |
|
687 |
|
688 | M[offset] = this._lBlock;
|
689 | M[offset + 1] = this._rBlock;
|
690 | },
|
691 |
|
692 | keySize: 64/32,
|
693 |
|
694 | ivSize: 64/32,
|
695 |
|
696 | blockSize: 64/32
|
697 | });
|
698 |
|
699 |
|
700 | function exchangeLR(offset, mask) {
|
701 | var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
|
702 | this._rBlock ^= t;
|
703 | this._lBlock ^= t << offset;
|
704 | }
|
705 |
|
706 | function exchangeRL(offset, mask) {
|
707 | var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
|
708 | this._lBlock ^= t;
|
709 | this._rBlock ^= t << offset;
|
710 | }
|
711 |
|
712 | |
713 |
|
714 |
|
715 |
|
716 |
|
717 |
|
718 |
|
719 |
|
720 | C.DES = BlockCipher._createHelper(DES);
|
721 |
|
722 | |
723 |
|
724 |
|
725 | var TripleDES = C_algo.TripleDES = BlockCipher.extend({
|
726 | _doReset: function () {
|
727 |
|
728 | var key = this._key;
|
729 | var keyWords = key.words;
|
730 |
|
731 | if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
|
732 | throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
|
733 | }
|
734 |
|
735 |
|
736 | var key1 = keyWords.slice(0, 2);
|
737 | var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
|
738 | var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
|
739 |
|
740 |
|
741 | this._des1 = DES.createEncryptor(WordArray.create(key1));
|
742 | this._des2 = DES.createEncryptor(WordArray.create(key2));
|
743 | this._des3 = DES.createEncryptor(WordArray.create(key3));
|
744 | },
|
745 |
|
746 | encryptBlock: function (M, offset) {
|
747 | this._des1.encryptBlock(M, offset);
|
748 | this._des2.decryptBlock(M, offset);
|
749 | this._des3.encryptBlock(M, offset);
|
750 | },
|
751 |
|
752 | decryptBlock: function (M, offset) {
|
753 | this._des3.decryptBlock(M, offset);
|
754 | this._des2.encryptBlock(M, offset);
|
755 | this._des1.decryptBlock(M, offset);
|
756 | },
|
757 |
|
758 | keySize: 192/32,
|
759 |
|
760 | ivSize: 64/32,
|
761 |
|
762 | blockSize: 64/32
|
763 | });
|
764 |
|
765 | |
766 |
|
767 |
|
768 |
|
769 |
|
770 |
|
771 |
|
772 |
|
773 | C.TripleDES = BlockCipher._createHelper(TripleDES);
|
774 | }());
|
775 |
|
776 |
|
777 | return CryptoJS.TripleDES;
|
778 |
|
779 | })); |
\ | No newline at end of file |