26 August 2008

Data Encription Standard & MD5 di Java

DES ya?
Tidak seperti halnya MD5, DES(Data Encryption Standard) menggunakan sebuah file key untuk melakukan enkripsi dan dekripsi. Jadi, hasil enkripsi dari sebuah kalimat akan berbeda sesuai dengan key yang digunakan. Dan untuk bisa melakukan dekrip, harus menggunakan key sesuai dengan pembuatnya. Key persis berperan sebagai kunci pembuka. Untuk teorinya, silakan tanyakan ke dosen masing-masing aja. Sedangkan contoh ini merupakan penerapan DES, yang sekaligus merupakan enkripsi dari md5. class DES akan membuat key terlebih dahulu apabila belum ada. Key ini yang akan selalu digunakan untuk melakukan enkripsi. Dekripsi tidak bisa dilakukan apabila key ini hilang, karena pembuatan key baru pasti akan menghasilkan key yang berbeda dengan sebelumnya.
Pada contoh gambar, Input yang pertama merupakan Kalimat yang kemudian dienkrip. Sedangkan pada input kedua mencoba melakukan dekrip dari hasil pertama. Melakukan dekrip pada kata yang bukan merupakan hasil enkrip DES akan menyebabkan IllegalFormatException seperti saat pertama. Selain itu, ada proses enkripsi didahului MD5 kemudian baru DES.
Sebenarnya, penggunaan MD5 dan DES sendiri berbeda. MD5 digunakan khusus untuk mendapat hash dari kalimat atau file, dan tidak diperlukan proses dekripsi. Untuk mendapatkan kebenaran dari nilai MD5, dilakukan dengan membandingkan nilai tersebut dengan hasil enkrip MD5 kata itu lagi, bukan dengan proses dekripsi. Kita tidak bisa mendapatkan nilai awal dari sebuah hasil enkripsi MD5. Sedangkan DES sendiri memungkinkan untuk melakukan enkripsi sekaligus dekripsi untuk mengembalikan nilai awal, dengan key yang tepat tentunya. Meskipun untuk saat ini sudah tidak diterapkan secara profesional karena kelemahan algoritma ini yang bisa dipecahkan dengan cara brute force, tapi, sudah lumayan, bisa buat mainan surat rahasia.
Untuk class MD5 berasal dari posting sebelumnya.
Mmmmmm, jadi pengin membahas DSA, Digital Signature Algorithm nih, lengkap dengan PKI-nya. Jauh lebih menarik! Eh iya, ngga ada download source kali ini, kayaknya bisa langsung jadi deh.

import java.io.*;
import java.security.*;
import javax.crypto.*;
import sun.misc.*;

class AeSimpleMD5 {
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9)) {
buf.append((char) ('0' + halfbyte));
} else {
buf.append((char) ('a' + (halfbyte - 10)));
}
halfbyte = data[i] & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString();
}

public static String MD5(String text)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md;
md = MessageDigest.getInstance("MD5");
byte[] md5hash = new byte[32];
md.update(text.getBytes("iso-8859-1"), 0, text.length());
md5hash = md.digest();
return convertToHex(md5hash);
}
}

class DES {
String R = "";
public static String encrypt(String text) {
return process("e", text);
}
public static String decrypt(String text) {
return process("d", text);
}
public static String process(String mode, String text) {
// Get or create key.
Key key;
try {
try {
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("SecretKey.ser"));
key = (Key) in.readObject();
in.close();
} catch (FileNotFoundException fnfe) {
KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
key = generator.generateKey();
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("SecretKey.ser"));
out.writeObject(key);
out.close();
}

// Get a cipher object.
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

// Encrypt or decrypt the input string.
if (mode.indexOf("e") != -1) {
cipher.init(Cipher.ENCRYPT_MODE, key);
String amalgam = text;

byte[] stringBytes = amalgam.getBytes("UTF8");
byte[] raw = cipher.doFinal(stringBytes);
BASE64Encoder encoder = new BASE64Encoder();

String base64 = encoder.encode(raw);
//System.out.println(base64);
return base64;
} else if (mode.indexOf("d") != -1) {
cipher.init(Cipher.DECRYPT_MODE, key);
BASE64Decoder decoder = new BASE64Decoder();
byte[] raw = decoder.decodeBuffer(text);
byte[] stringBytes = cipher.doFinal(raw);
String result = new String(stringBytes, "UTF8");
//System.out.println(result);
return result;
}
} catch (Exception e) {
//System.out.println("DES Error:" + e);
}
return "Error!";
}
}

