java kriptografi

17
MAKALAH JAVA CRYPTOGRAPHIC EXTENSION KEAMANAN DATA M.MISBAKHUL MUNIR 7410040048 3 D4 TI B

Upload: munir-putra

Post on 24-May-2015

854 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Java kriptografi

MAKALAH JAVA CRYPTOGRAPHIC EXTENSION

KEAMANAN DATA

M.MISBAKHUL MUNIR

7410040048

3 D4 TI B

Politeknik Elektronika Negeri Surabaya (PENS)

2013

Page 2: Java kriptografi

JAVA CRYPTOGRAPHIC EXTENSION (JCE)

I. Pendahuluan

API yang pertama adalah JCA (Java Cryptography Architecture), merupakan framework sekuriti yang diintegrasikan bersama inti (core) dari Java API. JCA banyak dikeluhkan menyediakan kriptografi yang kurang 'kuat', dimana panjang kunci kriptografi yang diperbolehkan hanya sampai maksimum 128 atau 256 bit. Sudah barang tentu kunci kriptografi yang tidak 'kuat' atau panjang bit kunci yang pendek maka hacker yang memecahkan kriptografi tersebut (cipher) hanya memerlukan waktu yang tidak terlalu lama. Lokasi JCA terletak pada paket java.security.

API yang kedua adalah JCE (Java Cryptography Extension), merupakan framework sekuriti ekstensi dari Java. Ia menyediakan ekstensi untuk kriptografi yang kuat, diperbolehkan untuk di-ekspor oleh pemerintah US setelah kebijakan mengenai ekspor tahun 2000. JCE mulai diperbolehkan sebagai opsi paket tambahan pada JDK v 1.2.x dan 1.3.x, sedangkan pada JDK v 1.4.x telah diintegrasikan. API JCE diimplementasi oleh Cryptographic Service Providers. Pada JDK v 1.4.x keatas secara default API service-provider nya adalah SunJCE. Dengan JCE maka memberi keleluasaan kepada kita (memprogram java kriptografi) untuk memakai implementasi dari API service-provider yang diinginkan. Lokasi JCE terletak pada paket javax.crypto.

Symmetric dan Asymmetric Cryptography merupakan jenis algoritma kriptografi berdasarkan penggunaan kunci. Singkatnya, kriptografi symmetric menggunakan kunci yang sama untuk melakukan proses enkripsi dan dekripsi sedangkan kriptografi asymmetric menggunakan kunci yang berbeda untuk encrypt dan decrypt. Contoh algoritma symmetric adalah AES, DES, RC4 dll sedangkan asymmetric adalah RSA, Elgamal dll. Gambar dibawah ini merupakan proses enkripsi dan dekripsi algoritma symmetric dan asymmetric.

Symmetric Algorithm Asymmetric Algorithm

Page 3: Java kriptografi

Pada algoritma asymmetric, terdapat dua buah kunci yaitu kunci publik untuk encrypt dan kunci private untuk decrypt. Ketika seseorang (misal Alice) akan mengirimkan pesan ke Bob, maka Alice akan mengenkripsi pesan tersebut menggunakan kunci publik Bob dan Bob akan membuka pesan yang diterimanya menggunakan kunci private. Hal tersebut merupakan kelebihan pada sistem asymmetric karena user cukup menyimpan secara rahasia kunci private miliknya, sedangkan kunci publik dapat disebarkan ke seluruh user yang ingin berkomunikasi dengannya tanpa perlu khawatir orang yang tidak berhak dapat membuka pesan menggunakan kunci publik yang telah disebar tersebut.

Pada sistem symmetric, kunci yang digunakan untuk encrypt dan decrypt adalah sama, sehingga user yang saling berkomunikasi menggunakan sistem symmetric harus saling berkirim kunci yang sama karena jika mereka tidak menggunakan kunci yang sama maka pesan tidak dapat terbuka di sisi penerima. Jika terdapat seseorang yang berada di tengah2 proses kirim terima kunci dan berhasil mendapatkan kunci tersebut maka maka semua pesan dapat terbuka. Berbeda dengan sistem asymmetric, user hanya perlu mengirimkan kunci publik supaya orang lain dapat berkomunikasi dengan dirinya. User tidak perlu takut penyerang dapat merekonstruksi private key dari kunci publik yang didapatkannya.

