1.
Judul
“IMPLEMENTASI ALGORITMA BLOWFISH DENGAN KUNCI SIMETRIK UNTUK ENKRIPSI DAN
DEKRIPSI FILE”
2.
Abstraksi
Proposal ini berisi
pembahasan algoritma kunci simetri dengan cipher blok, Blowfish. Blowfish
merupakan salah satu algoritma yang dibuat oleh Bruce Schneier pada tahun 1993
sebagai salah satu alternatif untuk algoritma enkripsi. Blowfish termasuk
kedalam cipher blok yang masih dianggap aman karena belum ditemukan attack yang
benar-benar dapat mematahkannya. Pada Proposal ini juga akan dibahas mengenai implementasi
algoritma Blowfish pada sebuah aplikasi yang akan melakukan enkripsi dan
dekripsi pada teks.
Aplikasi tersebut
diharapkan dapat menerapkan algoritma Blowfish secara optimal, oleh karena itu
akan dibahas mengenai karakteristik algoritma Blowfish yang dapat membuat
algoritma ini berjalan secara optimal. Dengan adanya implementasi itu pula,
diharapkan dapat menjadi contoh penggunaan algoritma Blowfish untuk proses
enkripsi yang sesungguhnya. Aplikasi yang
akan dibuat merupakan aplikasi
sederhana yang hanya dapat melakukan enkripsi pada file teks, namun hal
tersebut dianggap cukup untuk memberi contoh penggunaan algoritma Blowfish
dalam proses enkripsi.
Kata Kunci : Algoritma Kunci Simetrik, Blowfish, Enkripsi, Dekripsi
3.
Latar Belakang
Kriptografi telah menjadi bagian penting
dalam dunia teknologi informasi saat ini. Hampir semua penerapan teknologi
informasi menggunakan kriptografi sebagai alat untuk menjamin keamanan dan
kerahasiaan informasi. Karena itu pulalah, kriptografi menjadi ilmu yang berkembang
pesat. Dalam waktu singkat, amat banyak bermunculan algoritma-algoritma baru
yang dianggap lebih unggul daripada pendahulunya. Namun, tetap saja cipher yang
digunakan tidak lepas dari penemuan lama. Algoritma kunci simetri termasuk
algoritma yang masih sering digunakan dalam pembuatan algoritma kriptografi.
Pada saat ini, algoritma enkripsi kunci simetri yang banyak digunakan adalah
algoritma blok, yang beroperasi pada suatu potongan pesan (blok) yang berukuran
sama (biasanya 64 bit) pada suatu saat.
Selain algoritma blok, ada juga
algoritma aliran yang beroperasi pada potongan data yang bervariasi.
Dibandingkan dengan cipher aliran, baik dalam desain dan penerapan, cipher blok
dianggap lebih rumit.
Pada saat Blowfish dirancang, diharapkan
mempunyai kriteria perancangan sebagai berikut :
a. Cepat,
Blowfish melakukan enkripsi data pada
microprocessors 32-bit. dengan rate 26 clock cycles per byte.
b. Compact,
Blowfish dapat dijalankan pada memori kurang dari 5K.
c. Sederhana,
Blowfish hanya menggunakan operasi-operasi Sederhana, Blowfish hanya menggunakan
operasi-operasi sederhana: penambahan, XOR, dan lookup tabel pada operan
32-bit.
d. Memiliki
tingkat keamanan yang bervariasi, panjang kunci yang digunakan oleh Blowfish
dapat bervariasi dan bisa sampai sepanjang 448 bit [2].
Proposal ini bertujuan dapat mempelajari
algoritma Blowfish secara keseluruhan agar dapat memahami cara kerja dan
struktur algoritmanya, kemudian menerapkan strategi perancangan Blowfish
sehingga algoritma ini dapat berjalan secara optimal. Atau paling tidak dapat
melakukan enkripsi dengan baik pada aplikasi yang akan dibuat.
Aplikasi yang akan dibuat diharapkan
dapat menggambarkan penggunaan algoritma Blowfish pada proses enkripsi teks
sehingga lebih mudah memahami cara kerja dan struktur algoritma Blowfish.
4.
Perumusan Masalah
Permasalahan utama berdasarkan latar belakang adalah :
1.
Bagaimana pengaplikasian enkripsi dan dekripsi algoritma Blowfish
2. Bagaimana
perangkat lunak mengenkripsi dan dekripsi file / folder.
5.
Tujuan
Adapun tujuan berdasarkan rumusan
masalah di atas adalah :
- Mengetahui enkripsi dan dekripsi algoritma Blowfish
- Perangkat lunak mampu mengenkripsi dan dekripsi file / folder.
6.
Batasan Masalah
Pada penyelesaian
proyek ini, permasalahan dibatasi hanya untuk enkripsi dan dekripsi file /
folder.
7.
Tinjauan Pustaka
Teknik pengamanan data menggunakan
enkripsi dan dekripsi dikenal dengan nama kriptografi, sebagai sebuah ilmu atau
seni untuk mengamankan pesan atau data dengan cara menyamarkan pesan tersebut
sehingga hanya dapat dibaca oleh pengirim dan penerima pesan. Penerapan
kriptografi pada komputer dapat menyamarkan pesan yang berupa file teks,
gambar, suara, gambar bergerak dan lain-lain.
Secara global teknik enkripsi dan
dekripsi data terdiri dari dua metoda, yaitu metoda kunci publik dan metoda
kunci simetri. Metoda kunci simetri menggunakan password atau kata kunci yang
sama untuk melakukan enkripsi dan juga dekripsi. Karena itu metoda ini sering
juga disebut dengan metoda secret key Criptography. Contoh-contoh metoda ini
adalah: DES (Data Encryption Standard), IDEA (International Data Encryption
Algoritm), RC5, Blowfish, dan FEAL. Cara kerja metoda enkripsi ini terlihat
seperti gambar 1.
Gambar 1.
Kriptografi kunci simetris
Masalah utama bagi metoda pengamanan
data dengan kunci simetris adalah bagaimana mengirimkan kunci simetris tersebut
dari pengirim kepada penerima. Tentunya akan metoda pengamanan ini tak akan
berguna bila kunci sampai jatuh ke tangan orang yang tidak berhak. Untuk itu
dikembangkan metoda kunci asimetris yang dikenal juga kunci publik. Metoda
kunci publik ini pertama kali ditemukan oleh Whitfield Diffie dan Martin
Hellman, serta Ralph Merkle secara independent. RSA, El Gamal, dan Rabin adalah contoh-contoh
kriptografi kunci simetris. Metoda ini menggunakan kunci yang berbeda untuk
enkripsi dan dekripsi. Melalui metoda yang ada maka kunci enkripsi dapat
dipublikasikan pada pengirim tanpa khawatir jatuh ke tangan orang yang tidak
berhak, karena hanya dapat digunakan untuk mengenkripsi dan tidak bisa
digunakan untuk mengdekripsi. Kunci untuk mengenkripsi tersebut kemudian
dikenal dengan nama kunci publik sedangkan kunci untuk mendekripsi dikenal
dengan nama kunci privat. Cara kerjanya dapat dilihat pada gambar 2, K1 adalah
kunci publik sedangkan K2 adalah kunci privat.
Gambar
2. Kriptografi kunci asimetris
Algoritma-algoritma dalam proses
enkripsi dan dekripsi sebenarnya terbagi menjadi dua macam, yaitu yang bersifat
stream cipher dan block cipher. Stream cipher
mengenkripsi plaintext atau
mendekripsi ciphertext secara bit per
bit, yaitu satu bit dienkripsi atau didekripsi per satuan waktu. Sedangkan
algoritma tipe block cipher mengenkripsi plaintext dan mendekripsi ciphertext
secara blok per blok (blok adalah kumpulan bit), yaitu satu blok dienkripsi
atau didekripsi per satuan waktu. Tentu saja proses enkripsi dan dekripsi
menggunakan metoda block cipher memiliki kecepatan yang lebih baik dibandingkan
metoda stream cipher [1].
7.1 Algoritma
Kunci
Algoritma sandi berdasarkan kesamaan
kunci dibagi menjadi dua, yaitu kunci asimetris dan kunci simetris. Pada sistem
kunci-asimentris digunakan sepasang kunci yang berbeda, umumnya disebut kunci
public (public key) dan kunci pribadi (private key), digunakan untuk proses enkripsi
dan proses dekripsinya. Jadi kunci untuk membuat pesan yang disandikan berbeda dengan kunci untuk
membuka pesan yang disandikan itu. Beberapa contoh
algoritma yang menggunakan kunci-asimetris : Knapsack, RSA
(Rivert-Shamir-Adelman), Diffie-Hellman.
Sedangkan pada skema kunci-simetris,
digunakan sebuah kunci rahasia yang sama untuk melakukan proses enkripsi dan
dekripsinya. Algoritma sandi kunci simetris adalah jenis kriptografi yang paling umum
dipergunakan. Kunci untuk membuat
pesan yang disandikan
sama dengan kunci untuk membuka pesan yang disandikan itu. Siapapun yang
memiliki kunci tersebut, dapat membuat
dan membongkar rahasia ciphertext. Problem yang paling jelas disini terkadang bukanlah
masalah pengiriman ciphertext-nya,
melainkan masalah bagaimana menyampaikan kunci simetris tersebut kepada pihak
yang diinginkan. Beberapa contoh
algoritma yang menggunakan kunci-simetris : DES (Data Encryption Standard), Blowfish, Twofish, MARS, IDES, 3DES -
DES diaplikasikan 3 kali, AES (Advanced
Encryption Standard).
Gambar 3. Kriptografi kunci
simetris
Sebuah
skema algoritma sandi
akan disebut kunci-simetris apabila
untuk setiap proses enkripsi
maupun dekripsi data secara
keseluruhan digunakan kunci yang
sama. Skema ini berdasarkan jumlah data per proses dan alur pengolahan data
didalamnya dibedakan menjadi dua kelas, yaitu stream-cipher dan block-cipher.
Stream-cipher merupakan sebuah algoritma
sandi yang mengenkripsi data persatuan
data, seperti bit,
byte, nible atau per lima bit (saat data yang di enkripsi berupa data Boudout). Setiap
mengenkripsi satu satuan
data di gunakan kunci yang
merupakan hasil pembangkitan dari kunci
sebelum. Block-cipher adalah skema
algoritma sandi yang akan membagi-bagi
teks terang yang akan dikirimkan dengan
ukuran tertentu (disebut blok) dengan panjang t, dan setiap blok dienkripsi
dengan menggunakan kunci yang sama.
Semenjak pertama kali ditemukan, telah
banyak penemuan-penemuan baru dalam penerapan
cipher blok. Salah satunya adalah
algoritma Blowfish yang dirancang oleh Bruce Schneier pada tahun 1993. Sejak
saat itu, telah dilakukan berbagai macam
analisis, dan perlahan-lahan mulai mendapat
penerimaan sebagai algoritma
enkripsi yang kuat [2].
Algoritma Kunci Simetrik
Algoritma kunci simetrik adalah
algoritma kriptografi yang memiliki kunci yang sama untuk proses enkripsi dan
dekripsinya. Kunci tersebut merupakan satu-satunya jalan untuk proses dekripsi
(kecuali mencoba membobol algoritma tersebut), sehingga kerahasiaan kunci menjadi
nomor satu. Untuk mengirimkan kunci tersebut ke suatu pihak tanpa diketahui
pihak yang lain merupakan masalah awal dari algoritma kunci simetrik. Algoritma
kunci simetrik terbagi menjadi dua buah bergantung pada datanya. Keduanya
adalah: cipher aliran (stream cipher) dan cipher blok (block cipher). Cipher
aliran memproses satu bit pesan sekali
dalam satu waktu, sedangkan cipher blok memproses sekumpulan bit sekaligus
sebagai satu unit. Ukuran blok yang umu dipakai adalah 64 bit.
Algoritma kunci simetrik terbagi menjadi
dua buah bergantung pada datanya. Keduanya adalah: cipher aliran (stream
cipher) dan
cipher
blok (block cipher) [3].
Deskripsi
cipher blok
Cipher blok merupakan salah satu
pendekatan dalam algoritma kriptografi kunci simetrik. Pendekatan lain adalah
cipher aliran. Perbedaan mendasar keduanya adalah jika cipher blok memproses
dalam suatu kumpulan bit sekaligus sebagai suatu unit dan cipher aliran
memproses bit per bit. Panjang blok yang biasa diimplementasikan oleh perancang
algoritma kriptografi adalah kelipatan 64 bit. Pada awal tahun 1990-an, panjang
blok yang paling umum adalah 64 bit. Masayrakat merasa dengan panjang kunci 64
bit telah cukup aman dan tidak mungkin ada komputer yang mampu menyerang dengan
metode brute force. Namun dengan berlalunya waktu, ternyata mungkin untuk
menyerang algoritma dengan kunci 64 bit menggunakan metode brute force. Oleh
karena itu panjang blok umum berkembang menjadi 128 bit pada awal 2000-an, atau
bahkan akhir-akhir ini [3].
7.2 Algoritma
Blowfish
Blowfish atau yang disebut juga “OpenPGP.Cipher.4″ adalah algoritma
kunci simetrik cipher
blok yang dirancang pada
tahun 1993 oleh Bruce Schneider untuk menggantikan DES (Data Encryption Standard). Algoritma Blowfish dibuat untuk
digunakan pada komputer yang mempunyai
microposesor besar (32-bit keatas dengan cache data yang besar).
Pada saat itu banyak sekali rancangan
algoritma yang ditawarkan, namun hampir
semua terhalang oleh paten atau kerahasiaan pemerintah Amerika. Schneier
menyatakan bahwa blowfish bebas paten dan akan berada pada domain publik. Dengan pernyataan Schneier
tersebut blowfish telah mendapatkan tempat
di dunia kriptografi, khususnya
bagi masyarakat yang membutuhkan algoritma kriptografi yang cepat, kuat, dan tidak terhalang oleh lisensi.
Blowfish dirancang dan diharapkan
mempunyai kriteria perancangan yang diiginkan sebagai berikut :
a. Cepat, Blowfish melakukan enkripsi data pada
microprocessor 32-bit dengan rate 26 clock cycles per byte.
b. Compact,Blowfish
dapat dijalankan pada memory kurang dari 5K.
c. Sederhana,
Blowfish hanya menggunakan operasi – operasi operasi sederhana, seperti : penambahan, XOR, dan
lookup tabel pada operan32-bit.
d. Memiliki
tingkat keamanan yang bervariasi, panjang kunci yang digunakan oleh Blowfish
dapat bervariasi dan bisa sampai sepanjang minimal 32-bit, maksimal 448 -bit,
Multiple 8 bit, default 128 bit [2].
7.2.1 Struktur
Algoritma Blowfish
Blowfish merupakan blok cipher 64-bit
dengan panjang kunci variabel. Algoritma
ini terdiri dari dua bagian: key expansion atau perluasan kunci dan enkripsi
data.
7.2.1.1 Key-Expansion
Berfungsi merubah kunci (Minimum 32-bit,
Maksimum 448-bit) menjadi beberapa array subkunci (subkey) dengan total 4168
byte.
7.2.1.2 Enkripsi
Data
Terdiri
dari iterasi fungsi
sederhana (Feistel Network) sebanyak 16
kali putaran. Setiap
putaran terdiri dari permutasi
kunci-dependent dan substitusi kunci- dan data-dependent. Semua operasi adalah
penambahan (addition) dan XOR pada variabel 32-bit. Operasi tambahan lainnya
hanyalah empat penelusuran tabel (table lookup) array berindeks untuk setiap
putaran.
Untuk alur algoritma enkripsi dengan
metoda Blowfish dijelaskan sebagai berikut :
1. Bentuk
inisial array P sebanyak 18 buah (P1,P2,…………..P1 masing-msing bernilai 32-bit.
Array P terdiri
dari delapan belas
kunci 32-bit subkunci :
P1,P2,…….,P18
2. Bentuk
S-box sebanyak 4 buah masing-masing bernilai 32-bit yang
memiliki masukan 256.
Empat
32-bit S-box masing-masing mempunyai 256 entri:
S1,0,S1,1,………………..,S1,255
S2,0,S2,1,………………..,S2,255
S3,0,S3,1,………………..,S3,255
S4,0,S4,1,………………..,S4,255
3. Plainteks
yang akan dienkripsi diasumsikan sebagai masukan, Plainteks tersebut diambil
sebanyak 64-bit, dan apabila
kurang dari 64-bit
maka kita tambahkan bitnya,
supaya dalam operasi nanti sesuai dengan datanya.
4. Hasil
pengambilan tadi dibagi
2, 32-bit pertama disebut XL,
32-bit yang kedua disebut XR.
5. Selanjutnya
lakukan operasi
XL = XL xor Pi dan XR = F(XL) xor XR
6. Hasil
dari operrasi diatas ditukar XL menjadi XR dan XR menjadi XL.
7. Lakukan
sebanyak 16 kali, perulangan yang ke-16
lakukan lagi proses penukaran XL dan XR.
8. Pada
proses ke-17 lakukan operasi untuk
XR = XR xor P17 dan XL = XL xor P18.
9. Proses terakhir
satukan kembali XL
dan XR sehingga menjadi 64-bit
kembali.
Blowfish
menggunakan jaringan Feistel
yang terdiri dari 16 buah
putaran. Skema jaringan Feistel dapat dilihat di gambar 4.
Gambar 4. Jaringan Feistel
untuk Algoritma Blowfish
Algoritma Blowfish memiliki keunikan
dalam hal proses dekripsi, yaitu proses dekripsi dilakukan dengan urutan yang
sama persis dengan proses enkripsi, hanya saja pada proses dekripsi P1, P2, …,
P18 digunakan dalam urutan yang terbalik.
Dalam
algoritma Blowfish juga
terdapat fungsi f. Berikut ini gambar mengenai fungsi f
tersebut.
Gambar 5. Fungsi f dalam
algoritma Blowfish
Sebelumnya dijelaskan
bahwa Array P
terdiri dari delapan belas
subkunci. Subkunci dihitung menggunakan algoritma Blowfish, metodenya adalah
sebagai berikut :
1. Pertama-tama
inilialisasi P-array dan kemudian empat S-box secara berurutan dengan string
yang tetap. String ini terdiri atas digit hexadesimal dari Pi.
2. XOR
P1 dengan 32-bit pertama kunci, XOR P2 dengan 32-bit kedua dari kunci dan
seterusnya untuk setiap bit dari kunci (sampai P18). Ulangi terhadap bit kunci
sampai seluruh P-array di XOR dengan bit kunci.
3. Enkrip
semua string nol dengan algoritma Blowfish dengan menggunakan subkunci seperti
dijelaskan pada langkah (1) dan (2).
4. Ganti
P1 dan P2 dengan keluaran dari langkah (3).
5. Enkrip
keluaran dari langkah (3) dengan algoritma Blowfish dengan subkunci yang sudah
dimodifikasi.
6. Ganti
P3 dan P4 dengan keluaran dari langkah (5).
7. Lanjutkan
proses tersebut, ganti seluruh elemen dari P-array, kemudian seluruh keempat
S-box berurutan, dengan keluaran yang berubah secara kontiyu dari algoritma
Blowfish.
Secara keseluruhan terdapat 521 iterasi atau putaran yang dibutuhkan untuk membangkitkan
seluruh upa-kunci yang dibutuhkan.
Aplikasi kemudian dapat
menyimpan upa-kunci yang telah
dihasilkan. Proses pembangkitan kunci ini tidak perlu selalu
dilakukan setiap saat [2].
7.2.2 Keamanan
Algoritma Blowfish
Sampai
saat ini algoritma
Blowfish belum ditemukan kelemahan yang berarti hanya
adanya weak key dimana dua entri dari S-box mempunyai nilai yang sama. Belum ada cara untuk
mengecek weak key sebelum melakukan key expansion, tetapi
hal ini tidak berpengaruh terhadap hasil enkripsi.
Hasil
enkripsi dengan algoritma
Blowfish sangat tidak mungkin dan
tidak praktis untuk
di terjemahkan tanpa bantuan kunci. Sampai kini belum ada
Cryptoanalyst yang dapat membongkar pesan
tanpa kunci yang
dienkripsi dengan memakai bantuan algoritma Blowfish. Agar aman dari
pembongkaran pesan maka dalam algoritmanya harus menggunakan 16 putaran agar
pesan tersebut tidak dapat dibongkar.
Algoritma Blowfish
pun dapat digabungkan
dengan algoritma-algoritma enkripsi yang lain dalam pengkripsian sebuah
pesan untuk lebih menjamin isi dari pesan tersebut. Sehingga algoritma
Blowfish cukup aman
jika ingin digunakan untuk
mengenkripsi data yang
ingin di amankan [1].
7.2.3 Penggunaan
Algoritma Blowfish
Blowfish adalah salah satu algoritma
cipher blok yang tercepat dan digunakan secara luas di dunia, kecuali ketika
pergantian kunci. Setiap
kunci baru memerlukan pemrosesan awal
yang sebanding dengan mengenkripsikan teks
denga ukuran sekitar
4 kilobyte.
Pemrosesan awal ini sangat lambat dibandingkan dengan algoritma cipher
blok lainnya. Hal
ini menyebabkan Blowfish tidak
mungkin digunakan dalam
beberapa aplikasi, tetapi tidak menimbulkan masalah dalam banyak
aplikasi lainnya.Pemrosesan awal
yang lama pada Blowfish digunakan
sebagai ide untuk
metode password-hashing yang digunakan pada OpenBSD. Metode
password-hashing ini menggunakan algoritma
yang diuturnnkan dari algoritma Blowfish yang
menggunakan penjadwalan kunci
yang lambat. Algoritma ini
digunakan dengan pertimbangan bahwa usaha komputasi ekstra
yang harus dilakukan dapat memberikan
proteksi lebih terhadap
serangan terhadap password
berbasiskan kamus (dictionary attacks).
Dalam
beberapa implementasi, Blowfish
memerlukan memori yang relatif besar, yaitu sekitar 4 kilobyte. Hal ini
tidak menjadi masalah
bahkan untuk komputer desktop dan laptop yang sudah berumur tua. Tetapi hal ini
juga membuat implementasi Blowfish pada embedded system terkecil (seperti
pada smartcard pada
awal kemunculannya) tidak mungkin untuk dilakukan [2].
Enkripsi
Blowfish
Blowfish membutuhkan 64 bit blok-blok
plaintext sebagai masukannya dan menghasilkan 64 bit chipertext. Ukuran kunci
untuk Blowfish dapat dipilih dalam range 32 bit sampai 448 bit yang mana semakin
besar ukurannya maka semakin kuat keamanannya. Blok masukan dipecah dalam paro
L0 dan R0 dimana tiap-tiap paro tersebut mengandung 32 bit. Blowfish dapat
secara sederhananya digambarkan dengan algoritma berikut [4]:
j = 1
loop from j to 16
Rj = Lj-1 XoR Pj
Lj = F (Rj) XoR Rj-1
end loop
L17 = R16 XoR P18
R17 = L16 XoR P17
Dekripsi
Blowfish
Dekripsi untuk Blowfish bersifat maju
kedepan. Ironisnya, dekripsi bekerja dalam arah algoritma yang sama seperti
halnya dengan enkripsi, namun sebagai masukannya dalah chipertext. Walaupun
begitu, seperti yang diharapkan, sub-kunci yang digunakan dalam urutan
terbalik. Sehingga algoritma dekripsi Blowfish sebagai berikut [4]:
j = 1
loop from j to 16
Rj = Lj-1 XoR P19-j
Lj = F (Rj) XoR Rj-1
end loop
L17 = R16 XoR P1
R17 = L16 XoR P2
8.
Daftar Pustaka
[1] Tjiharjadi, Semuil., Chandra Wijaya, Marvin.
“Pengamanan Data Menggunakan Metoda Enkripsi Simetri Dengan Algoritma Feal”. SNATI
20, 1-2:1907-5022. 2009.
[2] Alim Sutanto, Candra. “Penggunaan Algoritma
Blowfish Dalam Kriptografi”, <http://webmail.informatika.org/~rinaldi/Matdis/2009-2010/Makalah0910/MakalahStrukdis0910-070.pdf>.
Diakses 11 November 2010.
[3] Octamanullah, Mohamad. “Perbandingan
Algoritma Kriptografi Kunci Simetrik BlowFish dan TwoFish”
[4] Riza Putra, Muhammad. “studi dan implementasi
the blowfish encryption algorithm dalam bahasa pemrograman c++”. <http://www.informatika.org/~rinaldi/Matdis/2006-2007/Makalah/Makalah0607-30.pdf>
Diakses 9 November 2010
boleh ijin copy ya pak :), terimakasih ya
ReplyDeletecara cakaran matematik untuk enkripsi SMS dengan algoritma blowfish
ReplyDeleteCara mencari s-boxnya bagaimana ya??
ReplyDeleteMaksud dari no.3 yang enkrip string 0 itu maksudnya gimana ya?? Terima kasih
ReplyDeletesaya boleh minta source codenya gak? untuk tugas kuliah saya terimakasih
ReplyDelete