Aku teruskan lagi tentang penjelasan program TulisRahasia.java, yang aku perlihatkan kembali seperti di bawah ini :
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import sun.misc.*;

public class TulisRahasia
{
                public static void main(String[] args) throws Exception
                {
                                byte[] kunciByte = new byte[] { 0x17, 0x02, 0x07,
                                                                                               0x23, 0x02, 0x09,
                                                                                                0x50, 0x31, 0x11,
                                                                                                0x01, 0x05, 0x13,
                                                                                                0x11, 0x03, 0x33,
                                                                                                0x25, 0x14, 0x18,
                                                                                                0x06, 0x12, 0x41,
                                                                                                0x01, 0x09, 0x22 };
                                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                                String pesan = null;
                                System.out.print("Pesan: ");
                                pesan = reader.readLine();
                                SecretKeySpec kunci = new SecretKeySpec(kunciByte, "AES");
                                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                                cipher.init(Cipher.ENCRYPT_MODE, kunci);
                                byte[] bytePesan = pesan.getBytes("UTF8");
                                byte[] outputCipherTeks = cipher.doFinal(bytePesan);
                                BASE64Encoder kode = new BASE64Encoder();
                                String base64OutputCipherTeks = kode.encode(outputCipherTeks);
                                System.out.println("Output cipherteks: " + base64OutputCipherTeks);
                }
}
Hal yang aku ingin jelaskan adalah program ini menggunakan cipher simetris (algoritma AES) yang memakai kunci yang sama baik untuk enkripsi dan deskripsi. Kunci ini dibuat dari array variabel bertipe byte yang dinamai kunciByte. Saudara lihat inisialisasi array variabel tersebut yang ada di dalam kurung kurawal ({0x17, 0x02, ... }). Saudara hitung jumlah bilangan itu ada 24 berarti kalau aku
byte[] kunciByte = new byte[] { 0x17, 0x02, 0x07,
                                                 0x23, 0x02, 0x09,
                                                 0x50, 0x31, 0x11,
                                                 0x01, 0x05, 0x13,
                                                 0x11, 0x03, 0x33,
                                                 0x25, 0x14, 0x18,
                                                 0x06, 0x12, 0x41,
                                                 0x01, 0x09, 0x22 };
bisa hitung 24 x 8 = 192. Apa maksudnya? AES (Advanced Encryption Standard) mempunyai ukuran kunci 128 bit, 192 bit dan 256 bit, untuk saudara ketahui program TulisRahasia.java menggunakan kunci 192 bit dari array variabel kunciByte. Jadi tipe data array variabel adalah byte yang berarti 1 byte = 8 bit sehingga aku bisa hitung 24 x 8 bit = 192 bit, ukuran ini yang aku pilih untuk program meskipun saudara bisa pilih yang 128 bit atau yang paling besar 256 bit. Untuk yang belum mengkopi file Unlimited Strength Jurisdiction Policy Files yang bernama local_policy.jar dan US_export_policy.jar seperti yang dijelaskan pada posting blog sebelum ini maka kunci yang hanya bisa dipakai adalah ukuran paling kecil yaitu 128 bit. Bila saudara tidak melakukan dan hanya menginginkan setingan default dari JCA/JCE maka untuk menjalankan program TulisRahasia.java, saudara harus edit array variabel kunciByte. Aku hitung lagi karena hanya 128 bit yang dibutuhkan maka 128 bit : 8 bit = 16 bilangan yang dibutuhkan untuk inisialisasi array variabel kunciByte. Maka saudara harus buang  8  buah bilangan dari inisialisasi array variabel kunciByte, terserah bilangan yang mana saudara hapus. Aku contohkan bilangan yang aku buang mulai dari atas yaitu : 0x17, 0x02, 0x07, 0x23, 0x02, 0x09, 0x50, 0x31 sehingga variabel kunciByte menjadi tampak seperti ini :
byte[] kunciByte = new byte[] { 0x11, 0x01, 0x05, 0x13,
                                                 0x11, 0x03, 0x33, 0x25,
 0x14, 0x18,0x06, 0x12,
 0x41, 0x01, 0x09, 0x22 };
Coba kompilasi ulang dan uji lagi program tersebut. Dengan makin kecilnya ukuran kunci maka kesempatan para penjahat digital (attacker) makin besar untuk mendeskripsi pesan didalam cipherteks karena itu ukuran kunci adalah hal yang penting, maka usahakan memakai ukuran kunci yang paling besar yang disediakan. Untuk AES ukuran kunci yang paling besar adalah 256 bit sehingga apabila program TulisRahasia.java diperbesar ukuran kuncinya maka untuk bilangan variabel kunciByte ditambah 8 buah bilangan lagi menjadi 32 buah bilangan. Aku mengisi variabel array kunciByte dengan bilangan acak dengan memakai notasi heksadeimal walaupun notasi desimal pun boleh asal saudara harus hati-hati menulisnya karena variabel array itu bertipe byte maka kalau ditulis dengan notasi heksadesimal maka tidak boleh melebihi angka 0x7F atau kalau desimal adalah 127. Mengapa demikian sebabnya adalah tipe datanya adalah byte dengan jangkauan -128 s/d 127, jadi 0x7F = 127 itulah sebabnya walaupun itu bisa disiasati dengan memakai casting misal melebihi 0x7F maka bisa ditulis seperti ini : (byte)0x88. Nanti kompiler yang akan melakukan konversi seperlunya karena semua bilangan tadi akan diproses menjadi bilangan biner.


2 komentar to "Kriptograpi Java (Seri...)"

Posting Komentar

[ Form Komentar Klasik ]