Belajar Web

Belajar Web: April 2012

Archive for April 2012

PHP Enkripsi Tingkat Lanjut

Posted by Gora Santika


Sumber Gambar : 3.bp.blogspot.com

Sore-sore bosen hambar, dari pada bengong, bikin posting lagi ajah..

Artikel ini bisa dibilang kelanjutan dari artikel sebelumnya yang masih membahas enkripsi PHP: Membuat Enkripsi Sederhana Menggunakan PHP. Hanya saja yang sebelumnya masih ditemukan beberapa bug dan kekurangan, dan sekarang saya coba untuk membenahinya.

Berikut adalah algoritma enkripsi yang dikembangkan oleh Santika Studio - Indonesia. Hampir sama dengan algoritma pada project sebelumnya, hanya saja dalam mensubtitusi kita bubuhkan sedikit variasi. Prinsipnya kurang lebih kayak gini:

  • Sebuah input kita baca per karakter.
  • Ubah karakter menjadi nilai ASCII.
  • Beri variasi menggunakan sedikit rumus.
  • Bubuhkan sedikit subtitusi (optional).
  • Voila, tercipta enkripsi versi kita sendiri.

Meski terlihat rumit, namun sebenarnya cukup sederhana. Tidak percaya? Mari kita buktikan.


Saatnya beraksi...

Kali ini kita memiliki 2 pokok bahasan, pertama adalah membuat Enkripsi dan yang kedua adalah membuat Dekripsi.


Membuat Enkripsi

Pertama-tama, kita buat perulangan (looping) yang akan membaca setiap karakter dari input. Hal yang perlu diingat adalah input kita berupa teks / string yang berarti merupakan kumpulan karakter, dengan kata lain Array Of Char. Hal tersebut memungkinkan kita untuk memanggil array string tersebut menggunakan indeks yang akan menghasilkan karakter / huruf tertentu.

<?php
// hitung panjang input
$length=strlen($input);

// start looping
for($i=0;$i<$length;$i++)
 {
  // tampung huruf
  $temp=$input[$i];
  
  // ubah menjadi ASCII
  $temp=ord($temp);
 }
?>

Sekarang kita telah mendapat nilai ASCII dari tiap huruf. Tunggu sebentar, kenapa nama variabelnya $temp?? Tentu saja karena proses enkripsi masih belum berhenti di sini.

Jika hanya menggunakan kode ASCII, tentu akan mudah dibaca orang. Sudah tentu kita bisa mencari di mbah gugel tentang apa itu kode ASCII dan akan dengan mudah membaca pesan kita. Namun akan berbeda jika kita beri sedikit rumus. Buat ente yang kagak suka ngitung pakek rumus, tenang aja. Rumus disini yang saya maksud adalah konversi basis suatu bilangan, dan fungsi tersebut sudah ada pada PHP dengan nama base_convert().

Contoh berikut akan diperlihatkan cara mengubah bilangan ASCII yang berbasis 10 (desimal) menjadi bilangan berbasis 9. Saya pilih basis 9 karena basis ini jarang digunakan, sehingga orang butuh berfikir 2 kali untuk mengetahui basis yang kita gunakan. Tambahkan kode berikut di dalam perulangan setelah diubah menjadi kode ASCII.

<?php
 ...

  // ubah desimal -> basis 9
  $temp=base_convert($temp,10,9)
  
  // format output
  $out="[".$temp."]";
  
 ...
?>
Output saya format sedemikian sehingga dapat kembali didekripsikan bila diperlukan.

Langkah terakhir dalam pembuatan enkripsi ini adalah membubuhkan beberapa karakter alphabet (A-Z) agar hasil enkripsi kita sulit dibaca basisnya. Hal ini juga dapat mempercantik tampilan output yang akan menjadi alpha numerik. Namun langkah ini adalah optional, artinya dapat dilakukan dapat juga tidak. Subtitusi dilakukan di luar perulangan. Berikut contohnya:

<php
...
  
// variasi subtitusi
$key = array(
    '1' => 'A',
    '6' => 'Z',
    '8' => 'K'
);
$out = str_replace(array_keys($key), $key, $out);

?>

Satu lagi catatan yang perlu diingat adalah pemilihan angka subtitusi. Dalam mensubtitusikan angka perlu diperhatikan basis yang sedang digunakan. Pada contoh ini, karena kita menggunakan basis 9, maka angka maksimal yang digunakan adalah 8. Demikian jika kita menggunakan basis 5, maka angka maksimal yang digunakan adalah 4. Hal tersebut dikarenakan dalam pembacaan bilangan, angka 0 termasuk dalam hitungan. Sehingga dalam basis 9 yang kita gunakan, terdapat sembilan buah angka: 0,1,2,3,4,5,6,7, dan 8.

