Tulisan yang menarik tentang “PHP mcrypt extension”

Picture of Aank Saputra

Aank Saputra

[DIA] Sebuah kesempurnaan tanpa tercipta dari hasil perbaikan yang terus menerus dan berkesinambungan yang berujung pada batasan waktu dan ruang. Dan [Kopi] merupakan salah satu aspek yang berpengaruh dalam menulis profil ini. Salam

Apa itu Mcrypt?

Mcrypt merupakan suatu paket dari kumpulan program enkripsi data. Dalam beberapa penjelasan dikutip mengenai mcrypt yaitu :

“MCrypt is intended to be a replacement of the old unix crypt under the GNU General Public License. Unix Crypt was a popular file encryption program in unix boxes.”[1] “MCrypt is a replacement for the old crypt package and crypt command, with extensions. It allows developers to use a wide range of encryption functions, without making drastic changes to their code.”[2]

Mcrypt mendukung berbagai macam algoritma enkripsi dan mode operasi yang dapat diimplementasikan untuk membuat suatu program enkripsi dan dekripsi data sesuai dengan kebutuhan kita.

Requirement Mcrypt

Beberapa persyaratan yang harus ada agar dapat menggunakan Mcrypt yaitu :

  1. Webserver yang sudah terinstalasi dengan PHP 4.x atau PHP 5.x
  2. Modul Mcrypt, baik yang sudah dikompile dalam PHP atau sebagai modul yang terpisah (dalam hal ini memerlukan libmcrypt)

Apa itu Libmcrypt?

Libmcrypt merupakan suatu library dalam PHP yang mengimplementasikan dan menyediakan mekanisme standar untuk mengakses semua algoritma dan mode operasi yang terdapat dalam mcrypt. Tidak seperti library enkripsi lainnya, library mcrypt hanya menyediakan fungsi bagaimana untuk mengakses/menggunakan algoritma enkripsi (encryption algorithm) dan mode operasi yang terdapat dalam mcrypt. Tetapi didalam PHP sendiri selain mcrypt, terdapat tambahan fungsi kriptografi lainnya seperti cracklib (untuk menguji kekuatan suatu password), mhash (untuk menghasilkan/mengimlementasikan Cryptographic Checksums, Message Digest, Message Authentication Code/MAC) dan OpenSSL sehingga dalam pembuatan suatu program enkripsi/dekripsi kita dapat menggunakan semua fungsi tambahan tersebut sesuai dengan kebutuhan.Sebagai penegasan, Library mcrypt menunjang penggunaan algoritma yang memang lazimnya digunakan untuk enkrpsi dan dekripsi data. Hal itu dikarenakan algoritma yang terdapat dalam mcrypt merupakan algoritma dua arah (two way algorithm) atau yang memiliki invers sehingga dapat dilakukan proses dekripsi. Sedangkan mhash sesuai dengan fungsinya dalam menghasilkan Cryptographic Checksums, Message Digest, Message Authentication Code/MAC menunjang algoritma fungsi hash (hash function) yang sifatnya satu arah (one way), dimana tidak memiliki invers/tidak bisa dilakukan proses kebalikannya. Dalam Applied Cryptography dikutip definisi dari fungsi satu arah (one way function) yaitu :

“One-Way Functions are relatively easy to compute, but significantly harder to reverse. That is, given x it is easy to compute F(x), but given F(x) it is hard to compute x.”

Sedangkan fungsi hash merupakan suatu fungsi untuk menghasilkan suatu output dengan panjang yang tetap (fixed lenght) dari berbagai macam panjang input yang berbeda. Oleh karena itu biasanya algoritma fungsi hash seperti MD5, SHA, RIPE-MD, HAVAL, SNEFRU, dan lain sebagainya dalam PHP digunakan untuk enkripsi data yang disimpan dalam database seperti password, nomor kartu kredit atau data yang dianggap penting lainnya/rahasia. Dimana metodenya hanya dengan mencocokan/membandingkan nilai output dari hasil perhitungan input menggunakan algoritma fungsi hash dengan suatu nilai yang ada dalam database yang merupakan hasil perhitungan nilai yang sama dengan input menggunakan algoritma fungsi hash yang sama. Implementasinya biasanya dalam hal otentikasi.

Mengapa menggunakan Mcrypt?

