Sabtu, 18 Agustus 2018

Main Kriptografi dengan Mcrypt

Ketika kita menggunakan php, untuk keperluan enkripsi disediakan library mcrypt. Untuk bisa menggunakan library ini, kita harus mengubah setting di file php.ini Hilangkan semicolon (;) yang ada di depan baris yang ada mcryptnya yaitu:

mcrypt.algorithms_dir=/usr/local/lib/libmcrypt.
mcrypt.modes_dir=/usr/local/lib/libmcrypt

Setelah itu restart web server (apache)nya. Jika library mcrypt sudah diaktifkan, kita bisa mulai bermain kriptografi dengan menggunakan fungsi-fungsinya. Fungsi yang disediakan untuk enkripsi adalah:

chipertext = mcrypt_encrypt(ALGORITMA, key, plaintext, MODE, iv)

Sedangkan untuk mendapatkan teks asli disediakan fungsi:

plaintext = mcrypt_decrypt(ALGORITMA, key, chipertext, MODE, iv)



Pilihan 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_RIJNDAEL_256
MCRYPT_RC2
MCRYPT_RC6
MCRYPT_SAFERPLUS
MCRYPT_SERPENT
MCRYPT_TWOFISH
MCRYPT_WAKE
MCRYPT_XTEA

Pilihan MODE:
MCRYPT_MODE_ECB
MCRYPT_MODE_CTR
MCRYPT_MODE_CBC
MCRYPT_MODE_CFB
MCRYPT_MODE_NCFB
MCRYPT_MODE_OFB
MCRYPT_MODE_NOFB
MCRYPT_MODE_STREAM 

Dengan adanya 4 parameter selain plaintext saja sebenarnya metode yang digunakan fungsi ini menjadi sulit ditebak. Ditambah kita bisa mengkombinasinya dengan fungsi enkripsi lain seperti base64_encode. Nah, kita juga bisa mengamankan key dan iv dengan menggunakan fungsi-fungsi hashing seperti md5.
Berikut akan disajikan contoh yang bisa diperbuat programmer dalam dunia kriptografi dengan fitur yang disediakan php ini.

<?php 
$input = "SmackFactory"; 

$encrypted = encryptIt( $input ); 
$decrypted = decryptIt( $encrypted ); 
echo '<br />' .$encrypted . '<br />' . $decrypted; 

$encrypted = base64_encode( $input ); 
$decrypted = base64_decode( $encrypted ); 
echo '<br />' .$encrypted . '<br />' . $decrypted.'<br />'; 

$encrypted = urlencode( "hello world!@#$%^&*()_+"); 
$decrypted = urldecode( $encrypted ); 
echo '<br />urlencode : ' .$encrypted . '<br />urldecode : ' . $decrypted.'<br />'; 

function encryptIt( $q ) { 
    $cryptKey  = 'qJB0rGtIn5UB1xG03efyCp'; 
    $qEncoded      = base64_encode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ), $q, MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ) ); 
    return( $qEncoded ); 

function decryptIt( $q ) { 
    $cryptKey  = 'qJB0rGtIn5UB1xG03efyCp'; 
    $qDecoded      = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ), base64_decode( $q ), MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ), "\0"); 
    return( $qDecoded ); 

?>

Contoh lain kombinasi yang bisa dibuat dalam proses enkripsi:

<?php
  $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3"); 
     
    # show key size use either 16, 24 or 32 byte keys for AES-128, 192 
    # and 256 respectively 
    $key_size =  strlen($key); 
    echo "Key size: " . $key_size . "\n"; 

$plaintext = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";     
# create a random IV(Initialisation Vector) to use with CBC encoding    
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);    
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);     
# creates a cipher text compatible with AES (Rijndael block size = 128)    
# to keep the text confidential     
# only suitable for encoded input that never ends with value 00h    
# (because of default zero padding)    
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC, $iv);    
# prepend the IV for it to be available for decryption     
$ciphertext = $iv . $ciphertext;    
# encode the resulting cipher text so it can be represented by a string    
$ciphertext_base64 = base64_encode($ciphertext);     
echo  $ciphertext_base64 . "\n";    
 # === WARNING ===    
 # Resulting cipher text has no integrity or authenticity added    
 # and is not protected against padding oracle attacks.     
# --- DECRYPTION ---     
$ciphertext_dec = base64_decode($ciphertext_base64);    
# retrieves the IV, iv_size should be created using mcrypt_get_iv_size()    
$iv_dec = substr($ciphertext_dec, 0, $iv_size);          
# retrieves the cipher text (everything except the $iv_size in the front)     
$ciphertext_dec = substr($ciphertext_dec, $iv_size);    
# may remove 00h valued characters from end of plain text     
$plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);         
echo  $plaintext_dec . "\n";
?>

Tidak ada komentar:

Posting Komentar