UnixCrypt.java
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:26k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. package postgresql.util;
  2. /**
  3.  * This class provides us with the ability to encrypt passwords when sent
  4.  * over the network stream
  5.  *
  6.  * <P>Contains static methods to encrypt and compare
  7.  * passwords with Unix encrypted passwords.</P>
  8.  *
  9.  * <P>See <A HREF="http://www.zeh.com/local/jfd/crypt.html">
  10.  * John Dumas's Java Crypt page</A> for the original source.</P>
  11.  *
  12.  * @author jdumas@zgs.com (John Dumas)
  13.  */
  14. public class UnixCrypt extends Object
  15. {
  16.   //
  17.   // Null constructor - can't instantiate class
  18.   private UnixCrypt()
  19.   {
  20.   }
  21.   
  22.   private static final char[] saltChars =
  23.   ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./".toCharArray());
  24.   
  25.   private static final int ITERATIONS = 16;
  26.   
  27.   private static final int con_salt[] =
  28.   {
  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.   
  47.   private static final boolean shifts2[] =
  48.   {
  49.     false, false, true, true, true, true, true, true,
  50.     false, true,  true, true, true, true, true, false
  51.   };
  52.    private static final int skb[][] =
  53.    {
  54.       {
  55.          /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  56.          0x00000000, 0x00000010, 0x20000000, 0x20000010, 
  57.          0x00010000, 0x00010010, 0x20010000, 0x20010010, 
  58.          0x00000800, 0x00000810, 0x20000800, 0x20000810, 
  59.          0x00010800, 0x00010810, 0x20010800, 0x20010810, 
  60.          0x00000020, 0x00000030, 0x20000020, 0x20000030, 
  61.          0x00010020, 0x00010030, 0x20010020, 0x20010030, 
  62.          0x00000820, 0x00000830, 0x20000820, 0x20000830, 
  63.          0x00010820, 0x00010830, 0x20010820, 0x20010830, 
  64.          0x00080000, 0x00080010, 0x20080000, 0x20080010, 
  65.          0x00090000, 0x00090010, 0x20090000, 0x20090010, 
  66.          0x00080800, 0x00080810, 0x20080800, 0x20080810, 
  67.          0x00090800, 0x00090810, 0x20090800, 0x20090810, 
  68.          0x00080020, 0x00080030, 0x20080020, 0x20080030, 
  69.          0x00090020, 0x00090030, 0x20090020, 0x20090030, 
  70.          0x00080820, 0x00080830, 0x20080820, 0x20080830, 
  71.          0x00090820, 0x00090830, 0x20090820, 0x20090830, 
  72.       },
  73.       {
  74.          /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
  75.          0x00000000, 0x02000000, 0x00002000, 0x02002000, 
  76.          0x00200000, 0x02200000, 0x00202000, 0x02202000, 
  77.          0x00000004, 0x02000004, 0x00002004, 0x02002004, 
  78.          0x00200004, 0x02200004, 0x00202004, 0x02202004, 
  79.          0x00000400, 0x02000400, 0x00002400, 0x02002400, 
  80.          0x00200400, 0x02200400, 0x00202400, 0x02202400, 
  81.          0x00000404, 0x02000404, 0x00002404, 0x02002404, 
  82.          0x00200404, 0x02200404, 0x00202404, 0x02202404, 
  83.          0x10000000, 0x12000000, 0x10002000, 0x12002000, 
  84.          0x10200000, 0x12200000, 0x10202000, 0x12202000, 
  85.          0x10000004, 0x12000004, 0x10002004, 0x12002004, 
  86.          0x10200004, 0x12200004, 0x10202004, 0x12202004, 
  87.          0x10000400, 0x12000400, 0x10002400, 0x12002400, 
  88.          0x10200400, 0x12200400, 0x10202400, 0x12202400, 
  89.          0x10000404, 0x12000404, 0x10002404, 0x12002404, 
  90.          0x10200404, 0x12200404, 0x10202404, 0x12202404, 
  91.       },
  92.       {
  93.          /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
  94.          0x00000000, 0x00000001, 0x00040000, 0x00040001, 
  95.          0x01000000, 0x01000001, 0x01040000, 0x01040001, 
  96.          0x00000002, 0x00000003, 0x00040002, 0x00040003, 
  97.          0x01000002, 0x01000003, 0x01040002, 0x01040003, 
  98.          0x00000200, 0x00000201, 0x00040200, 0x00040201, 
  99.          0x01000200, 0x01000201, 0x01040200, 0x01040201, 
  100.          0x00000202, 0x00000203, 0x00040202, 0x00040203, 
  101.          0x01000202, 0x01000203, 0x01040202, 0x01040203, 
  102.          0x08000000, 0x08000001, 0x08040000, 0x08040001, 
  103.          0x09000000, 0x09000001, 0x09040000, 0x09040001, 
  104.          0x08000002, 0x08000003, 0x08040002, 0x08040003, 
  105.          0x09000002, 0x09000003, 0x09040002, 0x09040003, 
  106.          0x08000200, 0x08000201, 0x08040200, 0x08040201, 
  107.          0x09000200, 0x09000201, 0x09040200, 0x09040201, 
  108.          0x08000202, 0x08000203, 0x08040202, 0x08040203, 
  109.          0x09000202, 0x09000203, 0x09040202, 0x09040203, 
  110.       },
  111.       {
  112.          /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
  113.          0x00000000, 0x00100000, 0x00000100, 0x00100100, 
  114.          0x00000008, 0x00100008, 0x00000108, 0x00100108, 
  115.          0x00001000, 0x00101000, 0x00001100, 0x00101100, 
  116.          0x00001008, 0x00101008, 0x00001108, 0x00101108, 
  117.          0x04000000, 0x04100000, 0x04000100, 0x04100100, 
  118.          0x04000008, 0x04100008, 0x04000108, 0x04100108, 
  119.          0x04001000, 0x04101000, 0x04001100, 0x04101100, 
  120.          0x04001008, 0x04101008, 0x04001108, 0x04101108, 
  121.          0x00020000, 0x00120000, 0x00020100, 0x00120100, 
  122.          0x00020008, 0x00120008, 0x00020108, 0x00120108, 
  123.          0x00021000, 0x00121000, 0x00021100, 0x00121100, 
  124.          0x00021008, 0x00121008, 0x00021108, 0x00121108, 
  125.          0x04020000, 0x04120000, 0x04020100, 0x04120100, 
  126.          0x04020008, 0x04120008, 0x04020108, 0x04120108, 
  127.          0x04021000, 0x04121000, 0x04021100, 0x04121100, 
  128.          0x04021008, 0x04121008, 0x04021108, 0x04121108, 
  129.       },
  130.       {
  131.          /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
  132.          0x00000000, 0x10000000, 0x00010000, 0x10010000, 
  133.          0x00000004, 0x10000004, 0x00010004, 0x10010004, 
  134.          0x20000000, 0x30000000, 0x20010000, 0x30010000, 
  135.          0x20000004, 0x30000004, 0x20010004, 0x30010004, 
  136.          0x00100000, 0x10100000, 0x00110000, 0x10110000, 
  137.          0x00100004, 0x10100004, 0x00110004, 0x10110004, 
  138.          0x20100000, 0x30100000, 0x20110000, 0x30110000, 
  139.          0x20100004, 0x30100004, 0x20110004, 0x30110004, 
  140.          0x00001000, 0x10001000, 0x00011000, 0x10011000, 
  141.          0x00001004, 0x10001004, 0x00011004, 0x10011004, 
  142.          0x20001000, 0x30001000, 0x20011000, 0x30011000, 
  143.          0x20001004, 0x30001004, 0x20011004, 0x30011004, 
  144.          0x00101000, 0x10101000, 0x00111000, 0x10111000, 
  145.          0x00101004, 0x10101004, 0x00111004, 0x10111004, 
  146.          0x20101000, 0x30101000, 0x20111000, 0x30111000, 
  147.          0x20101004, 0x30101004, 0x20111004, 0x30111004, 
  148.       },
  149.       {
  150.          /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
  151.          0x00000000, 0x08000000, 0x00000008, 0x08000008, 
  152.          0x00000400, 0x08000400, 0x00000408, 0x08000408, 
  153.          0x00020000, 0x08020000, 0x00020008, 0x08020008, 
  154.          0x00020400, 0x08020400, 0x00020408, 0x08020408, 
  155.          0x00000001, 0x08000001, 0x00000009, 0x08000009, 
  156.          0x00000401, 0x08000401, 0x00000409, 0x08000409, 
  157.          0x00020001, 0x08020001, 0x00020009, 0x08020009, 
  158.          0x00020401, 0x08020401, 0x00020409, 0x08020409, 
  159.          0x02000000, 0x0A000000, 0x02000008, 0x0A000008, 
  160.          0x02000400, 0x0A000400, 0x02000408, 0x0A000408, 
  161.          0x02020000, 0x0A020000, 0x02020008, 0x0A020008, 
  162.          0x02020400, 0x0A020400, 0x02020408, 0x0A020408, 
  163.          0x02000001, 0x0A000001, 0x02000009, 0x0A000009, 
  164.          0x02000401, 0x0A000401, 0x02000409, 0x0A000409, 
  165.          0x02020001, 0x0A020001, 0x02020009, 0x0A020009, 
  166.          0x02020401, 0x0A020401, 0x02020409, 0x0A020409, 
  167.       },
  168.       {
  169.          /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
  170.          0x00000000, 0x00000100, 0x00080000, 0x00080100, 
  171.          0x01000000, 0x01000100, 0x01080000, 0x01080100, 
  172.          0x00000010, 0x00000110, 0x00080010, 0x00080110, 
  173.          0x01000010, 0x01000110, 0x01080010, 0x01080110, 
  174.          0x00200000, 0x00200100, 0x00280000, 0x00280100, 
  175.          0x01200000, 0x01200100, 0x01280000, 0x01280100, 
  176.          0x00200010, 0x00200110, 0x00280010, 0x00280110, 
  177.          0x01200010, 0x01200110, 0x01280010, 0x01280110, 
  178.          0x00000200, 0x00000300, 0x00080200, 0x00080300, 
  179.          0x01000200, 0x01000300, 0x01080200, 0x01080300, 
  180.          0x00000210, 0x00000310, 0x00080210, 0x00080310, 
  181.          0x01000210, 0x01000310, 0x01080210, 0x01080310, 
  182.          0x00200200, 0x00200300, 0x00280200, 0x00280300, 
  183.          0x01200200, 0x01200300, 0x01280200, 0x01280300, 
  184.          0x00200210, 0x00200310, 0x00280210, 0x00280310, 
  185.          0x01200210, 0x01200310, 0x01280210, 0x01280310, 
  186.       },
  187.       {
  188.          /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
  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.    };
  207.    private static final int SPtrans[][] =
  208.    {
  209.       {
  210.          /* nibble 0 */
  211.          0x00820200, 0x00020000, 0x80800000, 0x80820200,
  212.          0x00800000, 0x80020200, 0x80020000, 0x80800000,
  213.          0x80020200, 0x00820200, 0x00820000, 0x80000200,
  214.          0x80800200, 0x00800000, 0x00000000, 0x80020000,
  215.          0x00020000, 0x80000000, 0x00800200, 0x00020200,
  216.          0x80820200, 0x00820000, 0x80000200, 0x00800200,
  217.          0x80000000, 0x00000200, 0x00020200, 0x80820000,
  218.          0x00000200, 0x80800200, 0x80820000, 0x00000000,
  219.          0x00000000, 0x80820200, 0x00800200, 0x80020000,
  220.          0x00820200, 0x00020000, 0x80000200, 0x00800200,
  221.          0x80820000, 0x00000200, 0x00020200, 0x80800000,
  222.          0x80020200, 0x80000000, 0x80800000, 0x00820000,
  223.          0x80820200, 0x00020200, 0x00820000, 0x80800200,
  224.          0x00800000, 0x80000200, 0x80020000, 0x00000000,
  225.          0x00020000, 0x00800000, 0x80800200, 0x00820200,
  226.          0x80000000, 0x80820000, 0x00000200, 0x80020200,
  227.       },
  228.       {
  229.          /* nibble 1 */
  230.          0x10042004, 0x00000000, 0x00042000, 0x10040000,
  231.          0x10000004, 0x00002004, 0x10002000, 0x00042000,
  232.          0x00002000, 0x10040004, 0x00000004, 0x10002000,
  233.          0x00040004, 0x10042000, 0x10040000, 0x00000004,
  234.          0x00040000, 0x10002004, 0x10040004, 0x00002000,
  235.          0x00042004, 0x10000000, 0x00000000, 0x00040004,
  236.          0x10002004, 0x00042004, 0x10042000, 0x10000004,
  237.          0x10000000, 0x00040000, 0x00002004, 0x10042004,
  238.          0x00040004, 0x10042000, 0x10002000, 0x00042004,
  239.          0x10042004, 0x00040004, 0x10000004, 0x00000000,
  240.          0x10000000, 0x00002004, 0x00040000, 0x10040004,
  241.          0x00002000, 0x10000000, 0x00042004, 0x10002004,
  242.          0x10042000, 0x00002000, 0x00000000, 0x10000004,
  243.          0x00000004, 0x10042004, 0x00042000, 0x10040000,
  244.          0x10040004, 0x00040000, 0x00002004, 0x10002000,
  245.          0x10002004, 0x00000004, 0x10040000, 0x00042000,
  246.       },
  247.       {
  248.          /* nibble 2 */
  249.          0x41000000, 0x01010040, 0x00000040, 0x41000040,
  250.          0x40010000, 0x01000000, 0x41000040, 0x00010040,
  251.          0x01000040, 0x00010000, 0x01010000, 0x40000000,
  252.          0x41010040, 0x40000040, 0x40000000, 0x41010000,
  253.          0x00000000, 0x40010000, 0x01010040, 0x00000040,
  254.          0x40000040, 0x41010040, 0x00010000, 0x41000000,
  255.          0x41010000, 0x01000040, 0x40010040, 0x01010000,
  256.          0x00010040, 0x00000000, 0x01000000, 0x40010040,
  257.          0x01010040, 0x00000040, 0x40000000, 0x00010000,
  258.          0x40000040, 0x40010000, 0x01010000, 0x41000040,
  259.          0x00000000, 0x01010040, 0x00010040, 0x41010000,
  260.          0x40010000, 0x01000000, 0x41010040, 0x40000000,
  261.          0x40010040, 0x41000000, 0x01000000, 0x41010040,
  262.          0x00010000, 0x01000040, 0x41000040, 0x00010040,
  263.          0x01000040, 0x00000000, 0x41010000, 0x40000040,
  264.          0x41000000, 0x40010040, 0x00000040, 0x01010000,
  265.       },
  266.       {
  267.          /* nibble 3 */
  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.          /* nibble 4 */
  287.          0x02000000, 0x00004000, 0x00000100, 0x02004108,
  288.          0x02004008, 0x02000100, 0x00004108, 0x02004000,
  289.          0x00004000, 0x00000008, 0x02000008, 0x00004100,
  290.          0x02000108, 0x02004008, 0x02004100, 0x00000000,
  291.          0x00004100, 0x02000000, 0x00004008, 0x00000108,
  292.          0x02000100, 0x00004108, 0x00000000, 0x02000008,
  293.          0x00000008, 0x02000108, 0x02004108, 0x00004008,
  294.          0x02004000, 0x00000100, 0x00000108, 0x02004100,
  295.          0x02004100, 0x02000108, 0x00004008, 0x02004000,
  296.          0x00004000, 0x00000008, 0x02000008, 0x02000100,
  297.          0x02000000, 0x00004100, 0x02004108, 0x00000000,
  298.          0x00004108, 0x02000000, 0x00000100, 0x00004008,
  299.          0x02000108, 0x00000100, 0x00000000, 0x02004108,
  300.          0x02004008, 0x02004100, 0x00000108, 0x00004000,
  301.          0x00004100, 0x02004008, 0x02000100, 0x00000108,
  302.          0x00000008, 0x00004108, 0x02004000, 0x02000008,
  303.       },
  304.       {
  305.          /* nibble 5 */
  306.          0x20000010, 0x00080010, 0x00000000, 0x20080800,
  307.          0x00080010, 0x00000800, 0x20000810, 0x00080000,
  308.          0x00000810, 0x20080810, 0x00080800, 0x20000000,
  309.          0x20000800, 0x20000010, 0x20080000, 0x00080810,
  310.          0x00080000, 0x20000810, 0x20080010, 0x00000000,
  311.          0x00000800, 0x00000010, 0x20080800, 0x20080010,
  312.          0x20080810, 0x20080000, 0x20000000, 0x00000810,
  313.          0x00000010, 0x00080800, 0x00080810, 0x20000800,
  314.          0x00000810, 0x20000000, 0x20000800, 0x00080810,
  315.          0x20080800, 0x00080010, 0x00000000, 0x20000800,
  316.          0x20000000, 0x00000800, 0x20080010, 0x00080000,
  317.          0x00080010, 0x20080810, 0x00080800, 0x00000010,
  318.          0x20080810, 0x00080800, 0x00080000, 0x20000810,
  319.          0x20000010, 0x20080000, 0x00080810, 0x00000000,
  320.          0x00000800, 0x20000010, 0x20000810, 0x20080800,
  321.          0x20080000, 0x00000810, 0x00000010, 0x20080010,
  322.       },
  323.       {
  324.          /* nibble 6 */
  325.          0x00001000, 0x00000080, 0x00400080, 0x00400001,
  326.          0x00401081, 0x00001001, 0x00001080, 0x00000000,
  327.          0x00400000, 0x00400081, 0x00000081, 0x00401000,
  328.          0x00000001, 0x00401080, 0x00401000, 0x00000081,
  329.          0x00400081, 0x00001000, 0x00001001, 0x00401081,
  330.          0x00000000, 0x00400080, 0x00400001, 0x00001080,
  331.          0x00401001, 0x00001081, 0x00401080, 0x00000001,
  332.          0x00001081, 0x00401001, 0x00000080, 0x00400000,
  333.          0x00001081, 0x00401000, 0x00401001, 0x00000081,
  334.          0x00001000, 0x00000080, 0x00400000, 0x00401001,
  335.          0x00400081, 0x00001081, 0x00001080, 0x00000000,
  336.          0x00000080, 0x00400001, 0x00000001, 0x00400080,
  337.          0x00000000, 0x00400081, 0x00400080, 0x00001080,
  338.          0x00000081, 0x00001000, 0x00401081, 0x00400000,
  339.          0x00401080, 0x00000001, 0x00001001, 0x00401081,
  340.          0x00400001, 0x00401080, 0x00401000, 0x00001001,
  341.       },
  342.       {
  343.          /* nibble 7 */
  344.          0x08200020, 0x08208000, 0x00008020, 0x00000000,
  345.          0x08008000, 0x00200020, 0x08200000, 0x08208020,
  346.          0x00000020, 0x08000000, 0x00208000, 0x00008020,
  347.          0x00208020, 0x08008020, 0x08000020, 0x08200000,
  348.          0x00008000, 0x00208020, 0x00200020, 0x08008000,
  349.          0x08208020, 0x08000020, 0x00000000, 0x00208000,
  350.          0x08000000, 0x00200000, 0x08008020, 0x08200020,
  351.          0x00200000, 0x00008000, 0x08208000, 0x00000020,
  352.          0x00200000, 0x00008000, 0x08000020, 0x08208020,
  353.          0x00008020, 0x08000000, 0x00000000, 0x00208000,
  354.          0x08200020, 0x08008020, 0x08008000, 0x00200020,
  355.          0x08208000, 0x00000020, 0x00200020, 0x08008000,
  356.          0x08208020, 0x00200000, 0x08200000, 0x08000020,
  357.          0x00208000, 0x00008020, 0x08008020, 0x08200000,
  358.          0x00000020, 0x08208000, 0x00208020, 0x00000000,
  359.          0x08000000, 0x08200020, 0x00008000, 0x00208020
  360.       }
  361.    };
  362.    private static final int cov_2char[] =
  363.    {
  364.       0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 
  365.       0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 
  366.       0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 
  367.       0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 
  368.       0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x61, 0x62, 
  369.       0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 
  370.       0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 
  371.       0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
  372.    };
  373.    private static final int byteToUnsigned(byte b)
  374.    {
  375.       int value = (int)b;
  376.       return(value >= 0 ? value : value + 256);
  377.    }
  378.    private static int fourBytesToInt(byte b[], int offset)
  379.    {
  380.       int value;
  381.       value  =  byteToUnsigned(b[offset++]);
  382.       value |= (byteToUnsigned(b[offset++]) <<  8);
  383.       value |= (byteToUnsigned(b[offset++]) << 16);
  384.       value |= (byteToUnsigned(b[offset++]) << 24);
  385.       return(value);
  386.    }
  387.    private static final void intToFourBytes(int iValue, byte b[], int offset)
  388.    {
  389.       b[offset++] = (byte)((iValue)        & 0xff);
  390.       b[offset++] = (byte)((iValue >>> 8 ) & 0xff);
  391.       b[offset++] = (byte)((iValue >>> 16) & 0xff);
  392.       b[offset++] = (byte)((iValue >>> 24) & 0xff);
  393.    }
  394.    private static final void PERM_OP(int a, int b, int n, int m, int results[])
  395.    {
  396.       int t;
  397.       t = ((a >>> n) ^ b) & m;
  398.       a ^= t << n;
  399.       b ^= t;
  400.       results[0] = a;
  401.       results[1] = b;
  402.    }
  403.    private static final int HPERM_OP(int a, int n, int m)
  404.    {
  405.       int t;
  406.       t = ((a << (16 - n)) ^ a) & m;
  407.       a = a ^ t ^ (t >>> (16 - n));
  408.       return(a);
  409.    }
  410.    private static int [] des_set_key(byte key[])
  411.    {
  412.       int schedule[] = new int[ITERATIONS * 2];
  413.       int c = fourBytesToInt(key, 0);
  414.       int d = fourBytesToInt(key, 4);
  415.       int results[] = new int[2];
  416.       PERM_OP(d, c, 4, 0x0f0f0f0f, results);
  417.       d = results[0]; c = results[1];
  418.       c = HPERM_OP(c, -2, 0xcccc0000);
  419.       d = HPERM_OP(d, -2, 0xcccc0000);
  420.       PERM_OP(d, c, 1, 0x55555555, results);
  421.       d = results[0]; c = results[1];
  422.       PERM_OP(c, d, 8, 0x00ff00ff, results);
  423.       c = results[0]; d = results[1];
  424.       PERM_OP(d, c, 1, 0x55555555, results);
  425.       d = results[0]; c = results[1];
  426.       d = (((d & 0x000000ff) <<  16) |  (d & 0x0000ff00)     |
  427.            ((d & 0x00ff0000) >>> 16) | ((c & 0xf0000000) >>> 4));
  428.       c &= 0x0fffffff;
  429.       int s, t;
  430.       int j = 0;
  431.       for(int i = 0; i < ITERATIONS; i ++)
  432.       {
  433.          if(shifts2[i])
  434.          {
  435.             c = (c >>> 2) | (c << 26);
  436.             d = (d >>> 2) | (d << 26);
  437.          }
  438.          else
  439.          {
  440.             c = (c >>> 1) | (c << 27);
  441.             d = (d >>> 1) | (d << 27);
  442.          }
  443.          c &= 0x0fffffff;
  444.          d &= 0x0fffffff;
  445.          s = skb[0][ (c       ) & 0x3f                       ]|
  446.              skb[1][((c >>>  6) & 0x03) | ((c >>>  7) & 0x3c)]|
  447.              skb[2][((c >>> 13) & 0x0f) | ((c >>> 14) & 0x30)]|
  448.              skb[3][((c >>> 20) & 0x01) | ((c >>> 21) & 0x06) |
  449.                                           ((c >>> 22) & 0x38)];
  450.          t = skb[4][ (d     )  & 0x3f                       ]|
  451.              skb[5][((d >>> 7) & 0x03) | ((d >>>  8) & 0x3c)]|
  452.              skb[6][ (d >>>15) & 0x3f                       ]|
  453.              skb[7][((d >>>21) & 0x0f) | ((d >>> 22) & 0x30)];
  454.          schedule[j++] = ((t <<  16) | (s & 0x0000ffff)) & 0xffffffff;
  455.          s             = ((s >>> 16) | (t & 0xffff0000));
  456.          s             = (s << 4) | (s >>> 28);
  457.          schedule[j++] = s & 0xffffffff;
  458.       }
  459.       return(schedule);
  460.    }
  461.    private static final int D_ENCRYPT
  462.    (
  463.       int L, int R, int S, int E0, int E1, int s[]
  464.    )
  465.    {
  466.       int t, u, v;
  467.       v = R ^ (R >>> 16);
  468.       u = v & E0;
  469.       v = v & E1;
  470.       u = (u ^ (u << 16)) ^ R ^ s[S];
  471.       t = (v ^ (v << 16)) ^ R ^ s[S + 1];
  472.       t = (t >>> 4) | (t << 28);
  473.       L ^= SPtrans[1][(t       ) & 0x3f] |
  474.            SPtrans[3][(t >>>  8) & 0x3f] |
  475.            SPtrans[5][(t >>> 16) & 0x3f] |
  476.            SPtrans[7][(t >>> 24) & 0x3f] |
  477.            SPtrans[0][(u       ) & 0x3f] |
  478.            SPtrans[2][(u >>>  8) & 0x3f] |
  479.            SPtrans[4][(u >>> 16) & 0x3f] |
  480.            SPtrans[6][(u >>> 24) & 0x3f];
  481.       return(L);
  482.    }
  483.    private static final int [] body(int schedule[], int Eswap0, int Eswap1)
  484.    {
  485.       int left = 0;
  486.       int right = 0;
  487.       int t     = 0;
  488.       for(int j = 0; j < 25; j ++)
  489.       {
  490.          for(int i = 0; i < ITERATIONS * 2; i += 4)
  491.          {
  492.             left  = D_ENCRYPT(left,  right, i,     Eswap0, Eswap1, schedule);
  493.             right = D_ENCRYPT(right, left,  i + 2, Eswap0, Eswap1, schedule);
  494.          }
  495.          t     = left; 
  496.          left  = right; 
  497.          right = t;
  498.       }
  499.       t = right;
  500.       right = (left >>> 1) | (left << 31);
  501.       left  = (t    >>> 1) | (t    << 31);
  502.       left  &= 0xffffffff;
  503.       right &= 0xffffffff;
  504.       int results[] = new int[2];
  505.       PERM_OP(right, left, 1, 0x55555555, results); 
  506.       right = results[0]; left = results[1];
  507.       PERM_OP(left, right, 8, 0x00ff00ff, results); 
  508.       left = results[0]; right = results[1];
  509.       PERM_OP(right, left, 2, 0x33333333, results); 
  510.       right = results[0]; left = results[1];
  511.       PERM_OP(left, right, 16, 0x0000ffff, results);
  512.       left = results[0]; right = results[1];
  513.       PERM_OP(right, left, 4, 0x0f0f0f0f, results);
  514.       right = results[0]; left = results[1];
  515.       int out[] = new int[2];
  516.       out[0] = left; out[1] = right;
  517.       return(out);
  518.    }
  519.   /**
  520.    * <P>Encrypt a password given the cleartext password and a "salt".</P>
  521.    * @param salt A two-character string representing the salt used to
  522.    * iterate the encryption engine in lots of different ways. If you
  523.    * are generating a new encryption then this value should be
  524.    * randomised.
  525.    * @param original The password to be encrypted.
  526.    * @return A string consisting of the 2-character salt followed by the
  527.    * encrypted password.
  528.    */
  529.    public static final String crypt(String salt, String original)
  530.    {
  531.       while(salt.length() < 2)
  532.          salt += "A";
  533.       StringBuffer buffer = new StringBuffer("             ");
  534.       char charZero = salt.charAt(0);
  535.       char charOne  = salt.charAt(1);
  536.       buffer.setCharAt(0, charZero);
  537.       buffer.setCharAt(1, charOne);
  538.       int Eswap0 = con_salt[(int)charZero];
  539.       int Eswap1 = con_salt[(int)charOne] << 4;
  540.  
  541.       byte key[] = new byte[8];
  542.       for(int i = 0; i < key.length; i ++)
  543.          key[i] = (byte)0;
  544.       for(int i = 0; i < key.length && i < original.length(); i ++)
  545.       {
  546.          int iChar = (int)original.charAt(i);
  547.          key[i] = (byte)(iChar << 1);
  548.       }
  549.       int schedule[] = des_set_key(key);
  550.       int out[]      = body(schedule, Eswap0, Eswap1);
  551.       byte b[] = new byte[9];
  552.       intToFourBytes(out[0], b, 0);
  553.       intToFourBytes(out[1], b, 4);
  554.       b[8] = 0;
  555.       for(int i = 2, y = 0, u = 0x80; i < 13; i ++)
  556.       {
  557.          for(int j = 0, c = 0; j < 6; j ++)
  558.          {
  559.             c <<= 1;
  560.             if(((int)b[y] & u) != 0)
  561.                c |= 1;
  562.             u >>>= 1;
  563.             if(u == 0)
  564.             {
  565.                y++;
  566.                u = 0x80;
  567.             }
  568.             buffer.setCharAt(i, (char)cov_2char[c]);
  569.          }
  570.       }
  571.       return(buffer.toString());
  572.    }
  573.   
  574.   /**
  575.    * <P>Encrypt a password given the cleartext password. This method
  576.    * generates a random salt using the 'java.util.Random' class.</P>
  577.    * @param original The password to be encrypted.
  578.    * @return A string consisting of the 2-character salt followed by the
  579.    * encrypted password.
  580.    */
  581.   public static final String crypt(String original)
  582.   {
  583.     java.util.Random randomGenerator = new java.util.Random();
  584.     int numSaltChars = saltChars.length;
  585.     String salt;
  586.     
  587.     salt = (new StringBuffer()).append(saltChars[Math.abs(randomGenerator.nextInt()) % numSaltChars]).append(saltChars[Math.abs(randomGenerator.nextInt()) % numSaltChars]).toString();
  588.     
  589.     return crypt(salt, original);
  590.   }
  591.   
  592.   /**
  593.    * <P>Check that <I>enteredPassword</I> encrypts to
  594.    * <I>encryptedPassword</I>.</P>
  595.    * @param encryptedPassword The <I>encryptedPassword</I>. The first
  596.    * two characters are assumed to be the salt. This string would
  597.    * be the same as one found in a Unix <U>/etc/passwd</U> file.
  598.    * @param enteredPassword The password as entered by the user (or
  599.    * otherwise aquired).
  600.    * @return <B>true</B> if the password should be considered correct.
  601.    */
  602.   public final static boolean matches(String encryptedPassword, String enteredPassword)
  603.   {
  604.     String salt = encryptedPassword.substring(0, 3);
  605.     String newCrypt = crypt(salt, enteredPassword);
  606.     
  607.     return newCrypt.equals(encryptedPassword);
  608.   }
  609. }