Artikel ini merupakan kelanjutan dari artikel sebelumnya yang masih membahas enkripsi PHP: Enkripsi Sederhana Menggunakan PHP.

Pada artikel sebelumnya, dijelaskan bahwa teknik kriptografi sederhana dapat dilakukan dengan cara subtitusi karakter. Selanjutnya, kami mencoba mengembangkan metode kriptografi menggunakan manipulasi basis bilangan. Garis besar algoritma tersebut adalah:

  • Sebuah input akan dibaca 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 dan diterjemahkan oleh semua orang. Mereka hanya perlu mencari tentang apa itu kode ASCII dan akan dengan mudah membaca pesan kita. Namun akan berbeda jika kita beri sedikit rumus. Rumus yang kami maksud adalah konversi basis suatu bilangan, dan fungsi tersebut sudah ada pada PHP dengan nama base_convert().

Contoh berikut akan memperlihatkan cara mengubah bilangan ASCII yang berbasis 10 (desimal) menjadi bilangan berbasis 9. Kami 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."]";
  
 ...
?>
Luaran kami 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 Sobat menambahkan variasi subtitusi, maka ubah kembali nilai karakter yang disubtitusikan. Berikut sintaks berdasarkan metode subtitusi yang kami gunakan di atas.

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

Jika Sobat 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.

<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;
  }
 }
?>

Pada skrip tersebut telah disertakan fungsi rekursi untuk membaca nilai yang ada di dalam kurung siku. Jika Sobat ingin mengetahui lebih lanjut apa itu rekursi, silakan cek halaman ini.

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

Jika Sobat kesulitan mengikuti langkah-langkah tersebut, kami telah menyediakan skrip siap pakai yang dapat diunduh di sini atau melalui tautan sekunder: mirror 1.

Pada percobaan 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 artikel sebelumnya, program ini membutuhkan memori 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]

Artikel ini telah mengalami penyesuaian dari versi terdahulu yang dipublikasikan pada blog Belajar Web dengan judul PHP Enkripsi Tingkat Lanjut.

Enkripsi Basis Bilangan Menggunakan PHP
Tagged on:                         

Leave a Reply

Your email address will not be published. Required fields are marked *