Mcrypt mendukung berbagai macam algoritma enkripsi yang sifatnya dua arah (two way) baik berupa algoritma block cipher maupun algoritma stream cipher dan berbagai mode operasi. Algoritma yang didukung library mcrypt yaitu :

  1. Algoritma Block Cipher, Blowfish, Cast (128 dan 256 bit), DES, Gost, IDEA, RC2, RC6, Loki97, Mars, Rijndael (128, 192, 256 bit), Crypt, Safer64, Safer 128, Saferplus, Serpent,Twofish, TripleDes, XTEA.
  2. Algoritma Stream Ciphers, Arcfour, Wake dan Enigma.
  • Detil mengenai masing-masing algoritma di atas tidak dijelaskan di sini karena merupakan suatu pembahasan sendiri.
  • ECB biasanya lebih cocok digunakan untuk enkripsi data berukuran kecil seperti nomor kredit card, sosial security number, dan lain sebagainya.
  • CBC biasanya lebih cocok digunakan untuk enkripsi data berukuran besar seperti file.
  • CFB biasanya lebih cocok digunakan untuk enkripsi data berukuran sangat kecil, dimana memerlukan enkripsi per bit, seperti enkripsi dengan mode stream.

Fungsi – Fungsi dalam Library Mcrypt [3] disertai dengan penjelasan tambahan :

1. Fungsi untuk memilih algoritma;

  • MCRYPT_3DES
  • MCRYPT_ARCFOUR
  • MCRYPT_BLOWFISH
  • MCRYPT_CAST_128
  • MCRYPT_CAST_256
  • MCRYPT_DES
  • MCRYPT_ENIGMA
  • MCRYPT_GOST
  • MCRYPT_IDEA
  • MCRYPT_LOKI_97
  • MCRYPT_MARS
  • MCRYPT_RIJNDAEL_128
  • MCRYPT_RIJNDAEL_192
  • MCRYPT_RINJDAEL_256
  • MCRYPT_RC2
  • MCRYPT_RC6
  • MCRYPT_SAFERPLUS
  • MCRYPT_SERPENT
  • MCRYPT_TWOFISH
  • MCRYPT_WAKE
  • MCRYPT_XTEA

2. Fungsi untuk memilih mode operasi

  • MCRYPT_MODE_ECB
  • MCRYPT_MODE_CTR
  • MCRYPT_MODE_CBC
  • MCRYPT_MODE_CFB
  • MCRYPT_MODE_NCFB
  • MCRYPT_MODE_OFB
  • MCRYPT_MODE_NOFB
  • MCRYPT_MODE_STREAM

3. Fungsi untuk melakukan enkripsi/dekripsi

  • mcrypt_encrypt – Untuk melakukan fungsi enkripsi teks terang (plaintext) dengan parameter
  • mcrypt_decrypt – Untuk melakukan fungsi dekripsi teks sandi (ciphertext) dengan parameter
  • mcrypt_generic – Untuk enkripsi data
  • mdecrypt_generic – Untuk dekripsi data

4. Fungsi lainnya

  • mcrypt_list_algorithms – Untuk mendapatkan daftar algoritma yang didukung dalam library mcrypt
  • mcrypt_list_modes – Untuk mendapatkan daftar mode operasi yang didukung dalam library mcrypt
  • mcrypt_module_open – Untuk membuka modul algoritma dan mode operasi yang digunakan
  • mcrypt_module_close – Untuk menutup modul mcrypt
  • mcrypt_create_iv -Untuk membuat initialization vector (IV) dari suatu random
  • mcrypt_get_iv_size – Untuk mengembalikan ukuran IV sesuai dengan mode operasi dan algoritma
  • mcrypt_get_key_size – Untuk mendapatkan ukuran kunci dari suatu teks sandi
  • mcrypt_get_block_size – Untuk mendapatkan ukuran blok dari suatu teks sandi
  • mcrypt_get_cipher_name – Untuk mendapatkan nama dari suatu teks sandi
  • mcrypt_module_get_algo_block_size – Untuk mengembalikan/menghasilkan ukuran blok dari suatu algoritma
  • mcrypt_module_get_algo_key_size – Untuk mengembalikan/menghasilkan ukuran kunci maksimum yang sesuai dengan mode operasi
  • mcrypt_module_get_supported_key_sizes – Untuk mengembalikan suatu ukuran kunci dari algoritma yang digunakan
  • mcrypt_enc_get_algorithms_name – Untuk mengembalikan nama dari algoritma yang digunakan
  • mcrypt_enc_get_block_size – Untuk mengembalikan ukuran blok dari algoritma yang digunakan
  • mcrypt_enc_get_iv_size – Untuk mengembalikan ukuran suatu IV dari algoritma yang digunakan
  • mcrypt_enc_get_key_size – Untuk mengembalikan suatu nilai maksimum suatu ukuran kunci dari mode operasi yang digunakan
  • mcrypt_enc_get_modes_name – Untuk mengembalikan nama dari mode operasi yang digunakan
  • mcrypt_enc_get_supported_key_sizes – Untuk mengembalikan suatu ukuran kunci dari algoritma yang digunakan
  • mcrypt_enc_is_block_algorithm_mode – Untuk mengecek jika mode operasi yang digunakan berbentuk blok
  • mcrypt_enc_is_block_algorithm – Untuk mengecek jika suatu algoritma yang digunakan merupakan algoritma blok
  • mcrypt_enc_is_block_mode – Untuk mengecek jika suatu mode operasi dalam bentuk blok
  • mcrypt_enc_self_test – Untuk menjalankan self test pada modul yang digunakan
  • mcrypt_generic_deinit – Untuk mengakhiri insialisasi modul enkripsi
  • mcrypt_generic_end – Untuk mengakhiri proses enkripsi
  • mcrypt_generic_init – Untuk menginisialisasi semua buffer yang diperlukan dalam proses enkripsi
  • mcrypt_module_is_block_algorithm_mode – Untuk mengembalikan suatu nilai jika suatu modul merupakan algoritma blok atau tidak
  • mcrypt_module_is_block_algorithm – Untuk mengecek jika suatu algoritma merupakan algoritma blok
  • mcrypt_module_is_block_mode – Untuk mengembalikan suatu nilai jika suatu output berbentuk blok atau tidak
  • mcrypt_module_self_test – Untuk menjalankan self test pada modul khusus

