Langsung ke konten utama

Encrypt Decrypt dengan Java

Encrypt dan decrypt merupakan pekerjaan wajib bila kita berkomunikasi dengan jalur jaringan, apalagi jika jaringan yang kita gunakan adalah jaringan public tanpa keamanan. Kemarin saya mendapat "Job" untuk membuat program untuk mengengkrip (versi indonesianya encrypt) data. Kalau anda menguasai PHP, maka yang pertama di pikiran anda adalah fungsi md5()-nya PHP, memang benar itu juga yang pertama kali muncul di pikiran saya. Tapi kemudian saya berpikir terus bagaimana cara untuk menampilkan dekripnya? Belum ketemu sampai sekarang.

Saya juga punya CodeExplorer Ultimate Arsenal for Delphi programming, kumpulan ribuan tips dan trik delphi yang dikumpulkan menjadi satu program. Banyak juga trik untuk mengengkrip inputan, sayang metodenya terlalu sederhana disamping kodingnya masih belepotan. Yang ada hanya mengengkrip dengan merubah perkarakter menjadi 3 (atau berapapun) karakter sesudahnya, sebagai catatan algoritma ini pernah saya gunakan untuk membuat program mirip notepad dengan fungsi enkrip tulisan.

Kurang puas rasanya kalau enkripnya terlalu sederhana seperti itu, mudah sekali untuk ditembus. Finally, saya merujuk juga ke paman Google dengan keyword "encrypt and decrypt with java". Kenapa "... with java"? ya karena itu bahasa pemrograman yang sedang saya pelajari, jadi sekalian memperdalam ilmu githu... Binggo...!!! Ini dia hasilnya.

Ah ketemu juga dan (seperti biasanya) terlampau banyak. Cari and cari, ketemu tuh website kodejava.org,
devx.com, dan ini dia forum.java.sun.com. Masih banyak yang lain, tapi tidak perlu saya sebutkan satu persatu. Semuanya memberikan contoh enkrip dan dekrip menggunakan Java mulai dari yang paling sederhana sampai yang sangat rumit. Dan pilihan saya jatuh pada sumber yang berasal dari forum.java.sun.com. Source Codenya seperti di bawah ini :

import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.interfaces.*;
import javax.crypto.spec.*;
//import com.pm.logs.*;
import
sun.misc.BASE64Encoder;

public
class DESEncryptor {

public static byte [] encrypt (String passphrase, byte [] data) throws Exception {

byte [] dataTemp;
//PMLogger logger = new PMLogger(PMLoggerConstants.DEFECTO);

try {
Security.addProvider( new com.sun.crypto.provider.SunJCE() );
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(passphrase.getBytes());
DESKeySpec key = new DESKeySpec (md.digest());
SecretKeySpec DESKey = new SecretKeySpec (key.getKey(), "DES");

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, DESKey);
dataTemp = cipher.doFinal (data);
} catch (Exception e) {

//logger.error("[com.pm.util.directorio.DESEncryptor][encrypt] Se produjo una excepción durante la encriptación: "+e);

throw e;

}

return dataTemp;
}

public static byte [] decrypt (String passphrase, byte [] data) throws Exception {

byte [] dataTemp;

//PMLogger logger = new PMLogger(PMLoggerConstants.DEFECTO);

try {
Security.addProvider( new com.sun.crypto.provider.SunJCE() );
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(passphrase.getBytes());
DESKeySpec key = new DESKeySpec (md.digest());
SecretKeySpec DESKey = new SecretKeySpec (key.getKey(), "DES");

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, DESKey);

dataTemp = cipher.doFinal (data);

}
catch (Exception e) {

//logger.error("[com.pm.util.directorio.DESEncryptor][decrypt] Se produjo una excepción durante la desencriptación: "+e);

throw e;

}

return dataTemp;

}

public static void main(String[] args) throws Exception {

// Datos de entrada:
// args[0] -> cadena para generar la clave de encriptación
// args[1] -> datos a encriptar

String sClave = new String (args[0]);
String sDatos = new String (args[1]);
byte [] ba = sDatos.getBytes ();

System.out.println("CLAVE: " + sClave);
System.out.println("MENSAJE ORIGINAL: " + new String (ba));

// Encriptación

ba = DESEncryptor.encrypt (sClave, ba);
System.out.println("MENSAJE ENCRIPTADO: " + new BASE64Encoder().encodeBuffer (ba));

// Desencriptación

ba = DESEncryptor.decrypt (sClave, ba);
System.out.println("MENSAJE DESENCRIPTADO: " + new String (ba));

}

}

Komentarnya pake bahasa aneh ya? Yach namanya juga ngopy, ngalah dong.... bagaimanapun kan mereka yang buat kita tinggal make, bener nggak?