Untuk Enkripsi berhenti sampai di sini. Hasil / output dari teks yang telah ter-enkripsi tersimpan dalam variabel $out


Membuat Dekripsi

Dalam pembuatan dekripsi, kita tinggal membalik langkah dari pembuatan enkripsi.

Jika anda menambahkan variasi subtitusi, maka ubah kembali nilai karakter yang disubtitusikan. Berikut sintaks berdasarkan metode subtitusi yang saya gunakan di atas.

<php
// kembalikan subtitusi
$key = array(
    '1' => 'A',
    '6' => 'Z',
    '8' => 'K'
);
$temp = str_replace($key, array_keys($key), $input);
?>

Jika anda tidak mensubtitusi pada saat enkripsi, maka langkah ini dapat ditinggalkan.

Setelah kita dapatkan nilai asli (sebelum subtitusi), saatnya mengubah basis nilai tersebut kembali menjadi desimal. Namun bagaimana dengan kurung siku yang ada? Tidak usah khawatir, justru mereka akan mempermudah kerja kita. Kurung siku tersebut memisahkan nilai dari tiap-tiap huruf yang ada. Jika tidak menggunakan kurung siku / pembatas lain, maka nilai dari huruf dapat tercampur dan dapat terjadi kesalahan dalam dekripsi.

Dalam penguraian angka dengan kurung siku, prinsipnya adalah kita membaca per huruf dari depan. Jika menemukan karakter kurung siku buka "[" maka program mencatat nilai terus ke akhir kalimat sampai menemukan karakter kurung siku tutup "]". Jika karakter "]" ditemukan, maka program berhenti mencatat dan mencari karakter buka "[" lainnya untuk mencatat nilai huruf selanjutnya.

Njelasinnya gimana yah :s intinya sih gitu. Langsung ane kasih skripnya deh, moga-moga bisa dipahami.

<php
...

// FUNGSI UNTUK MENCATAT NILAI
function getval($text,$start){
 $start++;
 if($text[$start]!=']'){
  $val=$text[$start].getval($text,$start);
  return $val;
 }
}

// jika menggunakan subtitusi saat
// enkripsi, maka gunakan panjang
// $temp yang telah di ubah dalam
// format asli sebelum disubtitusi
// -
// namun jika saat enkripsi tidak
// disertai subtitusi, maka gunakan
// panjang dari $input
$length = strlen($temp);

// start looping
for($i=0;$i<$length;$i++)
 {
  // jika menemukan kurung siku buka
  if($temp[$i]=='['){
  
   // catat nilai
   $temp=getval($temp,$i);
   
   // ubah basis 9 -> desimal
   $temp = base_convert($temp,9,10);
   
   // baca ASCII
   $temp = chr($temp);
   
   // tampung output
   $out = $out.$temp;
  }
 }
?>

Nah, di skrip tersebut udah ane buatin fungsi untuk mencatat nilai dalam tanda kurung. Kali ini kagak ane jelasin cara kerja tuh fungsi, abis males njelasin rekursif,, bisa-bisa keluar dari bab enkripsi ntar :P

Kalo penasaran apa itu rekursi, cek halaman ini

Seperti halnya pada saat enkripsi, hasil dari pen-dekripsi-an telah tertampung dalam variabel $out.

Kalo misalnya bingung, ane ada file zip, tinggal donlot dan pakek. cekibrot

Pada project kali ini, fungsi base_convert(), chr(), dan ord() memiliki peran utama. Fungsi tersebut akan mengubah teks normal menjadi teks ter-enkripsi maupun sebaliknya sesuai dengan rumus yang kita tentukan.

Kelebihan:
  • Memiliki tingkat pengamanan berlapis.
    • Tingkat 1: pemilihan basis
    • Tingkat 2: kombinasi basis
    • Tingkat 3: subtitusi akhir
  • Tingkat kesalahan penerjemahan relatif kecil.
  • Metode yang kompleks menambah poin keamanan.
Kekurangan:
  • Jika dibanding metode subtitusi pada posting sebelumnya, program ini membutuhkan memory lebih besar, tergantung dari panjang kalimat yang diinputkan. Semakin panjang input, semakin lama dan besar waktu serta memory untuk menjalankan program dikarenakan harus membaca tiap huruf pada input satu per satu.

Hasil dari percobaan di atas adalah: » seperti ini «



[Semoga Bermanfaat]