Archive for the ‘Java Cryptography’ Category

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