Lompat ke konten Lompat ke sidebar Lompat ke footer

Penerapan Kriptografi Algoritma RC4 Menggunakan Java

RC4 adalah penyandian stream cipher yang dibuat oleh Ron Riverst pada tahun 1987 untuk pengamanan RSA. Algoritmanya didasarkan pada permutasi acak. Kunci dengan panjang variable 1 – 256 bytes digunakan untuk inisialisasi sebuah state.

Vector S dengan panjang 256 byte, dengan elemen S[0], S[1],…,S[255]. S terdiri dari permutasi semua bilangan 8 bit dari 0 – 255 untuk enkripsi atau deskripsi, sebuah byte K dibangkitkan dari S dengan memilih 1 dari 255 entri dengan cara sistematis. Setiap kali k dibangkitkan, entri-entri pada S sekali lagi dipermutasikan. ^ inisialisasi S Entri – entri S di set dari 0 – 255 dengan urutan naik; S[0] = 0, S[1] = 1,….,S[255] = 255.

 vektor sementara T juga dibuat. Jika panjang kunci dari K =256 byte, lalu K di transper ke T. Jika tidak, untuk setiap kunci dengan panjang keylen byte, elemen keylen pertama T dicopykan dari K. Dan K diulang beberapa kali untuk mengisi T. /* inisialisasi */ for i = 0 to 255 do S[i] = i; T[i] = K [i % keylen];

 lalu kita menggunakan T untuk menginisialisasi permutasi S. Dimulai dengan S[0] hingga S[255] dan untuk setiap S[i], tukar S[i] dengan byte lainnya pada S berdasarkan skema. /* inisial permutasi */ j = 0; for i = 0 to 255 do j = (j + S[i] + T[i] % 256 ); swap ( s[i], S[j] );

karena operasi pada S hanya pertukaran maka hanya terjadi permutasi dengan S tetap semua bilangan antara 0 – 255. ^ Pembangkitan Stream Setelah S diinisialisasi, key input tidak lagi dipakai.

 Pembangkitan stream dimulai dengan S[0] – S[255] dan untuk setiap S[i], menukar S[i] dengan byte lainnyadalam S berdasarkan skema berikut.

 Setelah S[255] dicapai proses berlanjut, dimulai kembali dari S[0]. /* stream generation */ i,j = 0; While (true) i = ( i+1 ) % 256; j = ( j + S[i]) % 256; swap ( S[i], S[j] ); t = ( S[i], S[j] )% 256; k= S[t]; untuk enkripsi, XOR nilai K dengan byte selanjutnnya pada plainteks.

Untuk dekripsi, XOR nilai K denganbyte selanjutnya pada cipherteks.

package kriptografi;

public class appRC4 {
private static String algorithm = "RC4";

public static void main(String[]args){
     appRC4 x=new appRC4();
     x.mulai();
}
void mulai(){
    try {
        String password="lp2maray";
        String path=System.getProperty("user.dir")+"\\tesdoc\\";
        System.out.println("path="+path);      
        String pathFile=path+"tonnyaray.docx";
     
        File fpathFile=new File(pathFile);
        String nf=fpathFile.getName();//tesdoc.doc
        String absnf=fpathFile.getParent();//nama folder
     
        appRC4 x=new appRC4();
        byte[]doc2Byte=x.doc2Byte(pathFile);
        String kalisidoc=x.byte2String(doc2Byte);
     
        String nfEn=absnf+"\\EN-"+nf;
        byte[] encrypted = x.encrypt(kalisidoc, password);  
        x.saveByte(encrypted,nfEn);
     
        //+++++++++++++++++++++++++++++++++++++
        //Baca FIle Dekrip
        String passworddek="lp2maray";
     
//        String pilihfile="";//D:\foldrer/a.doc
//        String saveke="";//D:\skripsi\
//        File ff=new File(pilihfile);
//        String NFs=ff.getName();
//        pathFileEn=saveke+"\\EN-"+NFs;
     
        String pathFileEn=nfEn;
        File fpathFileDek=new File(pathFileEn);
        String nfdec=fpathFileDek.getName();//tesdoc.doc
        String absnfdec=fpathFileDek.getParent();
   
        appRC4 xx=new appRC4();
        byte[]doc2ByteDek=xx.doc2Byte2(pathFileEn);
        //String kalimatdek=xx.byte2String(doc2ByteDek);
        String nfDek=absnfdec+"\\DEK-"+nfdec;
        String dekrip=xx.decrypt(doc2ByteDek,password);
        byte[]doc2ByteXX=xx.string2Byte(dekrip);
        xx.saveByte(doc2ByteXX,nfDek);
     
    } catch (Exception ex) {
        Logger.getLogger(appRC4.class.getName()).log(Level.SEVERE, null, ex);
    }
}

