103928aee4356845252ac6b662d5c72c29903813eJake Slack/* 203928aee4356845252ac6b662d5c72c29903813eJake Slack * @(#)UnixCrypt.java 0.9 96/11/25 303928aee4356845252ac6b662d5c72c29903813eJake Slack * 403928aee4356845252ac6b662d5c72c29903813eJake Slack * Copyright (c) 1996 Aki Yoshida. All rights reserved. 503928aee4356845252ac6b662d5c72c29903813eJake Slack * 603928aee4356845252ac6b662d5c72c29903813eJake Slack * Permission to use, copy, modify and distribute this software 703928aee4356845252ac6b662d5c72c29903813eJake Slack * for non-commercial or commercial purposes and without fee is 803928aee4356845252ac6b662d5c72c29903813eJake Slack * hereby granted provided that this copyright notice appears in 903928aee4356845252ac6b662d5c72c29903813eJake Slack * all copies. 1003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 1103928aee4356845252ac6b662d5c72c29903813eJake Slack 1203928aee4356845252ac6b662d5c72c29903813eJake Slack/** 1303928aee4356845252ac6b662d5c72c29903813eJake Slack * Unix crypt(3C) utility 1403928aee4356845252ac6b662d5c72c29903813eJake Slack * 1503928aee4356845252ac6b662d5c72c29903813eJake Slack * @version 0.9, 11/25/96 1603928aee4356845252ac6b662d5c72c29903813eJake Slack * @author Aki Yoshida 1703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 1803928aee4356845252ac6b662d5c72c29903813eJake Slack 1903928aee4356845252ac6b662d5c72c29903813eJake Slack/** 2003928aee4356845252ac6b662d5c72c29903813eJake Slack * modified April 2001 2103928aee4356845252ac6b662d5c72c29903813eJake Slack * by Iris Van den Broeke, Daniel Deville 2203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 2303928aee4356845252ac6b662d5c72c29903813eJake Slack 2403928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.util.security; 2503928aee4356845252ac6b662d5c72c29903813eJake Slack 2603928aee4356845252ac6b662d5c72c29903813eJake Slack 2703928aee4356845252ac6b662d5c72c29903813eJake Slack/* ------------------------------------------------------------ */ 2803928aee4356845252ac6b662d5c72c29903813eJake Slack/** 2903928aee4356845252ac6b662d5c72c29903813eJake Slack * Unix Crypt. Implements the one way cryptography used by Unix systems for 3003928aee4356845252ac6b662d5c72c29903813eJake Slack * simple password protection. 3103928aee4356845252ac6b662d5c72c29903813eJake Slack * 3203928aee4356845252ac6b662d5c72c29903813eJake Slack * @version $Id: UnixCrypt.java,v 1.1 2005/10/05 14:09:14 janb Exp $ 3303928aee4356845252ac6b662d5c72c29903813eJake Slack * @author Greg Wilkins (gregw) 3403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 3503928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class UnixCrypt 3603928aee4356845252ac6b662d5c72c29903813eJake Slack{ 3703928aee4356845252ac6b662d5c72c29903813eJake Slack 3803928aee4356845252ac6b662d5c72c29903813eJake Slack /* (mostly) Standard DES Tables from Tom Truscott */ 3903928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] IP = { /* initial permutation */ 4003928aee4356845252ac6b662d5c72c29903813eJake Slack 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, 4103928aee4356845252ac6b662d5c72c29903813eJake Slack 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; 4203928aee4356845252ac6b662d5c72c29903813eJake Slack 4303928aee4356845252ac6b662d5c72c29903813eJake Slack /* The final permutation is the inverse of IP - no table is necessary */ 4403928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] ExpandTr = { /* expansion operation */ 4503928aee4356845252ac6b662d5c72c29903813eJake Slack 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, 4603928aee4356845252ac6b662d5c72c29903813eJake Slack 28, 29, 30, 31, 32, 1 }; 4703928aee4356845252ac6b662d5c72c29903813eJake Slack 4803928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] PC1 = { /* permuted choice table 1 */ 4903928aee4356845252ac6b662d5c72c29903813eJake Slack 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, 5003928aee4356845252ac6b662d5c72c29903813eJake Slack 5103928aee4356845252ac6b662d5c72c29903813eJake Slack 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 }; 5203928aee4356845252ac6b662d5c72c29903813eJake Slack 5303928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] Rotates = { /* PC1 rotation schedule */ 5403928aee4356845252ac6b662d5c72c29903813eJake Slack 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; 5503928aee4356845252ac6b662d5c72c29903813eJake Slack 5603928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] PC2 = { /* permuted choice table 2 */ 5703928aee4356845252ac6b662d5c72c29903813eJake Slack 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, 5803928aee4356845252ac6b662d5c72c29903813eJake Slack 5903928aee4356845252ac6b662d5c72c29903813eJake Slack 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 }; 6003928aee4356845252ac6b662d5c72c29903813eJake Slack 6103928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[][] S = { /* 48->32 bit substitution tables */ 6203928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[1] */ 6303928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 6403928aee4356845252ac6b662d5c72c29903813eJake Slack 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 }, 6503928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[2] */ 6603928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 6703928aee4356845252ac6b662d5c72c29903813eJake Slack 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 }, 6803928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[3] */ 6903928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 7003928aee4356845252ac6b662d5c72c29903813eJake Slack 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 }, 7103928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[4] */ 7203928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 7303928aee4356845252ac6b662d5c72c29903813eJake Slack 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 }, 7403928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[5] */ 7503928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 7603928aee4356845252ac6b662d5c72c29903813eJake Slack 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 }, 7703928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[6] */ 7803928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 7903928aee4356845252ac6b662d5c72c29903813eJake Slack 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 }, 8003928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[7] */ 8103928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 8203928aee4356845252ac6b662d5c72c29903813eJake Slack 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 }, 8303928aee4356845252ac6b662d5c72c29903813eJake Slack /* S[8] */ 8403928aee4356845252ac6b662d5c72c29903813eJake Slack { 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, 8503928aee4356845252ac6b662d5c72c29903813eJake Slack 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } }; 8603928aee4356845252ac6b662d5c72c29903813eJake Slack 8703928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] P32Tr = { /* 32-bit permutation function */ 8803928aee4356845252ac6b662d5c72c29903813eJake Slack 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 }; 8903928aee4356845252ac6b662d5c72c29903813eJake Slack 9003928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] CIFP = { /* 9103928aee4356845252ac6b662d5c72c29903813eJake Slack * compressed/interleaved 9203928aee4356845252ac6b662d5c72c29903813eJake Slack * permutation 9303928aee4356845252ac6b662d5c72c29903813eJake Slack */ 9403928aee4356845252ac6b662d5c72c29903813eJake Slack 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, 9503928aee4356845252ac6b662d5c72c29903813eJake Slack 9603928aee4356845252ac6b662d5c72c29903813eJake Slack 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 }; 9703928aee4356845252ac6b662d5c72c29903813eJake Slack 9803928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] ITOA64 = { /* 0..63 => ascii-64 */ 9903928aee4356845252ac6b662d5c72c29903813eJake Slack (byte) '.', (byte) '/', (byte) '0', (byte) '1', (byte) '2', (byte) '3', (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) 'A', 10003928aee4356845252ac6b662d5c72c29903813eJake Slack (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G', (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M', 10103928aee4356845252ac6b662d5c72c29903813eJake Slack (byte) 'N', (byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U', (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', 10203928aee4356845252ac6b662d5c72c29903813eJake Slack (byte) 'Z', (byte) 'a', (byte) 'b', (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i', (byte) 'j', (byte) 'k', 10303928aee4356845252ac6b662d5c72c29903813eJake Slack (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p', (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w', 10403928aee4356845252ac6b662d5c72c29903813eJake Slack (byte) 'x', (byte) 'y', (byte) 'z' }; 10503928aee4356845252ac6b662d5c72c29903813eJake Slack 10603928aee4356845252ac6b662d5c72c29903813eJake Slack /* ===== Tables that are initialized at run time ==================== */ 10703928aee4356845252ac6b662d5c72c29903813eJake Slack 10803928aee4356845252ac6b662d5c72c29903813eJake Slack private static final byte[] A64TOI = new byte[128]; /* ascii-64 => 0..63 */ 10903928aee4356845252ac6b662d5c72c29903813eJake Slack 11003928aee4356845252ac6b662d5c72c29903813eJake Slack /* Initial key schedule permutation */ 11103928aee4356845252ac6b662d5c72c29903813eJake Slack private static final long[][] PC1ROT = new long[16][16]; 11203928aee4356845252ac6b662d5c72c29903813eJake Slack 11303928aee4356845252ac6b662d5c72c29903813eJake Slack /* Subsequent key schedule rotation permutations */ 11403928aee4356845252ac6b662d5c72c29903813eJake Slack private static final long[][][] PC2ROT = new long[2][16][16]; 11503928aee4356845252ac6b662d5c72c29903813eJake Slack 11603928aee4356845252ac6b662d5c72c29903813eJake Slack /* Initial permutation/expansion table */ 11703928aee4356845252ac6b662d5c72c29903813eJake Slack private static final long[][] IE3264 = new long[8][16]; 11803928aee4356845252ac6b662d5c72c29903813eJake Slack 11903928aee4356845252ac6b662d5c72c29903813eJake Slack /* Table that combines the S, P, and E operations. */ 12003928aee4356845252ac6b662d5c72c29903813eJake Slack private static final long[][] SPE = new long[8][64]; 12103928aee4356845252ac6b662d5c72c29903813eJake Slack 12203928aee4356845252ac6b662d5c72c29903813eJake Slack /* compressed/interleaved => final permutation table */ 12303928aee4356845252ac6b662d5c72c29903813eJake Slack private static final long[][] CF6464 = new long[16][16]; 12403928aee4356845252ac6b662d5c72c29903813eJake Slack 12503928aee4356845252ac6b662d5c72c29903813eJake Slack /* ==================================== */ 12603928aee4356845252ac6b662d5c72c29903813eJake Slack 12703928aee4356845252ac6b662d5c72c29903813eJake Slack static 12803928aee4356845252ac6b662d5c72c29903813eJake Slack { 12903928aee4356845252ac6b662d5c72c29903813eJake Slack byte[] perm = new byte[64]; 13003928aee4356845252ac6b662d5c72c29903813eJake Slack byte[] temp = new byte[64]; 13103928aee4356845252ac6b662d5c72c29903813eJake Slack 13203928aee4356845252ac6b662d5c72c29903813eJake Slack // inverse table. 13303928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 64; i++) 13403928aee4356845252ac6b662d5c72c29903813eJake Slack A64TOI[ITOA64[i]] = (byte) i; 13503928aee4356845252ac6b662d5c72c29903813eJake Slack 13603928aee4356845252ac6b662d5c72c29903813eJake Slack // PC1ROT - bit reverse, then PC1, then Rotate, then PC2 13703928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 64; i++) 13803928aee4356845252ac6b662d5c72c29903813eJake Slack perm[i] = (byte) 0; 13903928aee4356845252ac6b662d5c72c29903813eJake Slack 14003928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 64; i++) 14103928aee4356845252ac6b662d5c72c29903813eJake Slack { 14203928aee4356845252ac6b662d5c72c29903813eJake Slack int k; 14303928aee4356845252ac6b662d5c72c29903813eJake Slack if ((k = PC2[i]) == 0) continue; 14403928aee4356845252ac6b662d5c72c29903813eJake Slack k += Rotates[0] - 1; 14503928aee4356845252ac6b662d5c72c29903813eJake Slack if ((k % 28) < Rotates[0]) k -= 28; 14603928aee4356845252ac6b662d5c72c29903813eJake Slack k = PC1[k]; 14703928aee4356845252ac6b662d5c72c29903813eJake Slack if (k > 0) 14803928aee4356845252ac6b662d5c72c29903813eJake Slack { 14903928aee4356845252ac6b662d5c72c29903813eJake Slack k--; 15003928aee4356845252ac6b662d5c72c29903813eJake Slack k = (k | 0x07) - (k & 0x07); 15103928aee4356845252ac6b662d5c72c29903813eJake Slack k++; 15203928aee4356845252ac6b662d5c72c29903813eJake Slack } 15303928aee4356845252ac6b662d5c72c29903813eJake Slack perm[i] = (byte) k; 15403928aee4356845252ac6b662d5c72c29903813eJake Slack } 15503928aee4356845252ac6b662d5c72c29903813eJake Slack init_perm(PC1ROT, perm, 8); 15603928aee4356845252ac6b662d5c72c29903813eJake Slack 15703928aee4356845252ac6b662d5c72c29903813eJake Slack // PC2ROT - PC2 inverse, then Rotate, then PC2 15803928aee4356845252ac6b662d5c72c29903813eJake Slack for (int j = 0; j < 2; j++) 15903928aee4356845252ac6b662d5c72c29903813eJake Slack { 16003928aee4356845252ac6b662d5c72c29903813eJake Slack int k; 16103928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 64; i++) 16203928aee4356845252ac6b662d5c72c29903813eJake Slack perm[i] = temp[i] = 0; 16303928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 64; i++) 16403928aee4356845252ac6b662d5c72c29903813eJake Slack { 16503928aee4356845252ac6b662d5c72c29903813eJake Slack if ((k = PC2[i]) == 0) continue; 16603928aee4356845252ac6b662d5c72c29903813eJake Slack temp[k - 1] = (byte) (i + 1); 16703928aee4356845252ac6b662d5c72c29903813eJake Slack } 16803928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 64; i++) 16903928aee4356845252ac6b662d5c72c29903813eJake Slack { 17003928aee4356845252ac6b662d5c72c29903813eJake Slack if ((k = PC2[i]) == 0) continue; 17103928aee4356845252ac6b662d5c72c29903813eJake Slack k += j; 17203928aee4356845252ac6b662d5c72c29903813eJake Slack if ((k % 28) <= j) k -= 28; 17303928aee4356845252ac6b662d5c72c29903813eJake Slack perm[i] = temp[k]; 17403928aee4356845252ac6b662d5c72c29903813eJake Slack } 17503928aee4356845252ac6b662d5c72c29903813eJake Slack 17603928aee4356845252ac6b662d5c72c29903813eJake Slack init_perm(PC2ROT[j], perm, 8); 17703928aee4356845252ac6b662d5c72c29903813eJake Slack } 17803928aee4356845252ac6b662d5c72c29903813eJake Slack 17903928aee4356845252ac6b662d5c72c29903813eJake Slack // Bit reverse, intial permupation, expantion 18003928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 8; i++) 18103928aee4356845252ac6b662d5c72c29903813eJake Slack { 18203928aee4356845252ac6b662d5c72c29903813eJake Slack for (int j = 0; j < 8; j++) 18303928aee4356845252ac6b662d5c72c29903813eJake Slack { 18403928aee4356845252ac6b662d5c72c29903813eJake Slack int k = (j < 2) ? 0 : IP[ExpandTr[i * 6 + j - 2] - 1]; 18503928aee4356845252ac6b662d5c72c29903813eJake Slack if (k > 32) 18603928aee4356845252ac6b662d5c72c29903813eJake Slack k -= 32; 18703928aee4356845252ac6b662d5c72c29903813eJake Slack else if (k > 0) k--; 18803928aee4356845252ac6b662d5c72c29903813eJake Slack if (k > 0) 18903928aee4356845252ac6b662d5c72c29903813eJake Slack { 19003928aee4356845252ac6b662d5c72c29903813eJake Slack k--; 19103928aee4356845252ac6b662d5c72c29903813eJake Slack k = (k | 0x07) - (k & 0x07); 19203928aee4356845252ac6b662d5c72c29903813eJake Slack k++; 19303928aee4356845252ac6b662d5c72c29903813eJake Slack } 19403928aee4356845252ac6b662d5c72c29903813eJake Slack perm[i * 8 + j] = (byte) k; 19503928aee4356845252ac6b662d5c72c29903813eJake Slack } 19603928aee4356845252ac6b662d5c72c29903813eJake Slack } 19703928aee4356845252ac6b662d5c72c29903813eJake Slack 19803928aee4356845252ac6b662d5c72c29903813eJake Slack init_perm(IE3264, perm, 8); 19903928aee4356845252ac6b662d5c72c29903813eJake Slack 20003928aee4356845252ac6b662d5c72c29903813eJake Slack // Compression, final permutation, bit reverse 20103928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 64; i++) 20203928aee4356845252ac6b662d5c72c29903813eJake Slack { 20303928aee4356845252ac6b662d5c72c29903813eJake Slack int k = IP[CIFP[i] - 1]; 20403928aee4356845252ac6b662d5c72c29903813eJake Slack if (k > 0) 20503928aee4356845252ac6b662d5c72c29903813eJake Slack { 20603928aee4356845252ac6b662d5c72c29903813eJake Slack k--; 20703928aee4356845252ac6b662d5c72c29903813eJake Slack k = (k | 0x07) - (k & 0x07); 20803928aee4356845252ac6b662d5c72c29903813eJake Slack k++; 20903928aee4356845252ac6b662d5c72c29903813eJake Slack } 21003928aee4356845252ac6b662d5c72c29903813eJake Slack perm[k - 1] = (byte) (i + 1); 21103928aee4356845252ac6b662d5c72c29903813eJake Slack } 21203928aee4356845252ac6b662d5c72c29903813eJake Slack 21303928aee4356845252ac6b662d5c72c29903813eJake Slack init_perm(CF6464, perm, 8); 21403928aee4356845252ac6b662d5c72c29903813eJake Slack 21503928aee4356845252ac6b662d5c72c29903813eJake Slack // SPE table 21603928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 48; i++) 21703928aee4356845252ac6b662d5c72c29903813eJake Slack perm[i] = P32Tr[ExpandTr[i] - 1]; 21803928aee4356845252ac6b662d5c72c29903813eJake Slack for (int t = 0; t < 8; t++) 21903928aee4356845252ac6b662d5c72c29903813eJake Slack { 22003928aee4356845252ac6b662d5c72c29903813eJake Slack for (int j = 0; j < 64; j++) 22103928aee4356845252ac6b662d5c72c29903813eJake Slack { 22203928aee4356845252ac6b662d5c72c29903813eJake Slack int k = (((j >> 0) & 0x01) << 5) | (((j >> 1) & 0x01) << 3) 22303928aee4356845252ac6b662d5c72c29903813eJake Slack | (((j >> 2) & 0x01) << 2) 22403928aee4356845252ac6b662d5c72c29903813eJake Slack | (((j >> 3) & 0x01) << 1) 22503928aee4356845252ac6b662d5c72c29903813eJake Slack | (((j >> 4) & 0x01) << 0) 22603928aee4356845252ac6b662d5c72c29903813eJake Slack | (((j >> 5) & 0x01) << 4); 22703928aee4356845252ac6b662d5c72c29903813eJake Slack k = S[t][k]; 22803928aee4356845252ac6b662d5c72c29903813eJake Slack k = (((k >> 3) & 0x01) << 0) | (((k >> 2) & 0x01) << 1) | (((k >> 1) & 0x01) << 2) | (((k >> 0) & 0x01) << 3); 22903928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 32; i++) 23003928aee4356845252ac6b662d5c72c29903813eJake Slack temp[i] = 0; 23103928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 4; i++) 23203928aee4356845252ac6b662d5c72c29903813eJake Slack temp[4 * t + i] = (byte) ((k >> i) & 0x01); 23303928aee4356845252ac6b662d5c72c29903813eJake Slack long kk = 0; 23403928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 24; --i >= 0;) 23503928aee4356845252ac6b662d5c72c29903813eJake Slack kk = ((kk << 1) | ((long) temp[perm[i] - 1]) << 32 | (temp[perm[i + 24] - 1])); 23603928aee4356845252ac6b662d5c72c29903813eJake Slack 23703928aee4356845252ac6b662d5c72c29903813eJake Slack SPE[t][j] = to_six_bit(kk); 23803928aee4356845252ac6b662d5c72c29903813eJake Slack } 23903928aee4356845252ac6b662d5c72c29903813eJake Slack } 24003928aee4356845252ac6b662d5c72c29903813eJake Slack } 24103928aee4356845252ac6b662d5c72c29903813eJake Slack 24203928aee4356845252ac6b662d5c72c29903813eJake Slack /** 24303928aee4356845252ac6b662d5c72c29903813eJake Slack * You can't call the constructer. 24403928aee4356845252ac6b662d5c72c29903813eJake Slack */ 24503928aee4356845252ac6b662d5c72c29903813eJake Slack private UnixCrypt() 24603928aee4356845252ac6b662d5c72c29903813eJake Slack { 24703928aee4356845252ac6b662d5c72c29903813eJake Slack } 24803928aee4356845252ac6b662d5c72c29903813eJake Slack 24903928aee4356845252ac6b662d5c72c29903813eJake Slack /** 25003928aee4356845252ac6b662d5c72c29903813eJake Slack * Returns the transposed and split code of a 24-bit code into a 4-byte 25103928aee4356845252ac6b662d5c72c29903813eJake Slack * code, each having 6 bits. 25203928aee4356845252ac6b662d5c72c29903813eJake Slack */ 25303928aee4356845252ac6b662d5c72c29903813eJake Slack private static int to_six_bit(int num) 25403928aee4356845252ac6b662d5c72c29903813eJake Slack { 25503928aee4356845252ac6b662d5c72c29903813eJake Slack return (((num << 26) & 0xfc000000) | ((num << 12) & 0xfc0000) | ((num >> 2) & 0xfc00) | ((num >> 16) & 0xfc)); 25603928aee4356845252ac6b662d5c72c29903813eJake Slack } 25703928aee4356845252ac6b662d5c72c29903813eJake Slack 25803928aee4356845252ac6b662d5c72c29903813eJake Slack /** 25903928aee4356845252ac6b662d5c72c29903813eJake Slack * Returns the transposed and split code of two 24-bit code into two 4-byte 26003928aee4356845252ac6b662d5c72c29903813eJake Slack * code, each having 6 bits. 26103928aee4356845252ac6b662d5c72c29903813eJake Slack */ 26203928aee4356845252ac6b662d5c72c29903813eJake Slack private static long to_six_bit(long num) 26303928aee4356845252ac6b662d5c72c29903813eJake Slack { 26403928aee4356845252ac6b662d5c72c29903813eJake Slack return (((num << 26) & 0xfc000000fc000000L) | ((num << 12) & 0xfc000000fc0000L) | ((num >> 2) & 0xfc000000fc00L) | ((num >> 16) & 0xfc000000fcL)); 26503928aee4356845252ac6b662d5c72c29903813eJake Slack } 26603928aee4356845252ac6b662d5c72c29903813eJake Slack 26703928aee4356845252ac6b662d5c72c29903813eJake Slack /** 26803928aee4356845252ac6b662d5c72c29903813eJake Slack * Returns the permutation of the given 64-bit code with the specified 26903928aee4356845252ac6b662d5c72c29903813eJake Slack * permutataion table. 27003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 27103928aee4356845252ac6b662d5c72c29903813eJake Slack private static long perm6464(long c, long[][] p) 27203928aee4356845252ac6b662d5c72c29903813eJake Slack { 27303928aee4356845252ac6b662d5c72c29903813eJake Slack long out = 0L; 27403928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 8; --i >= 0;) 27503928aee4356845252ac6b662d5c72c29903813eJake Slack { 27603928aee4356845252ac6b662d5c72c29903813eJake Slack int t = (int) (0x00ff & c); 27703928aee4356845252ac6b662d5c72c29903813eJake Slack c >>= 8; 27803928aee4356845252ac6b662d5c72c29903813eJake Slack long tp = p[i << 1][t & 0x0f]; 27903928aee4356845252ac6b662d5c72c29903813eJake Slack out |= tp; 28003928aee4356845252ac6b662d5c72c29903813eJake Slack tp = p[(i << 1) + 1][t >> 4]; 28103928aee4356845252ac6b662d5c72c29903813eJake Slack out |= tp; 28203928aee4356845252ac6b662d5c72c29903813eJake Slack } 28303928aee4356845252ac6b662d5c72c29903813eJake Slack return out; 28403928aee4356845252ac6b662d5c72c29903813eJake Slack } 28503928aee4356845252ac6b662d5c72c29903813eJake Slack 28603928aee4356845252ac6b662d5c72c29903813eJake Slack /** 28703928aee4356845252ac6b662d5c72c29903813eJake Slack * Returns the permutation of the given 32-bit code with the specified 28803928aee4356845252ac6b662d5c72c29903813eJake Slack * permutataion table. 28903928aee4356845252ac6b662d5c72c29903813eJake Slack */ 29003928aee4356845252ac6b662d5c72c29903813eJake Slack private static long perm3264(int c, long[][] p) 29103928aee4356845252ac6b662d5c72c29903813eJake Slack { 29203928aee4356845252ac6b662d5c72c29903813eJake Slack long out = 0L; 29303928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 4; --i >= 0;) 29403928aee4356845252ac6b662d5c72c29903813eJake Slack { 29503928aee4356845252ac6b662d5c72c29903813eJake Slack int t = (0x00ff & c); 29603928aee4356845252ac6b662d5c72c29903813eJake Slack c >>= 8; 29703928aee4356845252ac6b662d5c72c29903813eJake Slack long tp = p[i << 1][t & 0x0f]; 29803928aee4356845252ac6b662d5c72c29903813eJake Slack out |= tp; 29903928aee4356845252ac6b662d5c72c29903813eJake Slack tp = p[(i << 1) + 1][t >> 4]; 30003928aee4356845252ac6b662d5c72c29903813eJake Slack out |= tp; 30103928aee4356845252ac6b662d5c72c29903813eJake Slack } 30203928aee4356845252ac6b662d5c72c29903813eJake Slack return out; 30303928aee4356845252ac6b662d5c72c29903813eJake Slack } 30403928aee4356845252ac6b662d5c72c29903813eJake Slack 30503928aee4356845252ac6b662d5c72c29903813eJake Slack /** 30603928aee4356845252ac6b662d5c72c29903813eJake Slack * Returns the key schedule for the given key. 30703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 30803928aee4356845252ac6b662d5c72c29903813eJake Slack private static long[] des_setkey(long keyword) 30903928aee4356845252ac6b662d5c72c29903813eJake Slack { 31003928aee4356845252ac6b662d5c72c29903813eJake Slack long K = perm6464(keyword, PC1ROT); 31103928aee4356845252ac6b662d5c72c29903813eJake Slack long[] KS = new long[16]; 31203928aee4356845252ac6b662d5c72c29903813eJake Slack KS[0] = K & ~0x0303030300000000L; 31303928aee4356845252ac6b662d5c72c29903813eJake Slack 31403928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 1; i < 16; i++) 31503928aee4356845252ac6b662d5c72c29903813eJake Slack { 31603928aee4356845252ac6b662d5c72c29903813eJake Slack KS[i] = K; 31703928aee4356845252ac6b662d5c72c29903813eJake Slack K = perm6464(K, PC2ROT[Rotates[i] - 1]); 31803928aee4356845252ac6b662d5c72c29903813eJake Slack 31903928aee4356845252ac6b662d5c72c29903813eJake Slack KS[i] = K & ~0x0303030300000000L; 32003928aee4356845252ac6b662d5c72c29903813eJake Slack } 32103928aee4356845252ac6b662d5c72c29903813eJake Slack return KS; 32203928aee4356845252ac6b662d5c72c29903813eJake Slack } 32303928aee4356845252ac6b662d5c72c29903813eJake Slack 32403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 32503928aee4356845252ac6b662d5c72c29903813eJake Slack * Returns the DES encrypted code of the given word with the specified 32603928aee4356845252ac6b662d5c72c29903813eJake Slack * environment. 32703928aee4356845252ac6b662d5c72c29903813eJake Slack */ 32803928aee4356845252ac6b662d5c72c29903813eJake Slack private static long des_cipher(long in, int salt, int num_iter, long[] KS) 32903928aee4356845252ac6b662d5c72c29903813eJake Slack { 33003928aee4356845252ac6b662d5c72c29903813eJake Slack salt = to_six_bit(salt); 33103928aee4356845252ac6b662d5c72c29903813eJake Slack long L = in; 33203928aee4356845252ac6b662d5c72c29903813eJake Slack long R = L; 33303928aee4356845252ac6b662d5c72c29903813eJake Slack L &= 0x5555555555555555L; 33403928aee4356845252ac6b662d5c72c29903813eJake Slack R = (R & 0xaaaaaaaa00000000L) | ((R >> 1) & 0x0000000055555555L); 33503928aee4356845252ac6b662d5c72c29903813eJake Slack L = ((((L << 1) | (L << 32)) & 0xffffffff00000000L) | ((R | (R >> 32)) & 0x00000000ffffffffL)); 33603928aee4356845252ac6b662d5c72c29903813eJake Slack 33703928aee4356845252ac6b662d5c72c29903813eJake Slack L = perm3264((int) (L >> 32), IE3264); 33803928aee4356845252ac6b662d5c72c29903813eJake Slack R = perm3264((int) (L & 0xffffffff), IE3264); 33903928aee4356845252ac6b662d5c72c29903813eJake Slack 34003928aee4356845252ac6b662d5c72c29903813eJake Slack while (--num_iter >= 0) 34103928aee4356845252ac6b662d5c72c29903813eJake Slack { 34203928aee4356845252ac6b662d5c72c29903813eJake Slack for (int loop_count = 0; loop_count < 8; loop_count++) 34303928aee4356845252ac6b662d5c72c29903813eJake Slack { 34403928aee4356845252ac6b662d5c72c29903813eJake Slack long kp; 34503928aee4356845252ac6b662d5c72c29903813eJake Slack long B; 34603928aee4356845252ac6b662d5c72c29903813eJake Slack long k; 34703928aee4356845252ac6b662d5c72c29903813eJake Slack 34803928aee4356845252ac6b662d5c72c29903813eJake Slack kp = KS[(loop_count << 1)]; 34903928aee4356845252ac6b662d5c72c29903813eJake Slack k = ((R >> 32) ^ R) & salt & 0xffffffffL; 35003928aee4356845252ac6b662d5c72c29903813eJake Slack k |= (k << 32); 35103928aee4356845252ac6b662d5c72c29903813eJake Slack B = (k ^ R ^ kp); 35203928aee4356845252ac6b662d5c72c29903813eJake Slack 35303928aee4356845252ac6b662d5c72c29903813eJake Slack L ^= (SPE[0][(int) ((B >> 58) & 0x3f)] ^ SPE[1][(int) ((B >> 50) & 0x3f)] 35403928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[2][(int) ((B >> 42) & 0x3f)] 35503928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[3][(int) ((B >> 34) & 0x3f)] 35603928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[4][(int) ((B >> 26) & 0x3f)] 35703928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[5][(int) ((B >> 18) & 0x3f)] 35803928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[6][(int) ((B >> 10) & 0x3f)] ^ SPE[7][(int) ((B >> 2) & 0x3f)]); 35903928aee4356845252ac6b662d5c72c29903813eJake Slack 36003928aee4356845252ac6b662d5c72c29903813eJake Slack kp = KS[(loop_count << 1) + 1]; 36103928aee4356845252ac6b662d5c72c29903813eJake Slack k = ((L >> 32) ^ L) & salt & 0xffffffffL; 36203928aee4356845252ac6b662d5c72c29903813eJake Slack k |= (k << 32); 36303928aee4356845252ac6b662d5c72c29903813eJake Slack B = (k ^ L ^ kp); 36403928aee4356845252ac6b662d5c72c29903813eJake Slack 36503928aee4356845252ac6b662d5c72c29903813eJake Slack R ^= (SPE[0][(int) ((B >> 58) & 0x3f)] ^ SPE[1][(int) ((B >> 50) & 0x3f)] 36603928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[2][(int) ((B >> 42) & 0x3f)] 36703928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[3][(int) ((B >> 34) & 0x3f)] 36803928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[4][(int) ((B >> 26) & 0x3f)] 36903928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[5][(int) ((B >> 18) & 0x3f)] 37003928aee4356845252ac6b662d5c72c29903813eJake Slack ^ SPE[6][(int) ((B >> 10) & 0x3f)] ^ SPE[7][(int) ((B >> 2) & 0x3f)]); 37103928aee4356845252ac6b662d5c72c29903813eJake Slack } 37203928aee4356845252ac6b662d5c72c29903813eJake Slack // swap L and R 37303928aee4356845252ac6b662d5c72c29903813eJake Slack L ^= R; 37403928aee4356845252ac6b662d5c72c29903813eJake Slack R ^= L; 37503928aee4356845252ac6b662d5c72c29903813eJake Slack L ^= R; 37603928aee4356845252ac6b662d5c72c29903813eJake Slack } 37703928aee4356845252ac6b662d5c72c29903813eJake Slack L = ((((L >> 35) & 0x0f0f0f0fL) | (((L & 0xffffffff) << 1) & 0xf0f0f0f0L)) << 32 | (((R >> 35) & 0x0f0f0f0fL) | (((R & 0xffffffff) << 1) & 0xf0f0f0f0L))); 37803928aee4356845252ac6b662d5c72c29903813eJake Slack 37903928aee4356845252ac6b662d5c72c29903813eJake Slack L = perm6464(L, CF6464); 38003928aee4356845252ac6b662d5c72c29903813eJake Slack 38103928aee4356845252ac6b662d5c72c29903813eJake Slack return L; 38203928aee4356845252ac6b662d5c72c29903813eJake Slack } 38303928aee4356845252ac6b662d5c72c29903813eJake Slack 38403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 38503928aee4356845252ac6b662d5c72c29903813eJake Slack * Initializes the given permutation table with the mapping table. 38603928aee4356845252ac6b662d5c72c29903813eJake Slack */ 38703928aee4356845252ac6b662d5c72c29903813eJake Slack private static void init_perm(long[][] perm, byte[] p, int chars_out) 38803928aee4356845252ac6b662d5c72c29903813eJake Slack { 38903928aee4356845252ac6b662d5c72c29903813eJake Slack for (int k = 0; k < chars_out * 8; k++) 39003928aee4356845252ac6b662d5c72c29903813eJake Slack { 39103928aee4356845252ac6b662d5c72c29903813eJake Slack 39203928aee4356845252ac6b662d5c72c29903813eJake Slack int l = p[k] - 1; 39303928aee4356845252ac6b662d5c72c29903813eJake Slack if (l < 0) continue; 39403928aee4356845252ac6b662d5c72c29903813eJake Slack int i = l >> 2; 39503928aee4356845252ac6b662d5c72c29903813eJake Slack l = 1 << (l & 0x03); 39603928aee4356845252ac6b662d5c72c29903813eJake Slack for (int j = 0; j < 16; j++) 39703928aee4356845252ac6b662d5c72c29903813eJake Slack { 39803928aee4356845252ac6b662d5c72c29903813eJake Slack int s = ((k & 0x07) + ((7 - (k >> 3)) << 3)); 39903928aee4356845252ac6b662d5c72c29903813eJake Slack if ((j & l) != 0x00) perm[i][j] |= (1L << s); 40003928aee4356845252ac6b662d5c72c29903813eJake Slack } 40103928aee4356845252ac6b662d5c72c29903813eJake Slack } 40203928aee4356845252ac6b662d5c72c29903813eJake Slack } 40303928aee4356845252ac6b662d5c72c29903813eJake Slack 40403928aee4356845252ac6b662d5c72c29903813eJake Slack /** 40503928aee4356845252ac6b662d5c72c29903813eJake Slack * Encrypts String into crypt (Unix) code. 40603928aee4356845252ac6b662d5c72c29903813eJake Slack * 40703928aee4356845252ac6b662d5c72c29903813eJake Slack * @param key the key to be encrypted 40803928aee4356845252ac6b662d5c72c29903813eJake Slack * @param setting the salt to be used 40903928aee4356845252ac6b662d5c72c29903813eJake Slack * @return the encrypted String 41003928aee4356845252ac6b662d5c72c29903813eJake Slack */ 41103928aee4356845252ac6b662d5c72c29903813eJake Slack public static String crypt(String key, String setting) 41203928aee4356845252ac6b662d5c72c29903813eJake Slack { 41303928aee4356845252ac6b662d5c72c29903813eJake Slack long constdatablock = 0L; /* encryption constant */ 41403928aee4356845252ac6b662d5c72c29903813eJake Slack byte[] cryptresult = new byte[13]; /* encrypted result */ 41503928aee4356845252ac6b662d5c72c29903813eJake Slack long keyword = 0L; 41603928aee4356845252ac6b662d5c72c29903813eJake Slack /* invalid parameters! */ 41703928aee4356845252ac6b662d5c72c29903813eJake Slack if (key == null || setting == null) return "*"; // will NOT match under 41803928aee4356845252ac6b662d5c72c29903813eJake Slack // ANY circumstances! 41903928aee4356845252ac6b662d5c72c29903813eJake Slack 42003928aee4356845252ac6b662d5c72c29903813eJake Slack int keylen = key.length(); 42103928aee4356845252ac6b662d5c72c29903813eJake Slack 42203928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 0; i < 8; i++) 42303928aee4356845252ac6b662d5c72c29903813eJake Slack { 42403928aee4356845252ac6b662d5c72c29903813eJake Slack keyword = (keyword << 8) | ((i < keylen) ? 2 * key.charAt(i) : 0); 42503928aee4356845252ac6b662d5c72c29903813eJake Slack } 42603928aee4356845252ac6b662d5c72c29903813eJake Slack 42703928aee4356845252ac6b662d5c72c29903813eJake Slack long[] KS = des_setkey(keyword); 42803928aee4356845252ac6b662d5c72c29903813eJake Slack 42903928aee4356845252ac6b662d5c72c29903813eJake Slack int salt = 0; 43003928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 2; --i >= 0;) 43103928aee4356845252ac6b662d5c72c29903813eJake Slack { 43203928aee4356845252ac6b662d5c72c29903813eJake Slack char c = (i < setting.length()) ? setting.charAt(i) : '.'; 43303928aee4356845252ac6b662d5c72c29903813eJake Slack cryptresult[i] = (byte) c; 43403928aee4356845252ac6b662d5c72c29903813eJake Slack salt = (salt << 6) | (0x00ff & A64TOI[c]); 43503928aee4356845252ac6b662d5c72c29903813eJake Slack } 43603928aee4356845252ac6b662d5c72c29903813eJake Slack 43703928aee4356845252ac6b662d5c72c29903813eJake Slack long rsltblock = des_cipher(constdatablock, salt, 25, KS); 43803928aee4356845252ac6b662d5c72c29903813eJake Slack 43903928aee4356845252ac6b662d5c72c29903813eJake Slack cryptresult[12] = ITOA64[(((int) rsltblock) << 2) & 0x3f]; 44003928aee4356845252ac6b662d5c72c29903813eJake Slack rsltblock >>= 4; 44103928aee4356845252ac6b662d5c72c29903813eJake Slack for (int i = 12; --i >= 2;) 44203928aee4356845252ac6b662d5c72c29903813eJake Slack { 44303928aee4356845252ac6b662d5c72c29903813eJake Slack cryptresult[i] = ITOA64[((int) rsltblock) & 0x3f]; 44403928aee4356845252ac6b662d5c72c29903813eJake Slack rsltblock >>= 6; 44503928aee4356845252ac6b662d5c72c29903813eJake Slack } 44603928aee4356845252ac6b662d5c72c29903813eJake Slack 44703928aee4356845252ac6b662d5c72c29903813eJake Slack return new String(cryptresult, 0, 13); 44803928aee4356845252ac6b662d5c72c29903813eJake Slack } 44903928aee4356845252ac6b662d5c72c29903813eJake Slack 45003928aee4356845252ac6b662d5c72c29903813eJake Slack public static void main(String[] arg) 45103928aee4356845252ac6b662d5c72c29903813eJake Slack { 45203928aee4356845252ac6b662d5c72c29903813eJake Slack if (arg.length != 2) 45303928aee4356845252ac6b662d5c72c29903813eJake Slack { 45403928aee4356845252ac6b662d5c72c29903813eJake Slack System.err.println("Usage - java org.eclipse.util.UnixCrypt <key> <salt>"); 45503928aee4356845252ac6b662d5c72c29903813eJake Slack System.exit(1); 45603928aee4356845252ac6b662d5c72c29903813eJake Slack } 45703928aee4356845252ac6b662d5c72c29903813eJake Slack 45803928aee4356845252ac6b662d5c72c29903813eJake Slack System.err.println("Crypt=" + crypt(arg[0], arg[1])); 45903928aee4356845252ac6b662d5c72c29903813eJake Slack } 46003928aee4356845252ac6b662d5c72c29903813eJake Slack 46103928aee4356845252ac6b662d5c72c29903813eJake Slack} 462