Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的DES TripleDES和AES128代码_Java_Cryptography - Fatal编程技术网

java中的DES TripleDES和AES128代码

java中的DES TripleDES和AES128代码,java,cryptography,Java,Cryptography,我写了下面的代码,用JAVA用三种算法对一些字节进行加密和解密,但我不知道我写的是否正确 谢谢和问候 头等舱: public class Cryptography { Cryptography() {} public byte[] Encryption_AES128(byte[] plain , byte[] key) throws Exception { AES128 aes128 = new AES128(); return ae

我写了下面的代码,用JAVA用三种算法对一些字节进行加密和解密,但我不知道我写的是否正确

谢谢和问候

头等舱:

public class Cryptography 
{
    Cryptography() {}

    public byte[] Encryption_AES128(byte[] plain  , byte[] key) throws Exception
    {
        AES128 aes128 = new AES128();
        return aes128.encrypt(key, plain);
    }
    public byte[] Decryption_AES128(byte[] cipher  , byte[] key) throws Exception
    {
        AES128 aes128 = new AES128();
        return aes128.decrypt(key, cipher);
    }

    public byte[] Encryption_DES(byte[] plain  , byte[] key) throws Exception
    {
        DES des = new DES(key);
        return des.encrypt(plain);
    }
    public byte[] Decryption_DES(byte[] cipher  , byte[] key) throws Exception
    {
        DES des = new DES(key);
        return des.decrypt(cipher);
    }

    public byte[] Encryption_TripleDES(byte[] plain  , byte[] key) throws Exception
    {
        TripleDES Tdes = new TripleDES(key);
        return Tdes.encrypt(plain);
    }
    public byte[] Decryption_TripleDES(byte[] cipher  , byte[] key) throws Exception
    {
        TripleDES Tdes = new TripleDES(key);
        return Tdes.decrypt(cipher);
    }
}
和其他三类:

前三位:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

public class TripleDES 
{
    SecretKey key;

    TripleDES(byte [] rawkey) throws Exception
    {
        key = readKey(rawkey);
    }

    public SecretKey readKey(byte[] rawkey) throws Exception
    {
         DESedeKeySpec keyspec = new DESedeKeySpec(rawkey);
         SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DESede");
         SecretKey key = keyfactory.generateSecret(keyspec);
         return key;
    }

    public byte[] encrypt(byte[] plain ) throws Exception
    {
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encrypted = cipher.doFinal(plain);
        return encrypted;
    }
    public byte[] decrypt(byte[] cipher ) throws Exception
    {
        Cipher dcipher = Cipher.getInstance("DESede");
        dcipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decrypted = dcipher.doFinal(cipher);
        return decrypted;
    }  
}
DES算法:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class DES 
{
    SecretKey key;
    DES(byte []  KEY) throws Exception
    {
        key = readKey(KEY);
    }

    public SecretKey readKey(byte[] rawkey) throws Exception
    {
         DESKeySpec keyspec = new DESKeySpec(rawkey);
         SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("DES");
         SecretKey key = keyfactory.generateSecret(keyspec);
         return key;
    }

    public byte[] encrypt(byte[] plain ) throws Exception
    {
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encrypted = cipher.doFinal(plain);
        return encrypted;
    }
    public byte[] decrypt(byte[] cipher ) throws Exception
    {
        Cipher dcipher = Cipher.getInstance("DES");
        dcipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decrypted = dcipher.doFinal(cipher);
        return decrypted;
    }  
}
和AES128:

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class AES128 
{
    private byte[] getRawKey(byte[] seed) throws Exception 
    {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
        sr.setSeed(seed);
        kgen.init(128, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return raw;
    }

    public byte[] encrypt(byte[] raw, byte[] clear) throws Exception 
    {
        SecretKeySpec skeySpec = new SecretKeySpec(getRawKey(raw), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(clear);
        return encrypted;
    }

    public byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception 
    {
        SecretKeySpec skeySpec = new SecretKeySpec(getRawKey(raw), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    }
}

要检查代码,您需要根据已知答案进行测试。这些已知答案称为“测试向量”。谷歌搜索将为您提供DES、3DES和AES的测试向量。这三种算法都是常用的。

使用字符串(无api)在java中模拟des-3des:

公共类Filippakoc_Des{
静态int[]sb1={
{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,   7,  3, 10,  5,  0},
{15 , 12,   8,  2,  4,   9,   1,  7,  5,  11,  3,  14, 10,  0,  6,  13}
};
静态int[]sb2={
{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,   6,  9, 3,  2,  15},
{13 , 8 , 10,  1,  3,  15,   4,  2, 11,  6,  7,  12, 0 , 5,  14,  9}
};
静态int[]sb3={
{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, 12,  5, 10,  14,   7},
{1  , 10 ,13, 0,  6,    9,   8,  7, 4, 15,  14,  3, 11,  5,   2,  12}
};
静态int[]sb4={
{ 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, 14,  5,  2,  8,   4},
{3  , 15,  0, 6,  10,  1,   13, 8, 9, 4,  5, 11, 12,  7,  2,  14}
};
静态int[]sb5={
{ 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,  5,  6,  3,  0, 14},
{11,  8, 12, 7 ,  1,  14,  2, 13, 6, 15,   0,  9, 10,  4,  5,  3}
};
静态int[]sb6={
{ 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, 10,  1,  13,11,  6},
{4,   3, 12, 12,  9,  5, 15, 10,11,  14,   1,  7,  6,   0, 8, 13}
};
静态int[]sb7={
{ 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,  6,  8,  0,  5, 9,  2},
{6, 11, 13,  8,  1,  4, 10,  7,  9,   5,  0, 15, 14,  2, 3, 12}
};
静态int[]sb8={
{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,13, 15,  3, 5,  8},
{ 2,  1, 14,  7,   4,  10,  8, 13, 15, 12,  9, 0,  3,  5, 6, 11}
};
公共字符串Filippakoc_Des(字符串ptxt、字符串键、布尔值encdes){
//字符串a=String.format(“%64s”,Integer.toBinaryString(255)).replace(“”,'0');
//字符串b=“1011011111001100001110000101110111000001001100110101101111101001010”;
字符串ipa=ippermutate(ptxt);
字符串ipb=IPpermutate(ptxt);
字符串[]键=键生成(键);
字符串[]轮数=新字符串[16];
字符串:text=“”;
如果(encdes==true){
对于(int i=0;i14){
四舍五入[i]=dround(ipb,键[i]);
}否则{
轮[i]=dround(轮[i+1],键[i]);
}
}
scripttext=IPpermutation_389;(四舍五入[0]);
//System.out.println(ptxt);
//System.out.println(脚本文本);
}
返回文本;
//字符串a=String.format(“%32s”,Integer.toBinaryString(255)).replace(“”,'0');
//字符串b=String.format(“%48s”,Integer.toBinaryString(21)).replace(“”,'0');
//System.out.println(函数f(a,b));
//系统输出println(xor(a,b));
}
公共字符串FilipPakocu 3des(字符串ptxt、字符串key1、字符串key2、字符串key3、布尔encdes){
字符串En=“”;
如果(encdes){
En=Filippakoc_Des(ptxt,键1,真);
En=En=Filippakoc_Des(En,键2,假);
En=En=Filippakoc_Des(En,键3,真);
}否则{
En=Filippakoc_Des(文本,键1,假);
En=En=Filippakoc_Des(En,键2,真);
En=En=Filippakoc_Des(En,键3,假);
}
返回En;
}
公共字符串圆形(字符串plain64,字符串keyi){
字符串li=plain64.子字符串(0,32);
字符串ri=64。子字符串(32);
字符串ro=xor(li,functionf(ri,keyi));
字符串lo=ri;
字符串结果命令=lo+ro;
返回结果命令;
}
公共字符串drond(字符串plain64,字符串keyi){
字符串li=plain64.子字符串(0,32);
字符串ri=64。子字符串(32);
字符串lo=xor(ri,functionf(li,keyi));
字符串ro=li;
字符串结果命令=lo+ro;
返回结果命令;
}
公共字符串异或(字符串a、字符串b){
字符串res=“”;

对于(int i=0;它应该在代码审阅中。@马特:对不起……它在哪里?我是新来的。在最顶端,如果您单击它,将出现一个下拉框。然后您可以单击所有站点并向下滚动,直到看到代码审阅。
public class Filippakoc_Des {
static int[][] sb1={
    {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,   7,  3, 10,  5,  0},
    {15 , 12,   8,  2,  4,   9,   1,  7,  5,  11,  3,  14, 10,  0,  6,  13}
};
 static int[][] sb2={
    {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,   6,  9, 3,  2,  15},
    {13 , 8 , 10,  1,  3,  15,   4,  2, 11,  6,  7,  12, 0 , 5,  14,  9}
};
 static int[][] sb3={
    {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, 12,  5, 10,  14,   7},
    {1  , 10 ,13, 0,  6,    9,   8,  7, 4, 15,  14,  3, 11,  5,   2,  12}
};
   static int[][] sb4={
    { 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, 14,  5,  2,  8,   4},
    {3  , 15,  0, 6,  10,  1,   13, 8, 9, 4,  5, 11, 12,  7,  2,  14}
};
     static int[][] sb5={
    { 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,  5,  6,  3,  0, 14},
    {11,  8, 12, 7 ,  1,  14,  2, 13, 6, 15,   0,  9, 10,  4,  5,  3}
};
           static int[][] sb6={
    { 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, 10,  1,  13,11,  6},
    {4,   3, 12, 12,  9,  5, 15, 10,11,  14,   1,  7,  6,   0, 8, 13}
};
           static int[][] sb7={
    { 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,  6,  8,  0,  5, 9,  2},
    {6, 11, 13,  8,  1,  4, 10,  7,  9,   5,  0, 15, 14,  2, 3, 12}
};
           static int[][] sb8={
    {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,13, 15,  3, 5,  8},
    { 2,  1, 14,  7,   4,  10,  8, 13, 15, 12,  9, 0,  3,  5, 6, 11}
};

     public String Filippakoc_Des(String ptxt,String key,boolean encdes){
         //String a=String.format("%64s", Integer.toBinaryString(255)).replace(' ', '0');
         //String b="1011011111001001100001110000101110110000010001110101111101001010";
         String ipa=IPpermutation(ptxt);
         String ipb=IPpermutation(ptxt);
         String[] keys=Keygenerate(key);
         String[] rounds=new String[16];
         String cripttext="";
         if(encdes==true){
              for(int i=0;i<rounds.length;i++){
             if(i<1){
             rounds[i]=round(ipa,keys[i]);
             }else{
                 rounds[i]=round(rounds[i-1],keys[i]);
             }


            }

         cripttext=IPpermutation_(rounds[15]);
         //System.out.println(ptxt);
         //System.out.println(cripttext);
         }else{
              for(int i=rounds.length-1;i>=0;i--){
               if(i>14){
             rounds[i]=dround(ipb,keys[i]);
             }else{
                 rounds[i]=dround(rounds[i+1],keys[i]);
             }

         }
         cripttext=IPpermutation_(rounds[0]);
         //System.out.println(ptxt);
         //System.out.println(cripttext);
         }


        return cripttext;

         //String a=String.format("%32s", Integer.toBinaryString(255)).replace(' ', '0');
         //String b=String.format("%48s", Integer.toBinaryString(21)).replace(' ', '0');
         //System.out.println(functionf(a, b));
         //System.out.println(xor(a,b));
     }
     public String Filippakoc_3des(String ptxt,String key1,String key2,String key3,boolean encdes){
         String En="";
         if(encdes){
           En=Filippakoc_Des(ptxt, key1, true);
         En=En=Filippakoc_Des(En, key2, false);
          En=En=Filippakoc_Des(En, key3, true);
         }else{
             En=Filippakoc_Des(ptxt, key1, false);
         En=En=Filippakoc_Des(En, key2, true);
          En=En=Filippakoc_Des(En, key3, false);
         }

          return En;

     }
     public String round(String plain64,String keyi){

         String li=plain64.substring(0,32);
         String ri=plain64.substring(32);

         String ro=xor(li,functionf(ri,keyi));
         String lo=ri;
         String resultround=lo+ro;
         return resultround;
     }
     public String dround(String plain64,String keyi){
              String li=plain64.substring(0,32);
         String ri=plain64.substring(32);

         String lo=xor(ri,functionf(li,keyi));
         String ro=li;
         String resultround=lo+ro;
         return resultround;
     }
     public String xor(String a,String b){
         String res="";
         for(int i=0;i<a.length();i++){
             if(a.charAt(i)=='0' && b.charAt(i)=='0'){
                 res+='0';
             }else  if(a.charAt(i)=='0' && b.charAt(i)=='1'){
                 res+='1';
             }else  if(a.charAt(i)=='1' && b.charAt(i)=='0'){
                 res+='1';
             }else  if(a.charAt(i)=='1' && b.charAt(i)=='1'){
                 res+='0';
             }
         }
         return res;
     }
     public String sboxesrtn(int ff){
         String sb=Integer.toBinaryString(ff);
         if(ff<2){
             sb="000"+sb;
         }else if(ff<4){
             sb="00"+sb;
         }else if(ff<8){
             sb="0"+sb;
         }
         return sb;
     }
     public String functionf(String r32,String k48){
         String r48=Epermutation(r32);
         String xorout=xor(r48, k48);
         String[] splitto6=new String[8];
         splitto6[0]=xorout.substring(0,6);
         splitto6[1]=xorout.substring(6,12);
         splitto6[2]=xorout.substring(12,18);
         splitto6[3]=xorout.substring(18,24);
         splitto6[4]=xorout.substring(24,30);
         splitto6[5]=xorout.substring(30,36);
         splitto6[6]=xorout.substring(36,42);
         splitto6[7]=xorout.substring(42);
         String rnew32="";
         String row;
         String column="";
         for(int i=0;i<splitto6.length;i++){
            row=""+splitto6[i].charAt(0)+splitto6[i].charAt(5);
            column=splitto6[i].substring(1,5);
            //System.out.println(splitto6[i]+"  "+row+"  "+column);
            int irow=Integer.parseInt(row, 2);
            int icolumn=Integer.parseInt(column, 2);
            if(i==0){
                //rnew32+=Integer.toBinaryString(sb1[irow][icolumn]);
                rnew32+=String.format("%4s", Integer.toBinaryString(sb1[irow][icolumn])).replace(' ', '0');
            }else if(i==1){
                rnew32+=String.format("%4s", Integer.toBinaryString(sb2[irow][icolumn])).replace(' ', '0');
            }else if(i==2){
                rnew32+=String.format("%4s", Integer.toBinaryString(sb3[irow][icolumn])).replace(' ', '0');
            }else if(i==3){
                rnew32+=String.format("%4s", Integer.toBinaryString(sb4[irow][icolumn])).replace(' ', '0');
            }else if(i==4){
                rnew32+=String.format("%4s", Integer.toBinaryString(sb5[irow][icolumn])).replace(' ', '0');
            }else if(i==5){
                rnew32+=String.format("%4s", Integer.toBinaryString(sb6[irow][icolumn])).replace(' ', '0');
            }else if(i==6){
                rnew32+=String.format("%4s", Integer.toBinaryString(sb7[irow][icolumn])).replace(' ', '0');
            }else if(i==7){
                rnew32+=String.format("%4s", Integer.toBinaryString(sb8[irow][icolumn])).replace(' ', '0');
            }
         }


        //System.out.println(rnew32.length());
        //System.out.println(rnew32);
        // System.out.print(splitto6[0]+"  "+splitto6[1]+"  "+splitto6[2]+"  "+splitto6[3]+"  "+splitto6[4]+"  "+splitto6[5]+"  "+splitto6[6]+"  "+splitto6[7]+"\n");
         rnew32=Ppermutation(rnew32);
         return rnew32;

     }
     public String Epermutation(String r32){
         r32=" "+r32;
         String r48=""+r32.charAt(31)+r32.charAt(1)+r32.charAt(2)+r32.charAt(3)+r32.charAt(4)+r32.charAt(5)+r32.charAt(4)+r32.charAt(5)+r32.charAt(6)+r32.charAt(7)+r32.charAt(8)+r32.charAt(9)+r32.charAt(8)+r32.charAt(9)+r32.charAt(10)+r32.charAt(11)+r32.charAt(12)+r32.charAt(13)+r32.charAt(12)+r32.charAt(13)+r32.charAt(14)+r32.charAt(15)+r32.charAt(16)+r32.charAt(17)+r32.charAt(16)+r32.charAt(17)+r32.charAt(18)+r32.charAt(19)+r32.charAt(20)+r32.charAt(21)+r32.charAt(20)+r32.charAt(21)+r32.charAt(22)+r32.charAt(23)+r32.charAt(24)+r32.charAt(25)+r32.charAt(24)+r32.charAt(25)+r32.charAt(26)+r32.charAt(27)+r32.charAt(28)+r32.charAt(29)+r32.charAt(28)+r32.charAt(29)+r32.charAt(30)+r32.charAt(31)+r32.charAt(32)+r32.charAt(1);
         return r48;
     }
     public String Ppermutation(String r32){
         r32=" "+r32;
         String r32p=""+r32.charAt(17)+r32.charAt(7)+r32.charAt(20)+r32.charAt(21)+r32.charAt(29)+r32.charAt(12)+r32.charAt(28)+r32.charAt(17)+r32.charAt(1)+r32.charAt(15)+r32.charAt(23)+r32.charAt(26)+r32.charAt(5)+r32.charAt(18)+r32.charAt(31)+r32.charAt(10)+r32.charAt(2)+r32.charAt(8)+r32.charAt(24)+r32.charAt(14)+r32.charAt(32)+r32.charAt(27)+r32.charAt(3)+r32.charAt(9)+r32.charAt(19)+r32.charAt(13)+r32.charAt(30)+r32.charAt(6)+r32.charAt(22)+r32.charAt(11)+r32.charAt(4)+r32.charAt(25);
         return r32p;
     }
      public String IPpermutation(String r64){
         r64=" "+r64;
         String r64p=""+r64.charAt(58)+r64.charAt(50)+r64.charAt(42)+ r64.charAt(34)+r64.charAt(26)+r64.charAt(18)+r64.charAt(10)+r64.charAt(2)
                 +r64.charAt(60)+r64.charAt(52)+r64.charAt(44)+r64.charAt(36)+r64.charAt(28)+r64.charAt(20)+r64.charAt(12)+r64.charAt(4)+
                 r64.charAt(62)+r64.charAt(54)+r64.charAt(46)+r64.charAt(38)+r64.charAt(30)+r64.charAt(22)+r64.charAt(14)+r64.charAt(6)+
                 r64.charAt(64)+r64.charAt(56)+r64.charAt(48)+r64.charAt(40)+r64.charAt(32)+r64.charAt(24)+r64.charAt(16)+r64.charAt(8)+
                 r64.charAt(57)+r64.charAt(49)+ r64.charAt(41)+r64.charAt(33)+r64.charAt(25)+r64.charAt(17)+r64.charAt(9)+r64.charAt(1)+
                 r64.charAt(59)+r64.charAt(51)+r64.charAt(43)+r64.charAt(35)+r64.charAt(27)+r64.charAt(19)+r64.charAt(11)+r64.charAt(3)+
                 r64.charAt(61)+r64.charAt(53)+r64.charAt(45)+r64.charAt(37)+r64.charAt(29)+r64.charAt(21)+r64.charAt(13)+r64.charAt(5)+
                 r64.charAt(63)+r64.charAt(55)+r64.charAt(47)+r64.charAt(39)+r64.charAt(31)+r64.charAt(23)+r64.charAt(15)+r64.charAt(7);
         return r64p;
     }
       public String IPpermutation_(String r64){
         r64=" "+r64;
         String r64p=""+
                 r64.charAt(40)+r64.charAt(8)+r64.charAt(48)+ r64.charAt(16)+r64.charAt(56)+r64.charAt(24)+r64.charAt(64)+r64.charAt(32)+
                 r64.charAt(39)+r64.charAt(7)+r64.charAt(47)+r64.charAt(15)+r64.charAt(55)+r64.charAt(23)+r64.charAt(63)+r64.charAt(31)+
                 r64.charAt(38)+r64.charAt(6)+r64.charAt(46)+r64.charAt(14)+r64.charAt(54)+r64.charAt(22)+r64.charAt(62)+r64.charAt(30)+
                 r64.charAt(37)+r64.charAt(5)+r64.charAt(45)+r64.charAt(13)+r64.charAt(53)+r64.charAt(21)+r64.charAt(61)+r64.charAt(29)+
                 r64.charAt(36)+r64.charAt(4)+ r64.charAt(44)+r64.charAt(12)+r64.charAt(52)+r64.charAt(20)+r64.charAt(60)+r64.charAt(28)+
                 r64.charAt(35)+r64.charAt(3)+r64.charAt(43)+r64.charAt(11)+r64.charAt(51)+r64.charAt(19)+r64.charAt(59)+r64.charAt(27)+
                 r64.charAt(34)+r64.charAt(2)+r64.charAt(42)+r64.charAt(10)+r64.charAt(50)+r64.charAt(18)+r64.charAt(58)+r64.charAt(26)+
                 r64.charAt(33)+r64.charAt(1)+r64.charAt(41)+r64.charAt(9)+r64.charAt(49)+r64.charAt(17)+r64.charAt(57)+r64.charAt(25);
         return r64p;
     }
     public String[] Keygenerate(String key){
    String[] keys=new String[16];
    String key56=pc_1(key);
    String lkey28=key56.substring(0,28);
    String rkey28=key56.substring(28);
      for(int i=0;i<keys.length;i++){
            if(i==0 || i==1 || i==8 || i==15){
                lkey28=Lbitrotate(lkey28, 1);
                rkey28=Lbitrotate(rkey28, 1);
                keys[i]=pc_2(lkey28+rkey28);
            }else{
                lkey28=Lbitrotate(lkey28, 2);
                rkey28=Lbitrotate(rkey28, 2);
                keys[i]=pc_2(lkey28+rkey28);
            }
        }

    return keys;

}
public String pc_1(String key){
    String key56="";
    key56=""+key.charAt(56)+key.charAt(48)+key.charAt(40)+key.charAt(32)+key.charAt(24)+key.charAt(16)+key.charAt(8)+key.charAt(0)+key.charAt(57)+key.charAt(49)+key.charAt(41)+key.charAt(33)+key.charAt(25)+key.charAt(17)+key.charAt(9)+key.charAt(1)+key.charAt(58)+key.charAt(50)+key.charAt(42)+key.charAt(34)+key.charAt(26)+key.charAt(18)+key.charAt(10)+key.charAt(2)+key.charAt(59)+key.charAt(51)+key.charAt(43)+key.charAt(35)+key.charAt(62)+key.charAt(54)+key.charAt(46)+key.charAt(38)+key.charAt(30)+key.charAt(23)+key.charAt(14)+key.charAt(6)+key.charAt(61)+key.charAt(53)+key.charAt(45)+key.charAt(37)+key.charAt(29)+key.charAt(21)+key.charAt(13)+key.charAt(5)+key.charAt(60)+key.charAt(52)+key.charAt(44)+key.charAt(36)+key.charAt(28)+key.charAt(20)+key.charAt(12)+key.charAt(4)+key.charAt(27)+key.charAt(19)+key.charAt(11)+key.charAt(3);
    return key56;
}
   public String pc_2(String key){
    String key48="";
    key48=""+key.charAt(13)+key.charAt(16)+key.charAt(10)+key.charAt(23)+key.charAt(0)+key.charAt(4)+key.charAt(2)+key.charAt(27)+key.charAt(14)+key.charAt(5)+key.charAt(20)+key.charAt(9)+key.charAt(22)+key.charAt(18)+key.charAt(11)+key.charAt(3)+key.charAt(25)+key.charAt(7)+key.charAt(15)+key.charAt(6)+key.charAt(26)+key.charAt(19)+key.charAt(12)+key.charAt(1)+key.charAt(40)+key.charAt(51)+key.charAt(30)+key.charAt(36)+key.charAt(46)+key.charAt(54)+key.charAt(29)+key.charAt(39)+key.charAt(50)+key.charAt(44)+key.charAt(32)+key.charAt(47)+key.charAt(43)+key.charAt(48)+key.charAt(38)+key.charAt(55)+key.charAt(33)+key.charAt(52)+key.charAt(45)+key.charAt(41)+key.charAt(49)+key.charAt(35)+key.charAt(28)+key.charAt(31);
    return key48;
}


  public String Lbitrotate(String bin,int times){
   String binary=bin;
   String binary2="";
   String binarynew="";
   for(int i=0;i<times;i++){
       if(i<1){
       binary2=binary.substring(1)+binary.charAt(0);
       }else{
           binary2=binarynew.substring(1)+binarynew.charAt(0);
       }
       binarynew=binary2;

   }
   return binary2;enter code here