Enkripsi di PHP dengan phpseclib

Assalamu’alaikum, Wr. Wb.

Bismillahirrohmanirrohim.

Hello gaes, kali ini saya mau share tentang enkripsi di PHP menggunakan library phpseclib. phpseclib merupakan library untuk enkripsi dan hash yang di buat dengan “php murni”. Kelebihan library ini dari library yang lain, menurut saya adalah kompatibilitasnya dengan php versi lawas (4+) dan kelengkapan metode enkripsi serta hash nya.

AES

Metode enkripsi

Untuk metode yang saya gunain kali ini adalah AES. Kenapa sih memakai metode AES? Untuk lebih lanjut bisa lihat pada referensi berikut:

Kembali ke blog, sebelum bicara lebih lanjut tentang bagaimana enkripsi data berupa “plain text” , saya ingin mengajak dulu untuk mengenal enkripsi dan apa bedanya dengan hashing. Menurut wikipedia, enkripsi (dalam kriptografi) adalah proses mengubah informasi ke dalam bentuk tertentu sehingga hanya sekelompok orang tertentu saja yang dapat mengaksesnya/mengartikannya. Sedangkan hashing, menurut blog ini adalah (proses) transformasi aritmatik sebuah string dari karakter menjadi nilai yang merepresentasikan string aslinya. Lalu apa bedanya? gampangnya hasil sebuah enkripsi dapat balik lagi ke informasi aslinya, sedangkan hasil dari hashing tidak bisa kembali lagi ke dalam bentuk aslinya.

Kegunaannya pun berbeda, jika enkripsi biasanya digunakan untuk pertukaran data, sehingga data / informasi yang ditukar bisa dibaca kembali. Sedangkan hash biasanya digunakan untuk “menyimpan” data sensitif seperti password dan juga untuk validasi sebuah informasi (misalnya jika download sowftware/aplikasi online, biasanya disertakan juga text hash/md5 nya).

Enkripsi AES

AES merupakan kependekan dari Advanced Encryption Standard merupakan spesifikasi standar enkripsi untuk elektronik yang “dicanangkan” oleh U.S NIST (National Institute of Standard and Technology) pada tahun 2001. Singkatnya AES ini memanfaat prinsip permutasi dan subtitusi yang cepat pada sisi software maupun hardware. saya juga belum tahu secara detail maksudnya gimana, intinya metode ini dikenal lebih cepat dari pendahulunya dan dapat mengenkripsi data yang “sangat besar”.

Oke langsung saja menjurus ke bagian perkodingan. Untuk melakukan enkripsi AES, seperti judul yang saya buat, saya akan memakai library phpseclib. Pertama unduh dulu library-nya di sini. Atau jika memiliki composer yang sudah terinstall, dapat menggunakan perintah berikut:

composer require phpseclib/phpseclib

Penggunaan Composer

Bedanya jika mendownload secara langsung dengan composer adalah jika download secara langsung (melalui web), maka biasanya yang diunduh adalah versi 1.0.8. Sedangkan jika menggunakan composer, maka yang diunduh adalah versi 2.0. Yang perlu diingat adalah kedua versi tersebut memiliki style koding yang berbeda. Jika versi 1.^ menggunakan include script yang dibutuhkan lalu inisialisasi kelas yang terdapat pada script yang di-include-kan tersebut. Sedangkan jika menggunakan komposer, maka hanya diperlukan include script autoload.php kemudian menggunakan namepsace dalam pemanggilan kelas. Lainnya adalah adanya perbedaan dalam inisialisasi kelas, namun saya rasa akan mudah dimengerti nantinya.

Untuk contoh kodingannya dapat dilihat langsung dari sumber berikut, saya kopas & edit dikit ke sini:

<?php
use phpseclib\Crypt\AES;
use phpseclib\Crypt\Random;

$cipher = new AES(); // could use CRYPT_AES_MODE_CBC
// keys are null-padded to the closest valid size
// longer than the longest key and it's truncated
//$cipher->setKeyLength(128);
$cipher->setKey('abcdefghijklmnop');
// the IV defaults to all-NULLs if not explicitly defined

$iv =Random::string($cipher->getBlockLength() >> 3);
//$iv = base64_encode($iv);
$cipher->setIV($iv);

$size = 10 * 1024;
$plaintext = str_repeat('a', $size);

echo $cipher->decrypt($cipher->encrypt($plaintext));
?>

Mari kita jelajahi bagian demi bagian kodingan tersebut. Pertama untuk baris berikut:

<?php

