Jumat, 02 November 2012

Enkripsi AES di Java

     Di hari minggu yang mendung bikin galau ini, gw pengen nulis satu lagi catatan yang kemarin bikin galau jg. Catatan ini mengenai  enkripsi menggunakan AES di platfrom java. Langsung aja ke code 

import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class TUtil {

public static byte[] convertStr2Byte() {
String strKey = "11C54021B1232ABD21A2121B10A3112C";
        byte[] byteArray = new byte[strKey.length() / 2];

        for (int i = 0; i < strKey.length(); i += 2) {
            char ch1 = strKey.charAt(i);
            char ch2 = strKey.charAt(i + 1);

            int int1 = Character.digit(ch1, 16);
            int int2 = Character.digit(ch2, 16);

            int value = int1 * 16 + int2;
            byteArray[i / 2] = (byte) value;
        }
        return byteArray;
}

public static String encryptAES(String data){
byte[] bytKey = convertStr2Byte();
String retEncData = null;

try {
SecretKey aesKey = new SecretKeySpec(bytKey, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
     
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
byte[] encData = cipher.doFinal(data.getBytes());
retEncData = new String();
for (int i = 0; i < encData.length; i++) {
retEncData += byteToHex(encData[i]);
}
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
throw new IllegalStateException(e);
}
return retEncData;
}

static public String byteToHex(byte b) {
// Returns hex String representation of byte b
   char hexDigit[] = {
        '0', '1', '2', '3', '4', '5', '6', '7',
        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
     };
   char[] array = { hexDigit[(b >> 4) & 0xf], hexDigit[b & 0xf] };
   return new String(array);
}
}

Pada fungsi main kita hanya panggil seperti code dibawah ini

................
................
String plainStr = "Ardi Cakep";
String encryptStr = TUtil.encryptAES(plainStr);

System.out.println("Result Encrypt : "+encryptStr);
.................
.................

Mau tau hasilnya?? Coba sendiri donk :D
Berikut ini saya akan mensinapsiskan maksud masing-masing fungsi yang terdapat pada class TUtil.java.
     Fungsi convertStr2Byte, yakni untuk mengubah string ke byte. Bisa dilihat kalau key yang dipake untuk encrypt dalam hal ini variabel strKey adalah string, yang memiliki panjang 32. Nah dalam hal ini kita ingin mengubah dari 32 ke 13 hexadecimal.
      Fungsi byteToHex, yakni mengubah byte ke dalam bentuk interpretasi hexa, tapi perlu diingat kalau ini hanya representasi dari hexa bukan hexa ya. Karena bentuk balikan dari fungsi ini adalah string.
      Fungsi encryptAES, yakni untuk mengubah plain ke bentuk yang sudah terenkript. Code yang perlu diingat adalah bagian SecreatKey, Cipher.getInstance, Cipher.init karena intinya memang disitu (sorry kalo sotoy :metal).

Sekian dulu ya, 

Yang decrypt nyusul kalau sempet, tp yang decrypt bisa lihat jg di link ini kok :D

3 komentar:

  1. kita juga punya nih jurnal mengenai enkripsi, silahkan dikunjungi dan dibaca , berikut linknya
    http://repository.gunadarma.ac.id/bitstream/123456789/2274/1/01-03-010-Penerapan%5BRangga%5D.pdf
    semoga bermanfaat yaa :)

    BalasHapus
  2. Ingin tanya mas, berdasarkan informasi cara amazon dan pemasoknya berhubungan dari tautan berikut (http://wiki.sellercloud.com/channel-management/amazon-vendor-central#attachment-wuid:gx:6bb9c27829be90de), pada halaman 20, purchase order yang diterima oleh pemasoknya amazon.com dikirim menggunakan protokol rfc 4130 (AS2) dan amazon memilih algoritma enkripsi Triple DES 168-bit untuk mengamankannya, kalau ingin belajar Triple DES dimulai dari mana ya pak? Saya sudah menelusuri kode sumber contoh protokol rfc 4130 (AS2) milik Pak Philip Helger berikut (https://github.com/phax/as2-lib/blob/master/as2-lib/src/test/java/com/helger/as2lib/supplementary/main/MainSendToMendelsonTest.java#L104), beliau juga mencontohkan penggunaan triple des, bila ditelusuri lebih dalam lagi kelas yang relevan adalah org.bouncycastle.cms.jcajce.JceCMSContentEncryptorBuilder(), jika konstruktor kelas tersebut diberi nilai des_ede3_cbc maka ujung-ujungnya juga membuat kelas Cipher dengan metode factory berikut new javax.crypto.Cipher.getInstance("DESEDE/CBC/PKCS5Padding", "BC");, terima kasih, mohon bimbingannya.. saya sendiri sudah mencoba membuat tiruan as2 tapi untuk pemahaman cara kerja saya sendiri masih belum ngeh dengan as2, berikut tulisan saya https://datacomlink.blogspot.co.id/2016/12/mengenkripsi-dan-menandatangani-tubuh.html?m=1

    BalasHapus