Rabu, 17 Juli 2013

Membuat Algoritma Enkripsi AES di Android

Membuat Algoritma Enkripsi AES pada AndroidMembuat Algoritma Enkripsi AES di Android ini penulis buat karena ada permintaan dari teman. Sebelumnya kita pernah mencoba Membuat Enkripsi MD5 di Android. Sejujurnya penulis kurang ahli dalam enkripsi, karena algoritmanya benar-benar ruwet dan memusingkan ^_^'.

Berbeda dengan algoritma MD5 yang merupakan algoritma enkripsi satu arah, yaitu setelah diencrypt maka tidak dapat didecrypt lagi. Algoritma enkripsi AES ini dua arah, artinya bisa untuk mengenkripsi dengan kata kunci tertentu, untuk kemudian bisa dideskripsi kembali ke teks semula menggunakan kata kunci yang sama.

Kita mulai saja, buat Project Android baru di Eclipse, kemudian pada layout activity_main.xml kita beri kode program seperti ini :


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text Original" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Encrypt" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text Encrypted" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Decrypt" />

</LinearLayout>

Selanjutnya pada program utama, MainActivity.java kita beri kode program seperti di bawah ini :

package com.amijaya.android_aes_encryption;

import java.security.SecureRandom;

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

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

 // nuramijaya@gmail.com
 // http://cariprogram.blogspot.com
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Button button1 = (Button)findViewById(R.id.button1);
  button1.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    //String crypto = SimpleCrypto.encrypt(masterpassword, cleartext)
    try {
     EditText editText1 = (EditText)findViewById(R.id.editText1);
     EditText editText2 = (EditText)findViewById(R.id.editText2);
     String crypto = SimpleCrypto.encrypt("rahasia", editText1.getText().toString());
     editText2.setText(crypto);
     editText1.setText("");
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   }
  });
  
  Button button2 = (Button)findViewById(R.id.button2);
  button2.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    //String cleartext = SimpleCrypto.decrypt(masterpassword, crypto)
    try {
     EditText editText1 = (EditText)findViewById(R.id.editText1);
     EditText editText2 = (EditText)findViewById(R.id.editText2);
     String cleartext = SimpleCrypto.decrypt("rahasia", editText2.getText().toString());
     editText1.setText(cleartext);
     editText2.setText("");
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    
   }
  });
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

}

/**
 * Usage:
 * <pre>
 * String crypto = SimpleCrypto.encrypt(masterpassword, cleartext)
 * ...
 * String cleartext = SimpleCrypto.decrypt(masterpassword, crypto)
 * </pre>
 * @author ferenc.hechler
 */
class SimpleCrypto {

    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 String fromHex(String hex) {
        return new String(toByte(hex));
    }

    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));
    }

}


Pada file konfigurasi AndroidManifest.xml tidak perlu kita ubah, misalnya akan berisi seperti ini :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amijaya.android_aes_encryption"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.amijaya.android_aes_encryption.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Setelah dijalankan, hasilnya :

Membuat Algoritma Enkripsi AES pada Android

Jika kita masukkan kata atau kalimat, kemudian kita klik tombol Encrypt, maka akan tampil hasil enkripsinya di TextBox bawahnya.

Membuat Algoritma Enkripsi AES pada Android Proses Decrypt

Sedangkan jika kita klik tombol Decrypt maka teks yang sudah terenkripsi di TextBox bawah akan kembali terdeskripsi ke TextBox sebelah atas.

Program selengkapnya dapat anda download disini. Jika mengalami kesulitan download, ini caranya.

Semoga cukup bermanfaat.

Artikel lain yang sejenis :

Membuat Enkripsi MD5 di Android.

4 komentar: