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 mainansurat 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.
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
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.
Pa kabar om 4gus
ReplyDeletekerja dimana sekarang nih
wah artikelnya bagus - bagus
kapan2 ajari aku ya
iya mbah,
ReplyDeletekalo saya mampu
Terimah Kasih atas artikelnya,adhe rachmat
ReplyDeleteuntuk passswor saya gunakan MD5 dulu nanti hasilnya di enkripsi pake DES itu gimana ? apa bisa
ReplyDeletediatas udah ada perintahnya,
ReplyDeleteDES.encrypt(AeSimpleMD5.MD5(rawString));
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
ReplyDeletecoba 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/
ReplyDeleteBagaimana modifikasi code diatas agar nilai dari key tsb konstan / udah kita tentukan, tanpa harus menyimpan key tsb kedalam suatu file?
ReplyDelete@Anonim
ReplyDeleteDES 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.
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(
ReplyDeletenew FileInputStream("SecretKey.ser")); tidak bisa, saya harus menuliskan letak file tersebut secara manual.
@Anonim
ReplyDeleteNanti akan saya buatkan postingan tentang algoritma DSA, dengan menggunakan GUI swing. Tunggu aja yah
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
ReplyDelete@rachmad
ReplyDeletegk ada...
mw nanya....
ReplyDeletejava yg digunakan, java apa??
kata nya pembagian java itu ada bnyak y???
saya blom pernah blajar ttg java tapi pengen tw j.. ;P
@Anonim
ReplyDeletejdk mas, j2sdk, j2se, Java standard edition.
kalo yg buat HP namanya j2me, micro edition. sedangkan kalo yg untuk web namanya j2ee, enterprise edition.
mas infonya sangat berguna...mau belajar serius dgn java jadinya...eh dari dasar nanya2 gpp ya mas...kalo boleh private ..mau tuuuh....mas
ReplyDelete@anonim
ReplyDeleteboleh aja
Ingin tanya mas, saya menemukan tulisannya dengan kata kunci PKCS5Padding, 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
ReplyDelete@Dawud Tan,
ReplyDeleteSudah banyak implementasi 3DES jadi kalau memang cuma mau melakukan implementasi, tidak perlu membuat ulang enkripsi.
untuk AS2 saya belum pernah coba, jadi mungkin perlu baca sendiri daripada saya salah,
https://github.com/abhishek-ram/pyas2
http://pyas2.readthedocs.io/en/latest/
https://github.com/robertjchristian/as2
https://github.com/phax/as2-lib
wah.. terima kasih banyak Pak @om4gus untuk responnya.. :D
ReplyDelete