Penggunaan Base64 pada Kriptografi


Ketika kita menggunakan atau mendesain kriptografi dalam java kita dihadapkan salah satu problem yaitu key atau kunci. Problem kunci ini termasuk kompleks seperti pertukaran/pengiriman kunci, generator kunci, padding, salt dan lain lain. Salah satu problem yang akan kita coba kupas adalah generator kunci:

Didalam library JCE, dan JCA kita bisa membangkitkan kunci untuk algoritma yang kita gunakan, kunci disini bersifat random namun tidak dideterministik, yang dimaksud tidak deterministik adalah kita tidak dapat membangkitkan kembali kunci dipenerima jadi kunci harus dikirim melalui kanal secure atau hanya yang pihak yang berwenang mengetahui kunci.

Kunci juga bisa kita input secara manual, seperti layaknya password yang kita gunakan. Namun algoritma kriptografi hanya mengenal inputan berupa deretan bit atau byte seperti DES menggunakan panjang bit sebanyak 56 bit atau 8 byte. Oleh sebab itu perlu metode bagaimana algoritma dapat mengenali inputan berupa huruf layaknya password. Namun kali ini kita tidak membahas itu.

Kali ini kita mencoba membahas tentang kunci inputan yang berupa byte dapat diterjemahkan atau dibaca kedalam bentuk huruf-huruf latin, hal ini bermanfaat agar user dapat membaca, mengcopy, menyimpan, ataupun mengingat.Untuk mengatasi hal tersebut salah satu solusinya dalah menggunakan java.util.Base64.Encoder, cara kerja BASE64 di class tersebut menggunakan standart RFC 4648 and RFC 2045

Sebagai contoh kita mempunyai deretan kunci dalam bentuk byte untuk algoritma DES

byte[] keyBytes = new byte[] {(byte) 0x00 , 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

kita akan rubah kedalam bentuk SecretKeySpec agar dapat digunakan pada algoritma DES

SecretKeySpec key64 = new SecretKeySpec(keyBytes, "DES");

setelah itu kita akan mencoba mengkonversikan kedalam BASE64 sebagai berikut:

String encodedKey = Base64.getEncoder().encodeToString(key64.getEncoded());
System.out.println(encodedKey);

maka akan kita akan medapatkan hasil AAECAwQFBgc=, darimana bentuk tersebut? berikut step-step nya

Nilai Byte {0x00 , 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

Nilai byte diatas dikonversikan kedalam bit dan bagi kedalam 24 bit blok, jika diblok bit terakhir tidak sepanjang 24 maka tambakhkan bit 0 sebagai padding
{0000 0000 0000 0001 0000 0010} {0000 0011 0000 0100 0000 0101} {0000 0110 0000 0111 [00000000]}

Kumpulkan setiap bit kedalam blok bit sepanjang 6 bit
000000 000000 000100 000010 000000 110000 010000 000101 000001 100000 011100 000000

dalam decimal: 0 0 4 2 0 48 16 5 1 32 28 (padding)

terjemahkan setiap 6 bit tersebut kedalam seperti tabel berikut:

Value Char Value Char Value Char Value Char
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

jika terdapat 1 blok bit padding maka terjemahan blok tersebut menjadi character “=”, maka hasil yang kita dapatkan seperti berikut AAECAwQFBgc= deretan huruf itu kita bisa gunakan sebagai kunci pada saat dekripsi dengan menggunakan

byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "DES");
Advertisements

Author: ridhobustami

orang ngak jelas

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s