| 
<?php
 /**
 Requirements:
 - a initial string from which I create a key ($string)
 - for decryption:
 - given a base64 encoded string to be decrypted -> return clear text
 - for encryption:
 - given a clear Text -> return a base64 encoded string
 - every object is instanziated by the initial string:
 var encObj = new sswEncrypter($string);
 var aClearText = encObj.decrypt(base64encodedString);
 var aBase64EncodedString = encObj.encrypt(aClearText);
 */
 
 class AES128encrypter
 {
 public $key;
 
 function __construct($string)
 {
 $this->key = pack('H*',md5($string));
 }
 
 private function pkcs5_pad ($text, $blocksize) {
 $pad = $blocksize - (strlen($text) % $blocksize);
 if($pad == 0) {
 $pad = $blocksize;
 }
 return $text . str_repeat(chr($pad), $pad);
 }
 
 function encrypt($clearText,$ivStr = NULL)
 {
 $key = $this->key;
 $key_size = strlen($key);
 // text has to be divisible by block size, thus a possibile padding is added
 $plaintext = $this->pkcs5_pad($clearText,mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
 $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
 if($ivStr != NULL) {
 for($i = 0; $i<$iv_size && $i<strlen($ivStr); $i++) {
 $iv[$i] = $ivStr[$i];
 }
 }
 $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;
 $ciphertext_base64 = base64_encode($ciphertext);
 return $ciphertext_base64;
 }
 
 function decrypt($base64EncodedStr)
 {
 $sKey = $this->key;
 $ciphertext_dec = base64_decode($base64EncodedStr);
 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
 # 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);
 $plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $sKey,
 $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
 // and now remove the padding (possible)
 $dec_s = strlen($plaintext_dec);
 $padding = ord($plaintext_dec[$dec_s-1]);
 $plaintext_dec = substr($plaintext_dec, 0, -$padding);
 return $plaintext_dec;
 }
 
 function getIV($base64EncodedStr) {
 $ciphertext_dec = base64_decode($base64EncodedStr);
 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
 # retrieves the IV, iv_size should be created using mcrypt_get_iv_size()
 $iv_dec = substr($ciphertext_dec, 0, $iv_size);
 
 return $iv_dec;
 }
 
 }
 
 |