Kompleksitas pendistribusian kunci  pada symmetric lebih tinggi dibandingkan dengan asymmetric. Setiap satu kunci pada  symmetric digunakan oleh dua user atau satu grup untuk berkomunikasi. Saya ilustrasikan sebagai berikut, ketika user A akan berkomunikasi dengan user B mereka menggunakan kunci X dan ketika user A berkomunikasi dengan user C mereka akan menggunakan kunci Y. Maka ketika user B,C,D akan mengirimkan pesan ke user A, user A akan menggunakan 3 buah kunci yang berbeda untuk membuka pesan yang diterima. Berbeda dengan sistem asymmetric,user B,C,D cukup menggunakan kunci publik A untuk mengirimkan pesan dan A cukup menggunakan kunci private nya untuk membuka pesan tersebut.

Akan tetapi, sistem symmetric lebih cepat dalam komputasi dan ciphertext yang dihasilkan lebih sedikit sehingga tidak membebani bandwith pada saat proses pengiriman pesan. Biasanya symmetric dan asymmetric sering digunakan bersamaan pada suatu sistem. Sebagai contoh pada sistem video conference Agievic, asymmetric digunakan untuk pendistribusian kunci symmetric, kunci symmetric ini digunakan untuk untuk mengenkripsi komunikasi video conference

AES (Advance Encryption Standart)Advanced Encryption Standard (AES) merupakan algoritma kriptografi  simetrik yang dapat digunkan untuk mengamakan data. Algoritma AES adalah blok chipertext simetrik yang dapat mengenkripsi (encipher) dan dekripsi (decipher) informasi. Enkripsi merubah data yang tidak dapat lagi dibaca disebut ciphertext. sebaliknya dekripsi adalah merubah ciphertext data menjadi bentuk semula yang kita kenal sebagai plaintext. Algoritma AES mengunakan kunci kriptografi 128, 192, dan 256 bits untuk mengenkrip dan dekrip data pada blok 128 bits.

DES (Digital Encryption Standart)Secure random key. DES (Data Encryption Standard) adalah algoritma cipher blok yang populer karena dijadikan standard algoritma enkripsi kunci-simetri, meskipun saat ini standard tersebut telah digantikan dengan algoritma yang baru, AES, karena DES sudah dianggap tidak aman lagi. Sebenarnya DES adalah nama standard enkripsi simetri, nama algoritma enkripsinya sendiri adalah DEA (Data Encryption Algorithm), namun nama DES lebih populer daripada DEA. Algoritma DES dikembangkan di IBM dibawah kepemimpinan W.L. Tuchman pada tahun 1972. Algoritma ini didasarkan pada algoritma Lucifer yang dibuat oleh Horst Feistel. Algoritma ini telah disetujui oleh National Bureau of Standard (NBS) setelah penilaian kekuatannya oleh National Security Agency (NSA)

Page 4: Java kriptografi

Amerika Serikat. DES termasuk ke dalam sistem kriptografi simetri dan tergolong jenis cipher blok. DES beroperasi pada ukuran blok 64 bit. DES mengenkripsikan 64 bit plainteks menjadi 64 bit cipherteks dengan menggunakan 56 bit kunci internal (internal key) atau upa-kunci (subkey). Kunci internal dibangkitkan dari kunci eksternal (external key) yang panjangnya 64 bit.

II. Menginstall JCE

Berikut ini adalah cara menginstall JCE ke JDK API kita.

1. Download Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files disini untuk yang menggunakan JDK 7. Jika menggunakan JDK selain itu bisa disesuaikan.

2. Uncompress dan ekstrak file yang didownload tadi. Ini akan membuat subdirektori JCE. Didalam direktori tersebut akan terdapat file sbb:

README.txt COPYRIGHT.html Copyright information local_policy.jar Unlimited strength local policy file US_export_policy.jar Unlimited strength US export policy file

