home *** CD-ROM | disk | FTP | other *** search
- public class DesCipher {
- private int[] encryptKeys = new int[32];
- private int[] decryptKeys = new int[32];
- private int[] tempInts = new int[2];
- private static byte[] bytebit = new byte[]{1, 2, 4, 8, 16, 32, 64, -128};
- private static int[] bigbyte = new int[]{8388608, 4194304, 2097152, 1048576, 524288, 262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1};
- private static byte[] pc1 = new byte[]{56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3};
- private static int[] totrot = new int[]{1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28};
- private static byte[] pc2 = new byte[]{13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31};
- private static int[] SP1 = new int[]{16843776, 0, 65536, 16843780, 16842756, 66564, 4, 65536, 1024, 16843776, 16843780, 1024, 16778244, 16842756, 16777216, 4, 1028, 16778240, 16778240, 66560, 66560, 16842752, 16842752, 16778244, 65540, 16777220, 16777220, 65540, 0, 1028, 66564, 16777216, 65536, 16843780, 4, 16842752, 16843776, 16777216, 16777216, 1024, 16842756, 65536, 66560, 16777220, 1024, 4, 16778244, 66564, 16843780, 65540, 16842752, 16778244, 16777220, 1028, 66564, 16843776, 1028, 16778240, 16778240, 0, 65540, 66560, 0, 16842756};
- private static int[] SP2 = new int[]{-2146402272, -2147450880, 32768, 1081376, 1048576, 32, -2146435040, -2147450848, -2147483616, -2146402272, -2146402304, Integer.MIN_VALUE, -2147450880, 1048576, 32, -2146435040, 1081344, 1048608, -2147450848, 0, Integer.MIN_VALUE, 32768, 1081376, -2146435072, 1048608, -2147483616, 0, 1081344, 32800, -2146402304, -2146435072, 32800, 0, 1081376, -2146435040, 1048576, -2147450848, -2146435072, -2146402304, 32768, -2146435072, -2147450880, 32, -2146402272, 1081376, 32, 32768, Integer.MIN_VALUE, 32800, -2146402304, 1048576, -2147483616, 1048608, -2147450848, -2147483616, 1048608, 1081344, 0, -2147450880, 32800, Integer.MIN_VALUE, -2146435040, -2146402272, 1081344};
- private static int[] SP3 = new int[]{520, 134349312, 0, 134348808, 134218240, 0, 131592, 134218240, 131080, 134217736, 134217736, 131072, 134349320, 131080, 134348800, 520, 134217728, 8, 134349312, 512, 131584, 134348800, 134348808, 131592, 134218248, 131584, 131072, 134218248, 8, 134349320, 512, 134217728, 134349312, 134217728, 131080, 520, 131072, 134349312, 134218240, 0, 512, 131080, 134349320, 134218240, 134217736, 512, 0, 134348808, 134218248, 131072, 134217728, 134349320, 8, 131592, 131584, 134217736, 134348800, 134218248, 520, 134348800, 131592, 8, 134348808, 131584};
- private static int[] SP4 = new int[]{8396801, 8321, 8321, 128, 8396928, 8388737, 8388609, 8193, 0, 8396800, 8396800, 8396929, 129, 0, 8388736, 8388609, 1, 8192, 8388608, 8396801, 128, 8388608, 8193, 8320, 8388737, 1, 8320, 8388736, 8192, 8396928, 8396929, 129, 8388736, 8388609, 8396800, 8396929, 129, 0, 0, 8396800, 8320, 8388736, 8388737, 1, 8396801, 8321, 8321, 128, 8396929, 129, 1, 8192, 8388609, 8193, 8396928, 8388737, 8193, 8320, 8388608, 8396801, 128, 8388608, 8192, 8396928};
- private static int[] SP5 = new int[]{256, 34078976, 34078720, 1107296512, 524288, 256, 1073741824, 34078720, 1074266368, 524288, 33554688, 1074266368, 1107296512, 1107820544, 524544, 1073741824, 33554432, 1074266112, 1074266112, 0, 1073742080, 1107820800, 1107820800, 33554688, 1107820544, 1073742080, 0, 1107296256, 34078976, 33554432, 1107296256, 524544, 524288, 1107296512, 256, 33554432, 1073741824, 34078720, 1107296512, 1074266368, 33554688, 1073741824, 1107820544, 34078976, 1074266368, 256, 33554432, 1107820544, 1107820800, 524544, 1107296256, 1107820800, 34078720, 0, 1074266112, 1107296256, 524544, 33554688, 1073742080, 524288, 0, 1074266112, 34078976, 1073742080};
- private static int[] SP6 = new int[]{536870928, 541065216, 16384, 541081616, 541065216, 16, 541081616, 4194304, 536887296, 4210704, 4194304, 536870928, 4194320, 536887296, 536870912, 16400, 0, 4194320, 536887312, 16384, 4210688, 536887312, 16, 541065232, 541065232, 0, 4210704, 541081600, 16400, 4210688, 541081600, 536870912, 536887296, 16, 541065232, 4210688, 541081616, 4194304, 16400, 536870928, 4194304, 536887296, 536870912, 16400, 536870928, 541081616, 4210688, 541065216, 4210704, 541081600, 0, 541065232, 16, 16384, 541065216, 4210704, 16384, 4194320, 536887312, 0, 541081600, 536870912, 4194320, 536887312};
- private static int[] SP7 = new int[]{2097152, 69206018, 67110914, 0, 2048, 67110914, 2099202, 69208064, 69208066, 2097152, 0, 67108866, 2, 67108864, 69206018, 2050, 67110912, 2099202, 2097154, 67110912, 67108866, 69206016, 69208064, 2097154, 69206016, 2048, 2050, 69208066, 2099200, 2, 67108864, 2099200, 67108864, 2099200, 2097152, 67110914, 67110914, 69206018, 69206018, 2, 2097154, 67108864, 67110912, 2097152, 69208064, 2050, 2099202, 69208064, 2050, 67108866, 69208066, 69206016, 2099200, 0, 2, 69208066, 0, 2099202, 69206016, 2048, 67108866, 67110912, 2048, 2097154};
- private static int[] SP8 = new int[]{268439616, 4096, 262144, 268701760, 268435456, 268439616, 64, 268435456, 262208, 268697600, 268701760, 266240, 268701696, 266304, 4096, 64, 268697600, 268435520, 268439552, 4160, 266240, 262208, 268697664, 268701696, 4160, 0, 0, 268697664, 268435520, 268439552, 266304, 262144, 266304, 262144, 268701696, 4096, 64, 268697664, 4096, 266304, 268439552, 64, 268435520, 268697600, 268697664, 268435456, 262144, 268439616, 0, 268701760, 262208, 268435520, 268697600, 268439552, 268439616, 0, 268701760, 266240, 266240, 4160, 4160, 262208, 268435456, 268701696};
-
- public DesCipher(byte[] var1) {
- this.setKey(var1);
- }
-
- public void setKey(byte[] var1) {
- this.deskey(var1, true, this.encryptKeys);
- this.deskey(var1, false, this.decryptKeys);
- }
-
- private void deskey(byte[] var1, boolean var2, int[] var3) {
- int[] var9 = new int[56];
- int[] var10 = new int[56];
- int[] var11 = new int[32];
-
- for(int var5 = 0; var5 < 56; ++var5) {
- byte var6 = pc1[var5];
- int var7 = var6 & 7;
- var9[var5] = (var1[var6 >>> 3] & bytebit[var7]) != 0 ? 1 : 0;
- }
-
- for(int var4 = 0; var4 < 16; ++var4) {
- int var17;
- if (var2) {
- var17 = var4 << 1;
- } else {
- var17 = 15 - var4 << 1;
- }
-
- int var8 = var17 + 1;
- var11[var17] = var11[var8] = 0;
-
- for(int var12 = 0; var12 < 28; ++var12) {
- int var15 = var12 + totrot[var4];
- if (var15 < 28) {
- var10[var12] = var9[var15];
- } else {
- var10[var12] = var9[var15 - 28];
- }
- }
-
- for(int var13 = 28; var13 < 56; ++var13) {
- int var16 = var13 + totrot[var4];
- if (var16 < 56) {
- var10[var13] = var9[var16];
- } else {
- var10[var13] = var9[var16 - 28];
- }
- }
-
- for(int var14 = 0; var14 < 24; ++var14) {
- if (var10[pc2[var14]] != 0) {
- var11[var17] |= bigbyte[var14];
- }
-
- if (var10[pc2[var14 + 24]] != 0) {
- var11[var8] |= bigbyte[var14];
- }
- }
- }
-
- this.cookey(var11, var3);
- }
-
- private void cookey(int[] var1, int[] var2) {
- int var7 = 0;
- int var5 = 0;
-
- for(int var6 = 0; var7 < 16; ++var7) {
- int var3 = var1[var5++];
- int var4 = var1[var5++];
- var2[var6] = (var3 & 16515072) << 6;
- var2[var6] |= (var3 & 4032) << 10;
- var2[var6] |= (var4 & 16515072) >>> 10;
- var2[var6] |= (var4 & 4032) >>> 6;
- ++var6;
- var2[var6] = (var3 & 258048) << 12;
- var2[var6] |= (var3 & 63) << 16;
- var2[var6] |= (var4 & 258048) >>> 4;
- var2[var6] |= var4 & 63;
- ++var6;
- }
-
- }
-
- public void encrypt(byte[] var1, int var2, byte[] var3, int var4) {
- squashBytesToInts(var1, var2, this.tempInts, 0, 2);
- this.des(this.tempInts, this.tempInts, this.encryptKeys);
- spreadIntsToBytes(this.tempInts, 0, var3, var4, 2);
- }
-
- public void decrypt(byte[] var1, int var2, byte[] var3, int var4) {
- squashBytesToInts(var1, var2, this.tempInts, 0, 2);
- this.des(this.tempInts, this.tempInts, this.decryptKeys);
- spreadIntsToBytes(this.tempInts, 0, var3, var4, 2);
- }
-
- private void des(int[] var1, int[] var2, int[] var3) {
- int var9 = 0;
- int var7 = var1[0];
- int var6 = var1[1];
- int var5 = (var7 >>> 4 ^ var6) & 252645135;
- var6 ^= var5;
- var7 ^= var5 << 4;
- var5 = (var7 >>> 16 ^ var6) & '\uffff';
- var6 ^= var5;
- var7 ^= var5 << 16;
- var5 = (var6 >>> 2 ^ var7) & 858993459;
- var7 ^= var5;
- var6 ^= var5 << 2;
- var5 = (var6 >>> 8 ^ var7) & 16711935;
- var7 ^= var5;
- var6 ^= var5 << 8;
- var6 = var6 << 1 | var6 >>> 31 & 1;
- var5 = (var7 ^ var6) & -1431655766;
- var7 ^= var5;
- var6 ^= var5;
- var7 = var7 << 1 | var7 >>> 31 & 1;
-
- for(int var8 = 0; var8 < 8; ++var8) {
- var5 = var6 << 28 | var6 >>> 4;
- var5 ^= var3[var9++];
- int var4 = SP7[var5 & 63];
- var4 |= SP5[var5 >>> 8 & 63];
- var4 |= SP3[var5 >>> 16 & 63];
- var4 |= SP1[var5 >>> 24 & 63];
- var5 = var6 ^ var3[var9++];
- var4 |= SP8[var5 & 63];
- var4 |= SP6[var5 >>> 8 & 63];
- var4 |= SP4[var5 >>> 16 & 63];
- var4 |= SP2[var5 >>> 24 & 63];
- var7 ^= var4;
- var5 = var7 << 28 | var7 >>> 4;
- var5 ^= var3[var9++];
- var4 = SP7[var5 & 63];
- var4 |= SP5[var5 >>> 8 & 63];
- var4 |= SP3[var5 >>> 16 & 63];
- var4 |= SP1[var5 >>> 24 & 63];
- var5 = var7 ^ var3[var9++];
- var4 |= SP8[var5 & 63];
- var4 |= SP6[var5 >>> 8 & 63];
- var4 |= SP4[var5 >>> 16 & 63];
- var4 |= SP2[var5 >>> 24 & 63];
- var6 ^= var4;
- }
-
- var6 = var6 << 31 | var6 >>> 1;
- var5 = (var7 ^ var6) & -1431655766;
- var7 ^= var5;
- var6 ^= var5;
- var7 = var7 << 31 | var7 >>> 1;
- var5 = (var7 >>> 8 ^ var6) & 16711935;
- var6 ^= var5;
- var7 ^= var5 << 8;
- var5 = (var7 >>> 2 ^ var6) & 858993459;
- var6 ^= var5;
- var7 ^= var5 << 2;
- var5 = (var6 >>> 16 ^ var7) & '\uffff';
- var7 ^= var5;
- var6 ^= var5 << 16;
- var5 = (var6 >>> 4 ^ var7) & 252645135;
- var7 ^= var5;
- var6 ^= var5 << 4;
- var2[0] = var6;
- var2[1] = var7;
- }
-
- public static void squashBytesToInts(byte[] var0, int var1, int[] var2, int var3, int var4) {
- for(int var5 = 0; var5 < var4; ++var5) {
- var2[var3 + var5] = (var0[var1 + var5 * 4] & 255) << 24 | (var0[var1 + var5 * 4 + 1] & 255) << 16 | (var0[var1 + var5 * 4 + 2] & 255) << 8 | var0[var1 + var5 * 4 + 3] & 255;
- }
-
- }
-
- public static void spreadIntsToBytes(int[] var0, int var1, byte[] var2, int var3, int var4) {
- for(int var5 = 0; var5 < var4; ++var5) {
- var2[var3 + var5 * 4] = (byte)(var0[var1 + var5] >>> 24);
- var2[var3 + var5 * 4 + 1] = (byte)(var0[var1 + var5] >>> 16);
- var2[var3 + var5 * 4 + 2] = (byte)(var0[var1 + var5] >>> 8);
- var2[var3 + var5 * 4 + 3] = (byte)var0[var1 + var5];
- }
-
- }
- }
-