include 'vendor/autoload.php';
use phpseclib\Crypt\AES;
use phpseclib\Crypt\Random;

Baris pertama di atas adalah cara untuk melakukan include script autoload composer. Secara otomatis, semua kelas kelas yang dipanggil dalam namespace akan ter-load tanpa harus melakukan pemanggilan include / require script-script yang mengandung kelas yang dibutuhkan. Untuk lebih jelas tentang pneggunaan composer dapat dilihat di sini. Pada script di atas dapat dilihat bahwa kelas yang digunakan adalah kelas AES dan kelas Random.

$cipher = new AES(); // could use CRYPT_AES_MODE_CBC

Penggunaan key dan iv

Untuk selanjutnya dilakukan inisialisasi kelas AES ke dalam variabel $cipher. Kelas ini memiliki dua method penting, yaitu encyrpt untuk melakukan enkripsi data dan decrypt untuk melakukan dekripsi data yang sudah terenkripsi. Sebelum memanggil method untuk enkripsi maupun decrypt, perlu dilakukan inisialisasi key dan iv. 

$cipher->setKey('abcdefghijklmnop');
// the IV defaults to all-NULLs if not explicitly defined

$iv =Random::string($cipher->getBlockLength() >> 3)
//$iv = base64_encode($iv);
$cipher->setIV($iv);

Secara garis besar key merupakan “kunci” untuk melakukan enkripsi yang rahasia dan hanya boleh diketahui oleh pihak yang memiliki autorisasi, sedangkan iv merupakan kependekan dari initialization vector, yaitu angka ataupun huruf sembarang (random) yang digunakan bebarengan dengan key sehingga hasil enkripsi semakin sulit ditebak. Key bersifat statis dan sangat rahasia, sedangkan iv bersifat dinamis(random) dan harus berbeda untuk setiap enkripsi. Untuk melakukan dekripsi data, nilai iv haruslah sama dengan nilai iv yang digunakan untuk melakukan enkripsi data. Pada kasus di atas, iv yang dihasilkan akan menghasilkan byte sequence. Agar string bisa dikirim melalui jaringan ataupun agar lebih mudah disimpan ke database yang meggunakan tipe VARCHAR/TEXT/CHAR, alangkah baiknya karakter tersebut di – encode terlebih dahulu, sehingga dari awalnya berbentuk urutan byte seperti di bawah ini:

��#3mg�? i�#�Ԁ���O�q

Menjadi karakter ASCII yang dapat dengan mudah dikirim melalui jaringan (network) maupun disimpan ke database seperti kurang lebih sebagai berikut:

EFjTatx2VkAZR3ScS0UadQr8M6zEkIz==

Karakter encoding

Caranya cukup mudah, yaitu dengan memanggil fungsi base64_encode(). Fungsi tersebut akan mengubah karakter-karakter “aneh” atau byte sequence tersebut ke dalam bentuk ASCII yang dengan mudah “dikenali”. Perlu diketahui bahwa base64_encode() akan menambah panjang string sebanyak kurang lebih 33% dari panjang string asli. Untuk lebih jauh tentang encoding base64, dapat dilihat di link ini.

$size = 10 * 1024;
$plaintext = str_repeat('a', $size);

Kode di atas berguna untuk membentuk string sepanjang kurang lebih 10Kb. Isi stringnya seperti diketahui akan berisi huruf ‘a’ semua.

echo $cipher->decrypt($cipher->encrypt($plaintext));

Bagian terakhir dari kode di atas adalah fungsi dekripsi yang inputannya hasil enkripsi dari teks asli. Hasil akhirnya tentunya adalah teks asli seperti sebelum dienkripsi. Proses enkripsi akan menghasilkan byte sequence, sangat disarankan agar dirubah dulu ke base64 (dengan fungsi base64_encode) agar bisa dikirim melalui jaringan (network) maupun disimpan ke dalam database. Sedangkan fungsi dekripsi membutuhkan parameter berupa byte sequence, sehingga jika input berupa string berbasis ASCII atau memiliki encode yang lain, harus dirubah dulu dengan fungsi base64_decode(). Lalu kenapa enkripsi menghasilkan byte sequence dan dekripsi membutuhkan byte sequence? Alasannya adalah supaya agar informasi / data tersebut tidak bisa di debug dengan mudah.

Sekian dulu sharing dari saya, kurang lebihnya mohon maaf.

Alhamdulillah.

Wassalamu’alaikum Wr. Wb.

2 komentar untuk “Enkripsi di PHP dengan phpseclib”

Tinggalkan Balasan