Contoh Program Enkripsi dan Dekripsi

Dibawah ini merupakan contoh sederhana program enkripsi/dekripsi untuk mengaplikasikan beberapa algoritma yang ada dalam mcrypt. Dalam hal ini PHP yang digunakan yaitu PHP versi 5.2.6. 1. Halaman Enkripsi

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Halaman Enkripsi</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p>Test Enkripsi Menggunakan Library Mcypt</p>
<form name="form1" method="post" action="enkripsi.php">
  <table width="100%" border="0" cellspacing="2" cellpadding="2">
    <tr>
    <td>Algoritma</td>
    <td>
        <select name="select">
<?
		$algorithms = mcrypt_list_algorithms();
    	foreach ($algorithms as $cipher) {
        	echo "<option value=".$cipher.">$cipher"."</option>";
    	}
?>
        </select>
      </td>
  </tr>
  <tr>
    <td>Mode Operasi</td>
    <td><select name="select2">
<?
		$modes = mcrypt_list_modes();
    	foreach ($modes as $mode) {
        	echo "<option value=".$mode.">$mode"."</option>";
    	}
?>
        </select></td>
  </tr>
  <tr>
    <td>Teks Terang</td>
    <td><input type="text" name="textfield"></td>
  </tr>
  <tr>
    <td>Kunci</td>
    <td><input type="text" name="textfield2"></td>
  </tr>
  <tr>
      <td>
      <td><input type="submit" name="Submit1" value="Submit">
        <input type="reset" name="Submit2" value="Reset"></td>
        </td>
  </tr>
</table>
</form>
</body>
</html>

2. Program Enkripsi.php

<?php
/**
 * @author Istiyana Purwaningsih
 * @copyright 2009
 */
?>
<?
    /*  Fungsi enkripsi_plain digunakan untuk algoritma stream cipher dengan \
        mode operasi stream karena tidak membutuhkan suatu IV */
function enkripsi_plain($algoritma,$mode,$secretkey,$fileplain,$filecipher){
	
	/* Membuka Modul untuk memilih Algoritma & Mode Operasi */
	$td = mcrypt_module_open($algoritma, '', $mode, 'stream');
	
	/* Menentukan panjang kunci yang digunakan*/

	$ks = mcrypt_enc_get_key_size($td);
					
	/* Menghasilakn Kunci */
	$key =$secretkey;
	echo "Kuncinya : ". $key. "<br>";
	
	/* Inisialisasi */
	mcrypt_generic_init($td, $key, $iv);
	$buffer = $fileplain;

	/* Enkripsi data, dimana hasil enkripsi harus di encode dengan base64.\
         Hal ini dikarenakan web browser tidak dapat membaca karakter-karakter \
         ASCII dalam bentuk simbol-simbol */
	$encrypted2= base64_encode(mcrypt_generic($td,$buffer));		
	$filecipher=$encrypted2;
		
	/* Menghentikan proses enkripsi dan menutup modul */
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	
    echo "Algoritma yang digunakan : ". $algoritma. "<br>";
    echo "Mode Operasi yang digunakan : ". $mode. "<br>";
    echo "Hasil Enkripsi : ". $filecipher. "<br>";

}

	/*  Fungsi enkripsi_plain2 digunakan untuk algoritma block cipher \
            dengan mode operasi selain stream */