  void plays(){
      try {
          appRC4 xx=new appRC4();
          String toEncrypt = "apa kabar bro";
          System.out.println("Encrypting...");
          byte[] encrypted = xx.encrypt(toEncrypt, "123");//password
          System.out.println("Encrypted text : "+toEncrypt);
       
          String hasil="";
          String[] data1 = new String[encrypted.length];
          for(int i=0; i < encrypted.length; i++) {
              data1[i] = String.valueOf(encrypted[i] & 0xff); //unsigned integer
              hasil+=data1[i];
          }
       
          System.out.println("Decrypting...");
          String decrypted = xx.decrypt(encrypted, "123");//password
          System.out.println("Decrypted text: " + decrypted);
      } catch (Exception ex) {
          Logger.getLogger(appRC4.class.getName()).log(Level.SEVERE, null, ex);
      }
   }

   public static byte[] encrypt(String toEncrypt, String key) throws Exception {
      SecureRandom sr = new SecureRandom(key.getBytes());
      KeyGenerator kg = KeyGenerator.getInstance(algorithm);
      kg.init(sr);
      SecretKey sk = kg.generateKey();

      // create an instance of cipher
      Cipher cipher = Cipher.getInstance(algorithm);

      // initialize the cipher with the key
      cipher.init(Cipher.ENCRYPT_MODE, sk);

      // enctypt!
      byte[] encrypted = cipher.doFinal(toEncrypt.getBytes());

      return encrypted;
   }

   public static String decrypt(byte[] toDecrypt, String key) throws Exception {
      // create a binary key from the argument key (seed)
      SecureRandom sr = new SecureRandom(key.getBytes());
      KeyGenerator kg = KeyGenerator.getInstance(algorithm);
      kg.init(sr);
      SecretKey sk = kg.generateKey();

      // do the decryption with that key
      Cipher cipher = Cipher.getInstance(algorithm);
      cipher.init(Cipher.DECRYPT_MODE, sk);
      byte[] decrypted = cipher.doFinal(toDecrypt);

      return new String(decrypted);
   }

    String decrypt(String gabEnkrip, String PASS) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }


private String byteArrayToHexString(String b) {
        StringBuffer sb = new StringBuffer(b.length() * 2);
        for (int i = 0; i < b.length(); i++) {
            char[]bb=b.toCharArray();////
            int v = bb[i] & 0xff;
            if (v < 16) {
                    sb.append('0');
            }
            sb.append(Integer.toHexString(v));
        }
        return sb.toString().toUpperCase();
    }

   byte[] doc2Byte2(String NF){
            File f = new File(NF);
            byte[] bit = new byte[(int)f.length()];
            try{
                FileInputStream fis = new FileInputStream(f);
                fis.read(bit);
                fis.close();
            }catch(Exception exc){}
         
            //hasil = DatatypeConverter.printBase64Binary(bit);
   return bit;      
   }
         
 
    byte[] doc2Byte(String NF){
        Path path = Paths.get(NF);
        byte[] data=null;
        try {
            data = Files.readAllBytes(path);
        } catch (IOException ex) {
            Logger.getLogger(appRC4.class.getName()).log(Level.SEVERE, null, ex);
        }
        return data;
    }
 
   String byte2String(byte[]data){
      String gab="";
        for(int i=0; i < data.length; i++) {
            String al = String.valueOf(data[i]& 0xff ); // & 0xff unsigned integer
             int ii=Integer.parseInt(al);
             char c=(char)ii;
             gab=gab+c;
         }
        return gab;
   }
 
     private void saveString(String dataString,String NF) {
          try {
           String content = dataString;
           File file = new File(NF);
           System.out.println(NF);
           if (!file.exists()) {
               file.createNewFile();
           }
         
           FileWriter fw = new FileWriter(file.getAbsoluteFile());
           BufferedWriter bw = new BufferedWriter(fw);
           bw.write(content);
           bw.close();
           System.out.println("File Berhasil di simpan ! lihat di : "+NF);
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
      void saveByte(byte[] databyte,String NF)  {
        try {
            Path path = Paths.get(NF);
            Files.write(path, databyte); //creates, overwrites
            System.out.println("File Berhasil di dekripsi ! lihat di : " + NF);
        } catch (IOException ex) {
            Logger.getLogger(appRC4.class.getName()).log(Level.SEVERE, null, ex);
        }
     }
     String byte2String2(byte[]data){
    String gab="";
        for(int i=0; i < data.length; i++) {
              char c=(char)(int)data[i];
              gab=gab+c;
         }
        return gab;
}

byte[] string2Byte(String data){
    char[]ar=data.toCharArray();
    byte[]bit=new byte[ar.length];
        for(int i=0; i < ar.length; i++) {
              int c=(int)ar[i];
              bit[i]=(byte)c;
         }
        return bit;
}

}

Posting Komentar untuk "Penerapan Kriptografi Algoritma RC4 Menggunakan Java"