Kriptografi Algoritma RC4 Menggunakan Java
Oleh Afa HernandesDiperbarui 5 menit baca
Seri · Bagian 4 dari 6Kriptografi dengan 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.docString 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 DekripString 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.docString 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");//passwordSystem.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 integerhasil+=data1[i];}
System.out.println("Decrypting...");String decrypted = xx.decrypt(encrypted, "123");//passwordSystem.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 integerint 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, overwritesSystem.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;}
}