function enkripsi_plain2($algoritma,$mode,$secretkey,$fileplain,$filecipher){
	
	/* Membuka Modul untuk memilih Algoritma & Mode Operasi */
	$td = mcrypt_module_open($algoritma, '', $mode, '');
	
	/* Inisialisasi IV dan Menentukan panjang kunci yang digunakan*/
	$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	$ks = mcrypt_enc_get_key_size($td);
					
	/* Menghasilkan Kunci */
	$key = $secretkey;
	echo "kuncinya : ". $key. "<br>";
	
	/* Inisialisasi */
	mcrypt_generic_init($td, $key, $iv);

	/* Enkripsi Data, dimana hasil enkripsi harus di encode dengan base64.\ 
         Hal ini dikarenakan web browser tidak dapat membaca karakter-karakter\
         ASCII dalam bentuk simbol-simbol */
	$buffer = $fileplain;
	$encrypted = mcrypt_generic($td, $buffer);		
	$encrypted1=base64_encode($iv).";".base64_encode($encrypted);
	$encrypted2=base64_encode($encrypted1);
	$filecipher=$encrypted2;
		
	/* Menghentikan proses enkripsi dan menutup modul */
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	
    echo "Algoritma yang digunakan : ". $algoritma. "<br>";
    echo "Mode Operasi yang digunakan : ". $mode. "<br>";
    echo "Hasil Enkripsi : ". $filecipher. "<br>";

}
if ($_POST['Submit1'] == 'Submit'){
	if (!empty($_POST['textfield'])){
		if (!empty($_POST['textfield2'])){
			if (!empty($_POST['select'])){
				if (!empty($_POST['select2'])){
			$algoritma= $_POST['select'];
			$mode= $_POST['select2'];
			$secretkey = $_POST['textfield2'];
			$fileplain = $_POST['textfield'];
				if($algoritma=="arcfour" || $algoritma=="wake" \
                                       || $algoritma=="enigma"){
					$mode=MCRYPT_MODE_STREAM;
			/*Memanggil fungsi enkripsi_plain algoritma stream */
					enkripsi_plain($algoritma,$mode,\
                                         $secretkey,$fileplain,$cipher);
				}else {
					$mode=$_POST['select2'];
			/* Memanggil fungsi enkripsi_plain2 algoritma blok*/
					enkripsi_plain2($algoritma,$mode,\
                                        $secretkey,$fileplain,$cipher);
					} 
				}else{
					echo "pilih mode operasi";	
				}
			}else{
				echo "pilih algoritma";		
			}	
		}else{
			echo "masukan kunci";
		} 
	}else{
		 " masukan plain text";
	}	
}
	
?>

3. Halaman Dekripsi

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Halaman Dekripsi</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p>Test Enkripsi Menggunakan Library Mcypt</p>
<form name="form1" method="post" action="dekripsi.php">
  <table width="100%" border="0" cellspacing="2" cellpadding="2">
    <tr>
    <td>Algoritma</td>
    <td>
        <select name="select">
<?
		$algorithms = mcrypt_list_algorithms();
    	foreach ($algorithms as $cipher) {
        	echo "<option value=".$cipher.">$cipher"."</option>";
    	}
?>
        </select>
      </td>
  </tr>
  <tr>
    <td>Mode Operasi</td>
    <td><select name="select2">
<?
		$modes = mcrypt_list_modes();
    	foreach ($modes as $mode) {
        	echo "<option value=".$mode.">$mode"."</option>";
    	}
?>
        </select></td>
  </tr>
  <tr>
    <td>Teks Sandi</td>
    <td><input type="text" name="textfield"></td>
  </tr>
  <tr>
    <td>Kunci</td>
    <td><input type="text" name="textfield2"></td>
  </tr>
  <tr>
      <td>
      <td><input type="submit" name="Submit1" value="Submit">
        <input type="reset" name="Submit2" value="Reset"></td>
        </td>
  </tr>
</table>
</form>
</body>
</html>

4. Program Dekripsi.php

<?php

/**
 * @author Istiyana Purwaningsih
 * @copyright 2009
 */

?>

