Skip to main content

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.

Comments

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

    ReplyDelete
  2. iya mbah,
    kalo saya mampu

    ReplyDelete
  3. Terimah Kasih atas artikelnya,adhe rachmat

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

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

    ReplyDelete
  6. 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

    ReplyDelete
  7. 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/

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

    ReplyDelete
  9. @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.

    ReplyDelete
  10. 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.

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

    ReplyDelete
  12. 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
  13. 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

    ReplyDelete
  14. @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.

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

    ReplyDelete
  16. 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
  17. @Dawud Tan,

    Sudah 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

    ReplyDelete
  18. wah.. terima kasih banyak Pak @om4gus untuk responnya.. :D

    ReplyDelete

Post a Comment

Popular posts from this blog

Pembuatan PDF di PHP dengan FPDF dan HTML2FPDF

Untuk membuat pdf dengan menggunakan php, kita bisa menggunakan fpdf yang berbasis class. Sedangkan html2fpdf digunakan untuk mengubah html menjadi pdf. Dengan hanya menggunakan fpdf, kita harus menentukan semua hal yang mengatur tampilannya berbasis code sesuai dengan aturan dan fungsi yang disediakan class tersebut. Dengan menggunakan html2fpdf, kita cuma perlu membuat sebuah file html dan tampilannya langsung diubah menjadi sebuah file pdf, tentu dengan beberapa keterbatasan dan perubahan tampilan. Saat ini, fpdf terbaru pada versi 1.6 sedangkan html2fpdf versi 3. Instalasi: + Ekstrak file fpdf dan html2fpdf. Sebenarnya html2fpdf merupakan inheritance dari class fpdf, tapi class di fpdf yang disdertakan di paket html2fpdf telah dimodifikasi dari aslinya sesuai dengan kebutuhan konversi tersebut. Class original dari fpdf akan kita pakai untuk pembuatan pdf secara manual, bukan dari html. + Ganti nama file fpdf.php misalkan menjadi fpdf16.php. Karena untuk bebrapa versi instalasi php

Java-MySql: Aplikasi Database dengan Data Gambar (Updated)

Untuk update metode simpan gambar lihat di appGambar 2.0 Bagaimana caranya menyimpan data yang membutuhkan penyimpanan data gambar? Misalkan data pegawai yang membutuhkan penyimpanan gambar dari setiap pegawai. Alternatifnya ada dua, dengan kelebihan dan kekurangan masing-masing. Cara yang pertama adalah dengan membuat field dengan tipe data binary, kemudian menyimpan gambar yang dibutuhkan dalam field di database tersebut. Cara ini membutuhkan manajemen program yang lebih rumit, tapi data gambar akan terjamin, karena tersimpan didalam database yang terintegrasi dengan data lainnya. Kekurangan lainnya adalah ukuran database yang akan membesar dan lambat. Bayangkan saja, sebuah field membutuhkan gambar dengan format jpeg, 200kB. Apabila ada 200 juta record, maka ukuran field yang diperuntukan khusus untuk gambar dengan perhitungan kasar adalah 0.2 MB x 200M = 40 x 10^12 = 40 TB. Belum ditambah dengan ukuran data dari field lainnya, kalau misalkan untuk menyimpan data penduduk Indonesia.

Java: Pengiriman Parameter antar Frame

Sebenarnya konsep ini berlaku bukan hanya pada frame, tapi bisa dilakukan antar object dari class yang sifatnya umum, karena Java yang sifatnya sudah full OOP. Tapi, karena lebih sering diterapkan dalam pemrograman GUI desktop, khususnya dengan Netbeans, maka dicontohkan dengan class javax.swing.JFrame. Setiap bentuk code java harus dibentuk dalam bentuk class, biar sebagaimanapun sederhananya. Tidak seperti pemrograman lainnya yang menggunakan konsep OOP sebagai tambahan dan pengembangan dari yang sudah ada sebelumnya. Itulah sebabnya kita mengenal class di C++, Pascal, PHP, tapi masih diperbolehkan untuk tetap menggunakan konsep primitif. Sedangkan pada kasus java dan .NET, OOP merupakan inti utamanya yang harus selalu diikuti dan diterapkan. Awalnya akan sangat membingungkan, tapi sangat mudah untuk langkah pengembangan selanjutnya. Sudah lihat JavaDoc? itu adalah dokumen pemrograman yang paling aneh didunia, pada pandangan pertama. Coba bandingkan dengan MSDN-nya .NET, PHP Manual,