Saya pilih yang ini karena codingnya sederhana dalam arti mudah diimplementasikan dan direnovasi tanpa harus mengetahui logikanya secara pasti, dan juga hasilnya lumayan bagus. Ditambah lagi penggunaan passphrase (ehm ehm "Clave") yang fleksibel, semakin lengkap sudah kemampuan enkripnya.

What's the code means? Jangan tanya saya, saya juga ada beberapa baris yang nggak tahu maksudnya. The big deal is, kodingnya sudah cukup dan bisa digunakan untuk keperluan enkrip dan dekrip. Tinggal buat instance classnya, panggil method encrypt(arg0, arg1); dan method decrypt(arg0, arg1); kalau masih kurang, kalo perlu buat static aja dan (as i do) rubah parameternya menjadi String semua nah malah lebih enak digunakan, ya tho....?

Komentar

Dawud Tan mengatakan…
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 mas? Saya sudah menelusuri kode sumber contoh protokol rfc 4130 (AS2) milik mas 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

Postingan populer dari blog ini

ternyata melanggar SUMPAH ........

Pernah suatu ketika Abu Bakar Ash-Shidiq salah satu sahabat nabi yang paling hebat, mendapat tamu pada jam makan. Tuan rumah yang baik tentu saja tidak akan meninggalkan tamunya dalam keadaan lapar, maka beliau pun menyuruh putranya untuk menyiapkan makanan untuk para tamunya tersebut. Sementara beliau sendiri lebih suka makan bersama putrinya dan menantunya yaitu Siti (Sayyidatina) 'Aisyah dan Rasulullah SAW. Akhirnya untuk urusan perjamuan makan diserahkan kepada putranya, sedangkan beliau pergi sejenak untuk makan bersama Rasulullah. Setelah makanan dihidangkan dan tamu dipersilahkan untuk makan, para tamu malah bertanya tentang Abu Bakar, kemudian putranya menjawab bahwa Abu Bakar saat itu sedang pergi ke rumah Rasulullah untuk makan, dan menyerahkan tanggung jawab perjamuan kepada putranya. Langsung saja para tamu tadi menolak untuk menyantap makanan yang telah dihidangkan kecuali sang tuan rumah (Abu Bakar) mau menyantapnya terlebih dahulu. Setelah selesai makan, Abu Bakar pu...

Antara PHP, JSP dan ASP

PHP vs JSP vs ASP Tepat sekali ketiganya adalah bahasa pemrograman scripting serverside untuk aplikasi berbasis web, saya rasa tidak perlu menjelaskan lebih jauh tentang definisinya, ada banyak sekali artikel di internet yang membahas tentang hal tersebut. Saya hanya ingin membandingkan antara ketiga bahasa pemrograman tersebut. Tapi asal tahu saja, sekarang saya hanya mendalami PHP, sedangkan yang lain hanya saya dengar dan baca dari beberapa artikel. Mengapa memilih PHP? PHP merupakan bahasa scripting yang powerfull dan juga sangat sederhana, mudah dipelajari. Apalagi saya pertama kali belajar bahasa pemrograman menggunakan C, jadi bisa dikatakan sangat cocok sekali. Sebenarnya yang paling menarik dari PHP (menurut saya) adalah syntaxnya yang sangat simpel dan juga koneksi ke database MySQL yang cukup mudah. Kelebihan lain tentu karena harganya yang gratis, sehingga kita tidak perlu terikat lisensi apapun untuk membuat aplikasi berbasis web dengan PHP. Dan selanjutnya adalah dukunga...

Programmer Produktif dengan Framework

Pernah mendengar Zend Framework, Prado, Google Web Toolkit (GWT), Drupal, atau DotNetNuke? Semua itu adalah jenis-jenis framework untuk developing web. Apa itu Framework? Nah inilah kesalahan saya, kenapa tadi lupa mencari di internet definisi yang tepat tentang framework, ya sudah karena lupa saya mencoba mendefinisikan secara sederhana dan semampu saya. Mungkin saja definisi yang saya buat malah lebih baik dan lebih menggambarkan framework, He hehehehe. Framework terjemahan mudahnya adalah kerangka kerja, sedangkan dalam dunia pemrograman framework adalah bentuk kumpulan perintah suatu bahasa pemrograman yang telah diatur sedemikian rupa menjadi beberapa modul-modul untuk mempermudah pemrograman. Berbeda dengan CMS (content management system), framework bisa dibilang adalah komponen setengah matang yang memang disiapkan agar bisa digunakan untuk membentuk kerangka pemrograman secara lebih mudah. Sedangkan CMS atau templating, biasanya telah menyediakan layout dan tampilan administras...