<?
    /*  Fungsi dekripsi_cipher digunakan untuk algoritma stream cipher dengan \
        mode operasi stream karena tidak membutuhkan suatu IV */
    
function dekripsi_cipher($algoritma,$mode,$secretkey,$fileplain,$filecipher){
	
	/* Membuka Modul untuk memilih Algoritma & Mode Operasi */
	$td = mcrypt_module_open($algoritma, '', $mode, '');

	/* Menentukan panjang kunci yang digunakan*/
	$ks = mcrypt_enc_get_key_size($td);

	/* Menghasilkan Kunci */
	$key = $secretkey;
	
		
	/* Inisialisasi */
	mcrypt_generic_init($td, $key, $iv);
			
	/* Dekripsi Data */
			$buffer = $filecipher;
			$buffer =base64_decode($buffer);
			$fileplain = mdecrypt_generic($td, $buffer);
		
	/* Menghentikan proses dekripsi dan menutup modul */
	mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    
    echo "Algoritma yang digunakan : ". $algoritma. "<br>";
    echo "Mode Operasi yang digunakan : ". $mode. "<br>";
    echo "Hasil Dekripsi : ".$fileplain. "<br>";
}

/*  Fungsi dekripsi_cipher2 digunakan untuk algoritma block cipher \
dengan mode operasi selain stream */

function dekripsi_cipher2($algoritma,$mode,$iv,$secretkey,$fileplain,\
$filecipher){
	
	/* Membuka Modul untuk memilih Algoritma dan Mode Operasi */
	$td = mcrypt_module_open($algoritma, '', $mode, '');
	
	/* Inisialisasi IV dan Menentukan panjang kunci yang digunakan*/
	$iv =base64_decode($iv);
	$ks = mcrypt_enc_get_key_size($td);

	/* Menghasilkan Kunci */

	$key = $secretkey;

	/* Inisialisasi */
	mcrypt_generic_init($td, $key, $iv);
	
	/* Dekripsi Data */	
	$buffer = $filecipher;
	$buffer =base64_decode($buffer);
	$fileplain = mdecrypt_generic($td, $buffer);

	/* Menghentikan proses dekripsi dan menutup modul */
	mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    
    echo "Algoritma yang digunakan : ". $algoritma. "<br>";
    echo "Mode Operasi yang digunakan : ". $mode. "<br>";
    echo "Hasil Dekripsi : ".$fileplain. "<br>";
    
}

if ($_POST['Submit1'] == 'Submit'){
	if (!empty($_POST['textfield'])){
		if (!empty($_POST['textfield2'])){
			if (!empty($_POST['select'])){
				if (!empty($_POST['select2'])){
			$algoritma= $_POST['select'];
			$mode= $_POST['select2'];
			$secretkey = $_POST['textfield2'];
			$filecipher = $_POST['textfield'];
				if($algoritma=="arcfour" || $algoritma=="wake"\
                                 || $algoritma=="enigma"){
					$mode=MCRYPT_MODE_STREAM;
			/* Memanggil fungsi dekripsi_cipher algoritma stream */
					dekripsi_cipher($algoritma,$mode,\
                                        $secretkey,$fileplain,$filecipher);
				}else {
					$mode=$_POST['select2'];
			/* Ciphertext harus didecode base64 terlebih dahulu */
					$filecipher=base64_decode($filecipher);
			/* Memisahkan IV dengan Ciphertext, dimana ciphertext \
                           sebelumnya yang sudah di decode dengan base64\
                           merupakan gabungan IV dengan ciphertext (teks sandi)\
                           asli */
				list($iv,$filecipher)= split (";", $filecipher);
			/* Memanggil fungsi dekripsi_cipher2 algoritma blok*/
					dekripsi_cipher2($algoritma,$mode,$iv,\
                                        $secretkey,$fileplain,$filecipher);
					} 
				}else{
					echo "pilih mode operasi";	
				}
			}else{
				echo "pilih algoritma";		
			}	
		}else{
			echo "masukan secretkey";
		} 
	}else{
		 " masukan ciphertext";
	}	
}
?>

Penutup

Demikian sedikit yang bisa saya tulis mengenai Mcrypt. Jika ada banyak kesalahan adalah murni dari saya. Smoga bermanfaat 🙂 @author Istiyana Purwaningsih @copyright 2009

Referensi

[1] http://mcrypt.hellug.gr/ [2] http://mcrypt.sourceforge.net/ [3] http://www.phpbuilder.com/manual/en/ref.mcrypt.php

Facebook
Twitter
Telegram
WhatsApp

Penerbitan Lainya