View Javadoc

1   /*
2    * @(#)UnixCrypt.java	0.9 96/11/25
3    *
4    * Copyright (c) 1996 Aki Yoshida. All rights reserved.
5    *
6    * Permission to use, copy, modify and distribute this software
7    * for non-commercial or commercial purposes and without fee is
8    * hereby granted provided that this copyright notice appears in
9    * all copies.
10   */
11  
12  /**
13   * Unix crypt(3C) utility
14   *
15   * @version 	0.9, 11/25/96
16   * @author 	Aki Yoshida
17   */
18  
19  /**
20   * modified April 2001
21   * by Iris Van den Broeke, Daniel Deville
22   */
23  
24  package org.eclipse.jetty.http.security;
25  
26  
27  /* ------------------------------------------------------------ */
28  /**
29   * Unix Crypt. Implements the one way cryptography used by Unix systems for
30   * simple password protection.
31   * 
32   * @version $Id: UnixCrypt.java,v 1.1 2005/10/05 14:09:14 janb Exp $
33   * @author Greg Wilkins (gregw)
34   */
35  public class UnixCrypt
36  {
37  
38      /* (mostly) Standard DES Tables from Tom Truscott */
39      private static final byte[] IP = { /* initial permutation */
40      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,
41              59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 };
42  
43      /* The final permutation is the inverse of IP - no table is necessary */
44      private static final byte[] ExpandTr = { /* expansion operation */
45      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,
46              28, 29, 30, 31, 32, 1 };
47  
48      private static final byte[] PC1 = { /* permuted choice table 1 */
49      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,
50  
51      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 };
52  
53      private static final byte[] Rotates = { /* PC1 rotation schedule */
54      1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
55  
56      private static final byte[] PC2 = { /* permuted choice table 2 */
57      9, 18, 14, 17, 11, 24, 1, 5, 22, 25, 3, 28, 15, 6, 21, 10, 35, 38, 23, 19, 12, 4, 26, 8, 43, 54, 16, 7, 27, 20, 13, 2,
58  
59      0, 0, 41, 52, 31, 37, 47, 55, 0, 0, 30, 40, 51, 45, 33, 48, 0, 0, 44, 49, 39, 56, 34, 53, 0, 0, 46, 42, 50, 36, 29, 32 };
60  
61      private static final byte[][] S = { /* 48->32 bit substitution tables */
62              /* S[1] */
63              { 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9,
64               7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 },
65              /* S[2] */
66              { 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12,
67               6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 },
68              /* S[3] */
69              { 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2,
70               12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 },
71              /* S[4] */
72              { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3,
73               14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 },
74              /* S[5] */
75              { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12,
76               5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 },
77              /* S[6] */
78              { 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4,
79               10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 },
80              /* S[7] */
81              { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15,
82               6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 },
83              /* S[8] */
84              { 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10,
85               13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } };
86  
87      private static final byte[] P32Tr = { /* 32-bit permutation function */
88      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 };
89  
90      private static final byte[] CIFP = { /*
91                                               * compressed/interleaved
92                                               * permutation
93                                               */
94      1, 2, 3, 4, 17, 18, 19, 20, 5, 6, 7, 8, 21, 22, 23, 24, 9, 10, 11, 12, 25, 26, 27, 28, 13, 14, 15, 16, 29, 30, 31, 32,
95  
96      33, 34, 35, 36, 49, 50, 51, 52, 37, 38, 39, 40, 53, 54, 55, 56, 41, 42, 43, 44, 57, 58, 59, 60, 45, 46, 47, 48, 61, 62, 63, 64 };
97  
98      private static final byte[] ITOA64 = { /* 0..63 => ascii-64 */
99      (byte) '.', (byte) '/', (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'A',
100             (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M',
101             (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y',
102             (byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k',
103             (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w',
104             (byte) 'x', (byte) 'y', (byte) 'z' };
105 
106     /* ===== Tables that are initialized at run time ==================== */
107 
108     private static final byte[] A64TOI = new byte[128]; /* ascii-64 => 0..63 */
109 
110     /* Initial key schedule permutation */
111     private static final long[][] PC1ROT = new long[16][16];
112 
113     /* Subsequent key schedule rotation permutations */
114     private static final long[][][] PC2ROT = new long[2][16][16];
115 
116     /* Initial permutation/expansion table */
117     private static final long[][] IE3264 = new long[8][16];
118 
119     /* Table that combines the S, P, and E operations. */
120     private static final long[][] SPE = new long[8][64];
121 
122     /* compressed/interleaved => final permutation table */
123     private static final long[][] CF6464 = new long[16][16];
124 
125     /* ==================================== */
126 
127     static
128     {
129         byte[] perm = new byte[64];
130         byte[] temp = new byte[64];
131 
132         // inverse table.
133         for (int i = 0; i < 64; i++)
134             A64TOI[ITOA64[i]] = (byte) i;
135 
136         // PC1ROT - bit reverse, then PC1, then Rotate, then PC2
137         for (int i = 0; i < 64; i++)
138             perm[i] = (byte) 0;
139         
140         for (int i = 0; i < 64; i++)
141         {
142             int k;
143             if ((k = PC2[i]) == 0) continue;
144             k += Rotates[0] - 1;
145             if ((k % 28) < Rotates[0]) k -= 28;
146             k = PC1[k];
147             if (k > 0)
148             {
149                 k--;
150                 k = (k | 0x07) - (k & 0x07);
151                 k++;
152             }
153             perm[i] = (byte) k;
154         }
155         init_perm(PC1ROT, perm, 8);
156 
157         // PC2ROT - PC2 inverse, then Rotate, then PC2
158         for (int j = 0; j < 2; j++)
159         {
160             int k;
161             for (int i = 0; i < 64; i++)
162                 perm[i] = temp[i] = 0;
163             for (int i = 0; i < 64; i++)
164             {
165                 if ((k = PC2[i]) == 0) continue;
166                 temp[k - 1] = (byte) (i + 1);
167             }
168             for (int i = 0; i < 64; i++)
169             {
170                 if ((k = PC2[i]) == 0) continue;
171                 k += j;
172                 if ((k % 28) <= j) k -= 28;
173                 perm[i] = temp[k];
174             }
175 
176             init_perm(PC2ROT[j], perm, 8);
177         }
178 
179         // Bit reverse, intial permupation, expantion
180         for (int i = 0; i < 8; i++)
181         {
182             for (int j = 0; j < 8; j++)
183             {
184                 int k = (j < 2) ? 0 : IP[ExpandTr[i * 6 + j - 2] - 1];
185                 if (k > 32)
186                     k -= 32;
187                 else if (k > 0) k--;
188                 if (k > 0)
189                 {
190                     k--;
191                     k = (k | 0x07) - (k & 0x07);
192                     k++;
193                 }
194                 perm[i * 8 + j] = (byte) k;
195             }
196         }
197 
198         init_perm(IE3264, perm, 8);
199 
200         // Compression, final permutation, bit reverse
201         for (int i = 0; i < 64; i++)
202         {
203             int k = IP[CIFP[i] - 1];
204             if (k > 0)
205             {
206                 k--;
207                 k = (k | 0x07) - (k & 0x07);
208                 k++;
209             }
210             perm[k - 1] = (byte) (i + 1);
211         }
212 
213         init_perm(CF6464, perm, 8);
214 
215         // SPE table
216         for (int i = 0; i < 48; i++)
217             perm[i] = P32Tr[ExpandTr[i] - 1];
218         for (int t = 0; t < 8; t++)
219         {
220             for (int j = 0; j < 64; j++)
221             {
222                 int k = (((j >> 0) & 0x01) << 5) | (((j >> 1) & 0x01) << 3)
223                         | (((j >> 2) & 0x01) << 2)
224                         | (((j >> 3) & 0x01) << 1)
225                         | (((j >> 4) & 0x01) << 0)
226                         | (((j >> 5) & 0x01) << 4);
227                 k = S[t][k];
228                 k = (((k >> 3) & 0x01) << 0) | (((k >> 2) & 0x01) << 1) | (((k >> 1) & 0x01) << 2) | (((k >> 0) & 0x01) << 3);
229                 for (int i = 0; i < 32; i++)
230                     temp[i] = 0;
231                 for (int i = 0; i < 4; i++)
232                     temp[4 * t + i] = (byte) ((k >> i) & 0x01);
233                 long kk = 0;
234                 for (int i = 24; --i >= 0;)
235                     kk = ((kk << 1) | ((long) temp[perm[i] - 1]) << 32 | (temp[perm[i + 24] - 1]));
236 
237                 SPE[t][j] = to_six_bit(kk);
238             }
239         }
240     }
241 
242     /**
243      * You can't call the constructer.
244      */
245     private UnixCrypt()
246     {
247     }
248 
249     /**
250      * Returns the transposed and split code of a 24-bit code into a 4-byte
251      * code, each having 6 bits.
252      */
253     private static int to_six_bit(int num)
254     {
255         return (((num << 26) & 0xfc000000) | ((num << 12) & 0xfc0000) | ((num >> 2) & 0xfc00) | ((num >> 16) & 0xfc));
256     }
257 
258     /**
259      * Returns the transposed and split code of two 24-bit code into two 4-byte
260      * code, each having 6 bits.
261      */
262     private static long to_six_bit(long num)
263     {
264         return (((num << 26) & 0xfc000000fc000000L) | ((num << 12) & 0xfc000000fc0000L) | ((num >> 2) & 0xfc000000fc00L) | ((num >> 16) & 0xfc000000fcL));
265     }
266 
267     /**
268      * Returns the permutation of the given 64-bit code with the specified
269      * permutataion table.
270      */
271     private static long perm6464(long c, long[][] p)
272     {
273         long out = 0L;
274         for (int i = 8; --i >= 0;)
275         {
276             int t = (int) (0x00ff & c);
277             c >>= 8;
278             long tp = p[i << 1][t & 0x0f];
279             out |= tp;
280             tp = p[(i << 1) + 1][t >> 4];
281             out |= tp;
282         }
283         return out;
284     }
285 
286     /**
287      * Returns the permutation of the given 32-bit code with the specified
288      * permutataion table.
289      */
290     private static long perm3264(int c, long[][] p)
291     {
292         long out = 0L;
293         for (int i = 4; --i >= 0;)
294         {
295             int t = (0x00ff & c);
296             c >>= 8;
297             long tp = p[i << 1][t & 0x0f];
298             out |= tp;
299             tp = p[(i << 1) + 1][t >> 4];
300             out |= tp;
301         }
302         return out;
303     }
304 
305     /**
306      * Returns the key schedule for the given key.
307      */
308     private static long[] des_setkey(long keyword)
309     {
310         long K = perm6464(keyword, PC1ROT);
311         long[] KS = new long[16];
312         KS[0] = K & ~0x0303030300000000L;
313 
314         for (int i = 1; i < 16; i++)
315         {
316             KS[i] = K;
317             K = perm6464(K, PC2ROT[Rotates[i] - 1]);
318 
319             KS[i] = K & ~0x0303030300000000L;
320         }
321         return KS;
322     }
323 
324     /**
325      * Returns the DES encrypted code of the given word with the specified
326      * environment.
327      */
328     private static long des_cipher(long in, int salt, int num_iter, long[] KS)
329     {
330         salt = to_six_bit(salt);
331         long L = in;
332         long R = L;
333         L &= 0x5555555555555555L;
334         R = (R & 0xaaaaaaaa00000000L) | ((R >> 1) & 0x0000000055555555L);
335         L = ((((L << 1) | (L << 32)) & 0xffffffff00000000L) | ((R | (R >> 32)) & 0x00000000ffffffffL));
336 
337         L = perm3264((int) (L >> 32), IE3264);
338         R = perm3264((int) (L & 0xffffffff), IE3264);
339 
340         while (--num_iter >= 0)
341         {
342             for (int loop_count = 0; loop_count < 8; loop_count++)
343             {
344                 long kp;
345                 long B;
346                 long k;
347 
348                 kp = KS[(loop_count << 1)];
349                 k = ((R >> 32) ^ R) & salt & 0xffffffffL;
350                 k |= (k << 32);
351                 B = (k ^ R ^ kp);
352 
353                 L ^= (SPE[0][(int) ((B >> 58) & 0x3f)] ^ SPE[1][(int) ((B >> 50) & 0x3f)]
354                       ^ SPE[2][(int) ((B >> 42) & 0x3f)]
355                       ^ SPE[3][(int) ((B >> 34) & 0x3f)]
356                       ^ SPE[4][(int) ((B >> 26) & 0x3f)]
357                       ^ SPE[5][(int) ((B >> 18) & 0x3f)]
358                       ^ SPE[6][(int) ((B >> 10) & 0x3f)] ^ SPE[7][(int) ((B >> 2) & 0x3f)]);
359 
360                 kp = KS[(loop_count << 1) + 1];
361                 k = ((L >> 32) ^ L) & salt & 0xffffffffL;
362                 k |= (k << 32);
363                 B = (k ^ L ^ kp);
364 
365                 R ^= (SPE[0][(int) ((B >> 58) & 0x3f)] ^ SPE[1][(int) ((B >> 50) & 0x3f)]
366                       ^ SPE[2][(int) ((B >> 42) & 0x3f)]
367                       ^ SPE[3][(int) ((B >> 34) & 0x3f)]
368                       ^ SPE[4][(int) ((B >> 26) & 0x3f)]
369                       ^ SPE[5][(int) ((B >> 18) & 0x3f)]
370                       ^ SPE[6][(int) ((B >> 10) & 0x3f)] ^ SPE[7][(int) ((B >> 2) & 0x3f)]);
371             }
372             // swap L and R
373             L ^= R;
374             R ^= L;
375             L ^= R;
376         }
377         L = ((((L >> 35) & 0x0f0f0f0fL) | (((L & 0xffffffff) << 1) & 0xf0f0f0f0L)) << 32 | (((R >> 35) & 0x0f0f0f0fL) | (((R & 0xffffffff) << 1) & 0xf0f0f0f0L)));
378 
379         L = perm6464(L, CF6464);
380 
381         return L;
382     }
383 
384     /**
385      * Initializes the given permutation table with the mapping table.
386      */
387     private static void init_perm(long[][] perm, byte[] p, int chars_out)
388     {
389         for (int k = 0; k < chars_out * 8; k++)
390         {
391 
392             int l = p[k] - 1;
393             if (l < 0) continue;
394             int i = l >> 2;
395             l = 1 << (l & 0x03);
396             for (int j = 0; j < 16; j++)
397             {
398                 int s = ((k & 0x07) + ((7 - (k >> 3)) << 3));
399                 if ((j & l) != 0x00) perm[i][j] |= (1L << s);
400             }
401         }
402     }
403 
404     /**
405      * Encrypts String into crypt (Unix) code.
406      * 
407      * @param key the key to be encrypted
408      * @param setting the salt to be used
409      * @return the encrypted String
410      */
411     public static String crypt(String key, String setting)
412     {
413         long constdatablock = 0L; /* encryption constant */
414         byte[] cryptresult = new byte[13]; /* encrypted result */
415         long keyword = 0L;
416         /* invalid parameters! */
417         if (key == null || setting == null) return "*"; // will NOT match under
418         // ANY circumstances!
419 
420         int keylen = key.length();
421 
422         for (int i = 0; i < 8; i++)
423         {
424             keyword = (keyword << 8) | ((i < keylen) ? 2 * key.charAt(i) : 0);
425         }
426 
427         long[] KS = des_setkey(keyword);
428 
429         int salt = 0;
430         for (int i = 2; --i >= 0;)
431         {
432             char c = (i < setting.length()) ? setting.charAt(i) : '.';
433             cryptresult[i] = (byte) c;
434             salt = (salt << 6) | (0x00ff & A64TOI[c]);
435         }
436 
437         long rsltblock = des_cipher(constdatablock, salt, 25, KS);
438 
439         cryptresult[12] = ITOA64[(((int) rsltblock) << 2) & 0x3f];
440         rsltblock >>= 4;
441         for (int i = 12; --i >= 2;)
442         {
443             cryptresult[i] = ITOA64[((int) rsltblock) & 0x3f];
444             rsltblock >>= 6;
445         }
446 
447         return new String(cryptresult, 0, 13);
448     }
449 
450     public static void main(String[] arg)
451     {
452         if (arg.length != 2)
453         {
454             System.err.println("Usage - java org.eclipse.util.UnixCrypt <key> <salt>");
455             System.exit(1);
456         }
457 
458         System.err.println("Crypt=" + crypt(arg[0], arg[1]));
459     }
460 
461 }