public function encode($data) { // Set the rand type if it has not already been set if (Encrypt::$_rand === NULL) { $is_windows = DIRECTORY_SEPARATOR === '\\'; if ($is_windows) { // Windows only supports the system random number generator Encrypt::$_rand = MCRYPT_RAND; } else { if (defined('MCRYPT_DEV_URANDOM')) { // Use /dev/urandom Encrypt::$_rand = MCRYPT_DEV_URANDOM; } elseif (defined('MCRYPT_DEV_RANDOM')) { // Use /dev/random Encrypt::$_rand = MCRYPT_DEV_RANDOM; } else { // Use the system random number generator Encrypt::$_rand = MCRYPT_RAND; } } } if (Encrypt::$_rand === MCRYPT_RAND) { // The system random number generator must always be seeded each // time it is used, or it will not produce true random results mt_srand(); } // Create a random initialization vector of the proper size for the current cipher $iv = mcrypt_create_iv($this->_iv_size, Encrypt::$_rand); // Encrypt the data using the configured options and generated iv $data = mcrypt_encrypt($this->_cipher, $this->_key, $data, $this->_mode, $iv); // Use base64 encoding to convert to a string return base64_encode($iv . $data); }
/** * Proxy for the mcrypt_create_iv function - to allow mocking and testing against KAT vectors * * @return string the initialization vector or FALSE on error */ protected function _create_iv() { /* * Silently use MCRYPT_DEV_URANDOM when the chosen random number generator * is not one of those that are considered secure. * * Also sets Encrypt::$_rand to MCRYPT_DEV_URANDOM when it's not already set */ if (Encrypt::$_rand !== MCRYPT_DEV_URANDOM and Encrypt::$_rand !== MCRYPT_DEV_RANDOM) { Encrypt::$_rand = MCRYPT_DEV_URANDOM; } // Create a random initialization vector of the proper size for the current cipher return mcrypt_create_iv($this->_iv_size, Encrypt::$_rand); }