3.Menginstall the unlimited strength policy JAR files.

Standar lokasi untuk JCE jurisdiction policy JAR files adalah:/jre/lib/security [Unix]\jre\lib\security [Win32]Artinya ini tergantung kepada environment Java anda apakah anda menjalankan aplikasi java menggunakan JRE dengan menginstall JDK atau hanya JRE saja tanpa menginstall JDK.Dalam kasus environment Java menginstall dengan JDK, maka mungkin akan seperti berikut/home/user1/jdk1.6.0/jre [Unix]C:\jdk1.6.0\jre [Win32]

Dalam kasus environment Java hanya JRE saja tanpa menginstall JDK, maka mungkin akan seperti berikut

/home/user1/jre1.6.0 [Unix]C:\jre1.6.0 [Win32]

Dalam kasus saya maka lokasi untuk JCE adalah (JRE dengan menginstall JDK)

C:\Program Files\Java\jdk1.7.0_11\jre\lib\security [Win32]

4. Copy local_policy.jar dan US_export_policy.jar ke C:\Program Files\Java\jdk1.7.0_11\jre\lib\security (ini environment Java di laptop saya). Catatan, kemungkinan file tersebut sudah ada di direktori tersebut,

Page 5: Java kriptografi

sehingga anda harus menimpa saja file tersebut dengan yang didownload tadi. Jika lebih amannya maka file yang sudah ada tadi bisa di-rename terlebih dahulu.

5. Restart komputer anda untuk menyingkirkan exception yang terjadi sebelum memasang file jar JCE yang baru tersebut.

III. Progam Kriptografi

a. Program Kriptografi DES

Source Codepackage org.wikijava.crypto; import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom; import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; /** * * @author Giulio */public class CryptoMessage { private Key key; /** * Generates the encryption key. using "des" algorithm * * @throws NoSuchAlgorithmException */

Page 6: Java kriptografi

private void generateKey() throws NoSuchAlgorithmException {KeyGenerator generator;generator = KeyGenerator.getInstance("DES");generator.init(new SecureRandom());key = generator.generateKey();

} private String encrypt(String message) throws IllegalBlockSizeException,

BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException {// Get a cipher object.Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key);

// Gets the raw bytes to encrypt, UTF8 is needed for// having a standard character setbyte[] stringBytes = message.getBytes("UTF8");

// encrypt using the cypherbyte[] raw = cipher.doFinal(stringBytes);

// converts to base64 for easier display.BASE64Encoder encoder = new BASE64Encoder();String base64 = encoder.encode(raw);

return base64;

} private String decrypt(String encrypted) throws InvalidKeyException,

NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, IOException {

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

//decode the BASE64 coded messageBASE64Decoder decoder = new BASE64Decoder();byte[] raw = decoder.decodeBuffer(encrypted);

//decode the messagebyte[] stringBytes = cipher.doFinal(raw);

Page 7: Java kriptografi

//converts the decoded message to a StringString clear = new String(stringBytes, "UTF8");return clear;

} public CryptoMessage(String message) {

try { System.out.println("clear message: " + message);

generateKey();

String encrypted = encrypt(message); System.out.println("encrypted message: " + encrypted);

String decrypted = decrypt(encrypted); System.out.println("decrypted message: " + decrypted);

} catch (NoSuchAlgorithmException e) { e.printStackTrace();} catch (NoSuchPaddingException e) { e.printStackTrace();} catch (InvalidKeyException e) { e.printStackTrace();} catch (UnsupportedEncodingException e) { e.printStackTrace();} catch (IllegalBlockSizeException e) { e.printStackTrace();} catch (BadPaddingException e) { e.printStackTrace();} catch (IOException e) { e.printStackTrace();}

} /** * * @param args */ public static void main(String[] args) {

/* if (args.length == 1) { new CryptoMessage(args[0]);} else {

Page 8: Java kriptografi

System.out.println("usage: "); System.out.println("CryptoMessage [message]");}

*/ new CryptoMessage("misbakhul_munir"); } }

Output

Argument diisi dengan kalimat yang nantinya jika di run, maka terenkripsi. Dan didekripsi lagi.

