Kriptografi dengan JAVA

Posted: May 2, 2012 in Java Cryptography
Tags: , ,

Telah kita ketahui bahwa kriptografi banyak diimplementasikan pada kehidupan sehari – hari terutama pada era sekarang ini yang sudah serba digital. Banyak aplikasi – aplikasi yang sudah terintegrasi fitur kriptografi seperti pada aplikasi Skype, Thunderbird, Pidgin dll. Pada tulisan kali ini saya mengajak anda sekalian bagaimana mudahnya mengimplementasikan kriptografi untuk membuat aplikasi dengan menggunakan bahasa pemrograman Java. Java menyediakan framework JCE dan JCA yang terdiri dari kelas – kelas dan interface untuk membuat aplikasi kriptografi seperti enkripsi, dekripsi, key generation, message diggest, pembuatan sertifikat digital dll. Kelas – kelas dan interface API ini dapat dilihat pada package java.security dan javax.crypto (klik documentation untuk lebih lengkap). Supaya lebih paham, langsung saja saya berikan contoh impelementasi algoritma AES 256 bit dengan menggunakan JCE dan JCA  :

/**
 *
 * @author agha
 */

import sun.misc.*;
import javax.crypto.*;
import java.security.SecureRandom;
import javax.crypto.spec.SecretKeySpec;

public class AlgoritmaAES {
    static byte[] ciphertext, plaintext, ivBytes;
    public static String encrypt(SecretKeySpec key, String plaintext) throws Exception {
           byte[] pesan = plaintext.getBytes();
           Cipher cipher = Cipher.getInstance("AES");
           cipher.init(Cipher.ENCRYPT_MODE, key);
           ciphertext = cipher.doFinal(pesan);
           String sandi = new BASE64Encoder().encode(cipher text);
           return sandi;
    }
    public static String decrypt(SecretKeySpec key, String ciphertext) throws Exception {
           byte[] sandi = ciphertext.getBytes();
           Cipher cipher = Cipher.getInstance("AES");
           byte[] decodeCipher = new BASE64Decoder().decodeBuffer(cipher text);
           cipher.init(Cipher.DECRYPT_MODE, key);
           plaintext = cipher.doFinal(decodeCipher);
           String pesan = new String(plaintext);
           return pesan;
    }
    public static SecretKeySpec genKey(String key) throws Exception {
           byte[] input = key.getBytes();
           SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
           KeyGenerator kgen = KeyGenerator.getInstance("AES");
           byte[] byteseed = new byte[256];
           secureRandom.setSeed(input);
           kgen.init(256, secureRandom);
           SecretKey kunci = kgen.generateKey();
           byte[] bytes = kunci.getEncoded();
           SecretKeySpec spec = new SecretKeySpec(bytes,"AES");
           return spec;
    }
    public static void main(String[] args) throws Exception {
           String pesan = "Serang kandang ayam jam 5 subuh";
           String kunci = "Indonesia";
           SecretKeySpec key = genKey(kunci);
           System.out.println("Kunci :"+kunci);
          //Enkripsi Pesan
           System.out.println("Plaintext :"+pesan);
           String cipher = encrypt(key,pesan);
           System.out.println("\nEncryption:"+cipher);
          //Dekripsi Pesan
           String plain = decrypt(key,cipher);
           System.out.println("\nDecryption :"+plain);
    }
}

Kelas diatas menggunakan 3 method yaitu encrypt, decrypt dan genKey. Pada method genKey saya menggunakan kelas SecureRandom untuk menggenerate random seed dengan input kunci dari user. Selanjutnya random seed tersebut menjadi parameter input untuk menggenerate kunci AES dengan panjang 256 bit seperti terlihat pada listing code dibawah ini.

...
kgen.init(256, secureRandom);
...

Selain JCE dan JCA, ada juga library bouncy castle yang disediakan untuk mendukung cryptography pada java. Tidak seperti JCE dan JCA yang sudah tersedia pada JDK, untuk menggunakan bouncy castle, kita harus install library secara manual ke JDK atau secara otomatis dengan menambahkan depedence melalui maven repository. Berikut ini langkah langkah instalasi Bouncy Castle secara manual.

  1. Download terlebih dahulu library bouncy castle di http://www.bouncycastle.org/latest_releases.html, lulu esktrak file yang telah di download
  2. Copy file bcprov-jdk16-14.jar (missal menggunakan jdk 1.6) ke directory jre/lib/ext.Jika menggunakan windows, make file harus dicopy untuk JDK dan JRE pada directory yang sama.
  3. Edit file java.security yang terdapat pada directory  jre/lib/security  dan tambahkan provider BC pada list provider seperti contoh dibawah ini. 
    #
    # List of providers and their preference orders (see above):
    #
    security.provider.1=sun.security.provider.Sun
    security.provider.2=com.sun.net.ssl.internal.ssl.Provider
    security.provider.3=com.sun.rsajca.Provider
    security.provider.4=com.sun.crypto.provider.SunJCE
    security.provider.5=org.bouncycastle.jce.provider.BouncyCastleProvider
    
  4. Test apakah Bouncy Castle telah terinstall di JDK dengan listing code dibawah ini. Jika telah terinstall, maka outputnya adalah BC is Installed ”
    import java.security.Security;
    
    /**
     * Basic class to confirm the Bouncy Castle provider is
     * installed.
     */
    public class SimpleProviderTest
    {
        public static void main(String[] args)
        {
            String providerName = "BC";
    
            if (Security.getProvider(providerName) == null)
            {
                System.out.println(providerName + " provider not installed");
            }
            else
            {
                System.out.println(providerName + " is installed.");
            }
        }
    }
    

Contoh algoritma AES diatas menggunakan provider JCE dan JCA yang dimiliki oleh JDK. Jika kita ingin menggunakan provider BC, maka tambahkan kode provider BC ketika menggunakan method getInstance pada kelas Cipher. Contohnya sebagai berikut

...
Cipher cipher = Cipher.getInstance("AES", "BC");
...

Sekian pengenalan coding kriptografi menggunakan Java dari saya. Semoga bermanfaat 😀

Sumber : David Hook. Beginning Cryptography with Java

Advertisements
Comments
  1. permisi mas, numpang tanya,
    gmn mas caranya jika kta mau hashing sebuah string dengan library bouncycastle, gmn tu mas crnya ,, maklum mas msh awam di java heheeheheheh

    • iocvo says:

      waduh maaf nih baru buka blog lagi setelah sekian lama 😀
      klo mw pake library bouncy castle setau ane tambahin provider BC aja pas panggil method getInstance, contoh

      ...
      MessageDigest md = MessageDigest.getInstance("MD5","BC");
      ...
      

      sisanya seperti biasa untuk hashing string, tapi karena nilai inputnya byte jadi string diubah dulu ke byte

      ...
      md.update(text.getBytes());
      byte[] digest = md.digest();
      String hasText = new String(digest);
      ...
      

      code diatas sudah dicoba dan berhasil tapi klo mw pake methodnya bouncycastle liat aja dokumentasinya (blm smpet nyoba :D)
      klo salah diperbaiki aja, kita sama2 belajar ane juga newbie 😀

  2. jacko says:

    gan kalu 128 bit tinggal gnti angka yg di : “kgen.init(256, secureRandom);” mjd 128 kah??

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s