class Main {
public static void main(String[] args) throws IOException {
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Input string: ");
String rawString = userInput.readLine();
try {
System.out.println("Hasil MD5 : '" + AeSimpleMD5.MD5(rawString) + "'");
System.out.println("Hasil Encript DES : '" + DES.encrypt(rawString) + "'");
System.out.println("Hasil Decrypt DES : '" + DES.decrypt(rawString) + "'");
System.out.println("Hasil Encript MD5 -> DES : '" + DES.encrypt(AeSimpleMD5.MD5(rawString)) + "'");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}


Selamat...... hari selasa.

17 °C:

mbahsomo said...

Pa kabar om 4gus
kerja dimana sekarang nih
wah artikelnya bagus - bagus
kapan2 ajari aku ya

om4gus said...

iya mbah,
kalo saya mampu

Anonymous said...

Terimah Kasih atas artikelnya,adhe rachmat

Anonymous said...

untuk passswor saya gunakan MD5 dulu nanti hasilnya di enkripsi pake DES itu gimana ? apa bisa

om4gus said...

diatas udah ada perintahnya,
DES.encrypt(AeSimpleMD5.MD5(rawString));

Anonymous said...

Om Agus gua masih bingung nih, saya rencana mau buat video streaming melalui LAN nantinya data video yang saya streamingkan dienkripsi data video tersebut di hash dulu pake MD5 kemudian di DES kan ? ada contohnya gak

om4gus said...

coba deh pelajari vlc aja, www.videolan.org/vlc, sempurna buat video streaming & opensource juga. kalo di java pake jmf, java.sun.com/javase/technologies/desktop/media/jmf/

Anonymous said...

Bagaimana modifikasi code diatas agar nilai dari key tsb konstan / udah kita tentukan, tanpa harus menyimpan key tsb kedalam suatu file?

om4gus said...

@Anonim
DES memang menggunakan algoritma yang diatur agar hanya orang yang mempunya kunci, dalam bentuk file, yang bisa membukanya. Di java tidak ada class untuk melakukan enkripsi berdasarkan string tertentu seperti halnya crypt yang ada di PHP. Jadi harus dibuat sendiri.

Anonymous said...

terus seumpamanya file tersebut kita masukkan di dalam program, gimana om$gus cara memanggil file tersebut secara otomatis?soalnya kalau pakai ObjectInputStream in = new ObjectInputStream(
new FileInputStream("SecretKey.ser")); tidak bisa, saya harus menuliskan letak file tersebut secara manual.

om4gus said...

@Anonim
Nanti akan saya buatkan postingan tentang algoritma DSA, dengan menggunakan GUI swing. Tunggu aja yah

rachmad said...

Mas apa ada materi or source code mengenai penyisipan pesan kedalam suatu media .WAV? klw ada tolong share ke emailq y, Heart_h34rt@yahoo.co.id

om4gus said...

@rachmad
gk ada...

Anonymous said...

mw nanya....
java yg digunakan, java apa??
kata nya pembagian java itu ada bnyak y???
saya blom pernah blajar ttg java tapi pengen tw j.. ;P

om4gus said...

@Anonim
jdk mas, j2sdk, j2se, Java standard edition.


kalo yg buat HP namanya j2me, micro edition. sedangkan kalo yg untuk web namanya j2ee, enterprise edition.

Anonymous said...

mas infonya sangat berguna...mau belajar serius dgn java jadinya...eh dari dasar nanya2 gpp ya mas...kalo boleh private ..mau tuuuh....mas

om4gus said...

@anonim
boleh aja

Post a Comment