Page 9: Java kriptografi

b. Program Kriptografi AES

Source Code

package org.wikijava.cryptography.generalExamples; import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; public class CryptographyWithReusedPass {

private static String encrypt(String message, String skey, String ivx)throws UnsupportedEncodingException,

IllegalBlockSizeException, BadPaddingException {

SecretKeySpec keySpec = new SecretKeySpec(skey.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(ivx.getBytes());

Cipher cipher = getCypher(keySpec, ivSpec, Cipher.ENCRYPT_MODE);

// Gets the raw bytes to encrypt, UTF8 is needed for// having a standard character setbyte[] stringBytes;

stringBytes = message.getBytes("UTF8");

// encrypt using the cypherbyte[] raw;//try {

Page 10: Java kriptografi

raw = cipher.doFinal(stringBytes);//} catch (IllegalBlockSizeException e) {// throw new CryptographyException(e);//} catch (BadPaddingException e) {// throw new CryptographyException(e);//}

// converts to base64 for easier display.BASE64Encoder encoder = new BASE64Encoder();String base64 = encoder.encode(raw);

return base64;

}

public static String decrypt(String encrypted, String skey, String ivx) throws IOException {

SecretKeySpec keySpec = new SecretKeySpec(skey.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(ivx.getBytes());

Cipher cipher = getCypher(keySpec, ivSpec, Cipher.DECRYPT_MODE);

// decode the BASE64 coded messageBASE64Decoder decoder = new BASE64Decoder();byte[] raw;//try {

raw = decoder.decodeBuffer(encrypted);//} catch (IOException e) {// throw new CryptographyException("Reading error", e);//}

// decode the messagebyte[] stringBytes = null;try {

stringBytes = cipher.doFinal(raw);} catch (IllegalBlockSizeException e) {// throw new CryptographyException("Encrypted message was

corrupted",// e);} catch (BadPaddingException e) {// throw new CryptographyException("Encrypted message was

corrupted",

Page 11: Java kriptografi

// e);}

// converts the decoded message to a StringString clear;//try {

clear = new String(stringBytes, "UTF8");//} catch (UnsupportedEncodingException e) {

//throw new CryptographyException(e);//}return clear;

}

/** * @param keySpec * @param ivSpec * @param mode * @return * @throws CryptographyException */public static Cipher getCypher(SecretKeySpec keySpec,

IvParameterSpec ivSpec, int mode) {// Get a cipher object.Cipher cipher;try {

cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");} catch (NoSuchAlgorithmException e) {

throw new RuntimeException("invalid algorithm", e);} catch (NoSuchPaddingException e) {

throw new RuntimeException("invalid padding", e);}try {

cipher.init(mode, keySpec, ivSpec);} catch (InvalidKeyException e) {// throw new CryptographyException("invalid key", e);} catch (InvalidAlgorithmParameterException e) {

throw new RuntimeException("invalid algorithm parameter.", e);}return cipher;

}

/** *

Page 12: Java kriptografi

* @param args */public static void main(String[] args) throws UnsupportedEncodingException,

IllegalBlockSizeException, BadPaddingException, IOException {String message="misbakhul_munir";String key="1011199102112008";String ivx="1502199202112008";//if (args.length == 3) {// message = args[0];// key = args[1];// ivx = args[2];//} else {// System.out.println("usage: ");// System.out// .println("CryptographyWithReusedPass [message]

[skey] [ivx]\n key and ivx must have length 16 ");// return;//}

System.out.println("clear message: " + message);

String encrypted;//try {

encrypted = encrypt(message, key, ivx);//} catch (UnsupportedEncodingException e) {// e.printStackTrace();// return;//} catch (CryptographyException e) {// e.printStackTrace();// return;//}System.out.println("encrypted message: " + encrypted);

String decrypted;//try {

decrypted = decrypt(encrypted, key, ivx);//} catch (CryptographyException e) {// e.printStackTrace();// return;//}System.out.println("decrypted message: " + decrypted);

}

Page 13: Java kriptografi

}

Output

Argument harus diisi dengan value1,value2 & value3 (dengan length 16).