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.



Saya mulai mempelajari bahasa pemrograman Java kira-kira tahun 1999 dan sampai sekarang tetap terus belajar. Bahasa pemrograman Java menurutku sederhana dan mudah dipelajari dibandingkan dengan bahasa program C++. Dalam blog ini aku ingin berbagi ilmu dengan pengunjung blog tentang apapun mengenai program Java semisal cryptography dan threading. Dan posting sekarang aku ingin menceritakan tentang pengalaman instalasi Bouncy Castle Provider yang tidak berjalan mulus. Untuk pengunjung yang belum tahu Bouncy Castle Provider itu apa? (makhluk apa itu ;-) Akan aku ceritakan sedikit tentang cryptography di bahasa program Java (diasumsikan pembaca lancar dan fasih program Java dan sedikit banyak tahu tentang cryptography). Cryptography (atau kalau boleh aku tulis kriptograpi dan untuk seterusnya) adalah seni dan ilmu tentang menjaga kerahasian pesan atau tulisan. Dalam Java fasilitas untuk kriptograpi disediakan oleh kelas-kelas API JCA/JCE (apa lagi itu? Aku tidak menjelaskan panjang lebar karena pengunjung bisa cari tahu di situs lain hehehe...). Nah untuk lebih memahami kriptograpi di Java akan saya buatkan program sederhana dengan nama  file TulisRahasia.java sebagai berikut :
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);
                }
}
      Apabila saudara ingin mencoba cara program ini bekerja, salin kode program diatas dan tempel (paste) ke program editor teks kesukaan anda. Penulis memakai program editor teks TextPad karena sederhana dan cepat. Coba kompilasi apa ada kesalahan dan perbaiki bila ada. Bila saat kompilasi muncul peringatan seperti dibawah ini :
C:\Bahasa\Java\Crypto\bab1\TulisRahasia.java:33: warning: sun.misc.BASE64Encoder is Sun proprietary API and may be removed in a future release
                                BASE64Encoder kode = new BASE64Encoder();
                                ^
C:\Bahasa\Java\Crypto\bab1\TulisRahasia.java:33: warning: sun.misc.BASE64Encoder is Sun proprietary API and may be removed in a future release
                                BASE64Encoder kode = new BASE64Encoder();
                                                         ^
2 warnings

Tool completed successfully
Abaikan peringatan tersebut dan kode program berhasil dikompilasi. Setelah berhasil dikompilasi sekarang saudara coba jalankan. Aku asumsikan bahwa saudara lancar pemrogaman bahasa Java dan untuk diketahui aku menggunakan Java Development Kit versi 6u23 pada saat penulisan blog ini. Tampilan program seperti dibawah ini :
C:\Bahasa\Java\Crypto\bab1>java TulisRahasia
Pesan: Aku suka kriptograpi Java!
Output cipherteks: pCkh78KlGZg39wLBjP60wUojvXb5aWVOncrZFwUg/l0=

C:\Bahasa\Java\Crypto\bab1>
Program mengkodekan pesan “Aku suka kriptographi Java!” menjadi cipherteks “pCkh78KlGZg39wLBjP60wUojvXb5aWVOncrZFwUg/l0=”. Tetapi apabila saudara melihat hal yang lain seperti ini :
C:\Bahasa\Java\Crypto\bab1>java TulisRahasia
Pesan: Aku suka kriptograpi Java!
Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters
        at javax.crypto.Cipher.a(DashoA13*..)
        at javax.crypto.Cipher.a(DashoA13*..)
        at javax.crypto.Cipher.a(DashoA13*..)
        at javax.crypto.Cipher.init(DashoA13*..)
        at javax.crypto.Cipher.init(DashoA13*..)
        at TulisRahasia.main(TulisRahasia.java:29)

C:\Bahasa\Java\Crypto\bab1>
berarti instalasi JDK saudara menggunakan Jurisdiction Policy Files default yang membatasi ukuran kunci hanya 128 bit (kecuali untuk cipher simetris Triple-DES) dan pembuatan kunci RSA sampai hanya 2048 bit. Untuk mengatasi hal tersebut saudara perlu mengunduh Jurisdiction Policy Files yang tanpa pembatasan dengan nama file jce-policy-6.zip yang bisa dicari pada halaman yang sama ketika saudara mengunduh JDK. Yang aku tahu adalah link dengan tulisan seperti “Unlimited Strength Jurisdiction Policy Files”. Setelah saudara peroleh file itu, unziplah (ada 4 file didalamnya, yang berguna cuma 2 file yang bertipe jar) kemudian salin file local_policy.jar dan US_export_policy.jar ke folder instalasi JDK saudara, biasanya adalah C:\Program Files\Java. Umumya ada dua folder didalam C:\Program Files\Java yang satu adalah JRE dan yang lainnya JDK. Yang pertama salin kedua file jar tadi ke C:\Program Files\Java\jdk1.6.0_xx\jre\lib\security. Apabila ada peringatan bahwa file sudah ada dengan nama sama, abaikan saja peringatan tersebut dan klik saja tombol copy and replace. Yang kedua salin kedua file jar tadi ke C:\Program Files\Java\jre6\lib\security. Apabila ada peringatan bahwa file sudah ada dengan nama sama, abaikan saja peringatan tersebut dan klik saja tombol copy and replace. Yang dimaksud jdk1.6.0_xx pada C:\Program Files\Java\jdk1.6.0_xx\jre\lib\security adalah xx merupakan nomer versi JDK, misal karena aku memakai JDK6u23 maka path tersebut adalah seperti ini C:\Program Files\Java\jdk1.6.0_23\jre\lib\security.  Nah apabila tugas diatas dikerjakan dengan sempurna maka cobalah jalankan kembali program TulisRahasia. Sekian dulu lain hari aku sambung mengenai penjelasan program dan instalasi provider BouncyCastle...
     


Masih dalam tahap awal...Mohon sabar!