Selasa, 04 September 2012

Aplikasi Enkripsi dan Dekripsi Menggunakan AES di Android

Kriptograpi pada salah satu buku dituliskan sebagai ilmu yang merahasiakan sebuah rahasia. Salah satu metode yang dapat digunakan untuk merahasiakan sebuah rahasia adalah enkripsi.
Untuk kali ini akan saya sharing sebuah aplikasi enkripsi dan dekripsi menggunakan Algoritma AES yang berjalan di Android. Untuk library yang saya gunakan pada aplikasi ini adalah JCE (Java Cryptography Extension). Tampilan dari aplikasi ini adalah sebagai berikut:

Untuk mulai membangun aplikasi ini, terlebih dahulu dibuat layout dari aplikasi. kode untuk menampilkan tampilan seperti di atas adalah sebagai berikut (ditulis di dalam main.xml yang berada di dalam direktory res/layout) :
 <?xml version="1.0" encoding="utf-8"?>  
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   android:orientation="vertical"  
   android:layout_width="fill_parent"  
   android:layout_height="fill_parent"  
   >  
 <TextView  
      android:id="@+id/teks_kunci"  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      android:text="Masukkan kunci"   
      />  
 <EditText  
      android:id="@+id/input_kunci"  
      android:layout_width="fill_parent"  
      android:layout_height="wrap_content"   
      />  
 <TextView  
      android:id="@+id/teks_kata"  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      android:text="Masukkan kata"   
      />  
 <EditText  
      android:id="@+id/input_kata"  
      android:layout_width="fill_parent"  
      android:layout_height="wrap_content"   
      />  
 <Button   
      android:id="@+id/enkrip_button"  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      android:text="Enkrip"  
      />  
 <EditText  
      android:id="@+id/teks_enkrip"  
      android:layout_width="fill_parent"  
      android:layout_height="wrap_content"   
      />  
 <Button   
      android:id="@+id/dekrip_button"  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      android:text="Dekrip"  
      />  
 <EditText  
      android:id="@+id/teks_dekrip"  
      android:layout_width="fill_parent"  
      android:layout_height="wrap_content"   
      />  
 </LinearLayout>  




Selanjutnya adalah Activity utama dari aplikasi. Untuk aplikasi ini saya beri nama AESAndroidActivity dan kelas activitynya adalah AESAndroidActivity.java. Isi dari kelas AESAndroidActivity.java adalah sebagai berikut:


package org.aes;

import android.app.Activity;
import android.os.Bundle;
import android.widget.*;
import android.view.*;
import android.view.View.*;

public class AESAndroidActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // set Instance
        final Button enkripButton = (Button)findViewById(R.id.enkrip_button);
        final Button dekripButton = (Button)findViewById(R.id.dekrip_button);
        final EditText inputKunci = (EditText)findViewById(R.id.input_kunci);
        final EditText inputKata = (EditText)findViewById(R.id.input_kata);
        final EditText teksEnkrip = (EditText)findViewById(R.id.teks_enkrip);
        final EditText teksDekrip = (EditText)findViewById(R.id.teks_dekrip);
        // handling for enkripButton
        enkripButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
        String ambilKunci = inputKunci.getText().toString();
        String ambilKata = inputKata.getText().toString();
        String enKata = "";
        try {
        enKata = GenerateAES.encrypt(ambilKunci, ambilKata);
        } catch (Exception e) {}
        teksEnkrip.setText(enKata);
        }
        });
        // handling for dekripButton
        dekripButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
        String ambilKunci = inputKunci.getText().toString();
        String ambilKata = teksEnkrip.getText().toString();
        String deKata = "";
        if(!ambilKata.equals(null)) {
            try {
            deKata = GenerateAES.decrypt(ambilKunci, ambilKata);
            } catch(Exception e) {
           
            }
            teksDekrip.setText(deKata);
        }
        }
        });
    }
}



Sedangkan kelas untuk menghasilkan algoritma AES pada aplikasi ini saya beri nama GenerateAES.java. Isi dari GenerateAES.java adalah sebagai berikut:


package org.aes;

import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.SecureRandom;

public class GenerateAES {
//private Cipher cipher;
//private SecretKeySpec sKey;
public GenerateAES() {
}

public static String encrypt(String seed, String cleartext) throws Exception {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] result = encrypt(rawKey, cleartext.getBytes());
        return toHex(result);
}

public static String decrypt(String seed, String encrypted) throws Exception {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] enc = toByte(encrypted);
        byte[] result = decrypt(rawKey, enc);
        return new String(result);
}

private static 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;
}


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

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

public static String toHex(String txt) {
        return toHex(txt.getBytes());
}

public static byte[] toByte(String hexString) {
        int len = hexString.length()/2;
        byte[] result = new byte[len];
        for (int i = 0; i < len; i++)
                result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
        return result;
}

public static String toHex(byte[] buf) {
        if (buf == null)
                return "";
        StringBuffer result = new StringBuffer(2*buf.length);
        for (int i = 0; i < buf.length; i++) {
                appendHex(result, buf[i]);
        }
        return result.toString();
}
private final static String HEX = "0123456789ABCDEF";
private static void appendHex(StringBuffer sb, byte b) {
        sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
}
}



Jika sudah jadi semua, tahap selanjutnya adalah melakukan kompilasi dan menjalankan aplikasi.
Happy coding. Salam open source.

14 komentar:

Unknown mengatakan...

postinganya bagus

ari mengatakan...

Postingan yang mantap...Kalo untuk enkripsi suara ada sarankah?

Unknown mengatakan...

apa ini AES dengan kunci 128 bit mas???

Anonim mengatakan...

Mas klo cara memasang library JCE'y gmna ya...tlng bantuannya

nang's blog mengatakan...

@Rich Bob Iya mas 128 bit.

@Anonim Klo masang JCE-nya itu tinggal di import saja. Seperti ini:
import javax.crypto.*;
import javax.crypto.spec.*;

Unknown mengatakan...

gan ini scrip yang generateAES di taruh dimana yah gan??mohon pencerahan

Unknown mengatakan...

mas kq waktu proses deksripsi saya massukan kode yang salah kq g ke luar ya mas,,.,.,.

Unknown mengatakan...

Mas kalau di ganti dengan algoritma RSA gimana.? bagian mana yang perlu di ganti thanks...

Unknown mengatakan...

gan kok nggak bisa di dekripsi ya, yg salah apa ya kira2?mohon bantuannya trims

Unknown mengatakan...

Gan kenapa pas di dekrip engga bisa?

Unknown mengatakan...

ada yang versi matlab ndak gan? mohon bantuannya...

Anonim mengatakan...

gan kenapa yg deskripnya ga bisa ?

wisnu dzulqarnain akbar mengatakan...

bad source code. perhitungan manual sama dari sistem beda.kasih tahu cara yang aslinya.

Unknown mengatakan...

Dekripnya ga bisa gaan 😂