1
0
Fork 0
MySQLDumper/library/Msd/Crypt.php

249 Zeilen
5.7 KiB
PHP

<?php
/**
* This file is part of MySQLDumper released under the GNU/GPL 2 license
* http://www.mysqldumper.net
*
* @package MySQLDumper
* @subpackage Encryption
* @version SVN: $Rev$
* @author $Author$
*/
/**
* Class for text en- and decryption.
*
* @package MySQLDumper
* @subpackage Encryption
*/
class Msd_Crypt
{
/**
* Holds the encryption descriptor
*
* @var resource
*/
private $_encDescriptor = null;
/**
* Holds the initialization vector
*
* @var resource
*/
private $_initVector = null;
/**
* Holds the algorithm wichc is currently used.
*
* @var string
*/
private $_algorithm = MCRYPT_TWOFISH;
/**
* Holds the current encryption key.
*
* @var string
*/
private $_encryptionKey = null;
/**
* Instance of this class.
*
* @var Msd_Crypt
*/
private static $_instance = null;
/**
* Identificator for encrypted text
*
* @var string
*/
private $_cryptIdent = 'Z';
/**
* Class constructor
*
* @param string $cryptKey Encryption key
* @param string $algorithm Algorithm for encryption
*
* @return void
*/
private function __construct($cryptKey = null, $algorithm = null)
{
if ($cryptKey === null) {
$cryptKey = md5(time());
}
if ($algorithm === null) {
$algorithm = $this->_algorithm;
}
$this->init($cryptKey, $algorithm);
}
/**
* Get the instance of this class.
*
* @param string $cryptKey Encryption key
* @param string $algorithm Algorithm for encryption
*
* @return Msd_Crypt
*/
public static function getInstance($cryptKey = null, $algorithm = null)
{
if (self::$_instance === null) {
self::$_instance = new self($cryptKey, $algorithm);
}
return self::$_instance;
}
/**
* Initializes the encryption descriptor.
*
* @param string $encryptionKey Key for encryption
* @param string $algorithm Algorithm for encryption
*
* @return void
*/
public function init($encryptionKey = null, $algorithm = null)
{
if ($encryptionKey === null) {
$encryptionKey = $this->_encryptionKey;
}
if ($algorithm === null) {
$algorithm = $this->_algorithm;
}
if (!is_resource($this->_encDescriptor)) {
$this->_encDescriptor = mcrypt_module_open(
$algorithm,
'',
MCRYPT_MODE_ECB,
''
);
$vectorSize = mcrypt_enc_get_iv_size($this->_encDescriptor);
$this->_initVector = mcrypt_create_iv($vectorSize, MCRYPT_RAND);
$keySize = mcrypt_enc_get_key_size($this->_encDescriptor);
$key = substr(md5($encryptionKey), 0, $keySize);
mcrypt_generic_init(
$this->_encDescriptor,
$key,
$this->_initVector
);
$this->_encryptionKey = $encryptionKey;
}
}
/**
* Uninitialize the encryption descriptor.
*
* @return void
*/
public function deinit()
{
if (is_resource($this->_encDescriptor)) {
mcrypt_generic_deinit($this->_encDescriptor);
}
}
/**
* Close the encryption descriptor
*
* @return void
*/
public function close()
{
$this->deinit();
if (is_resource($this->_encDescriptor)) {
mcrypt_module_close($this->_encDescriptor);
}
$this->_encDescriptor = null;
}
/**
* Decodes an base64 encoded string.
*
* @param string $encodedString base64 encoded string
*
* @return sting
*/
private function _base64Decode($encodedString)
{
if (substr($encodedString, 0, 1) !== $this->_cryptIdent) {
return $encodedString;
}
$encodedString = str_replace(
array('.', '_', '-'),
array('+', '/', '='),
substr($encodedString, 1)
);
$decodedString = base64_decode($encodedString);
return $decodedString;
}
/**
* Encode a string into base64 notation.
*
* @param string $plainString Plaintext
*
* @return string
*/
private function _base64Encode($plainString)
{
$encodedString = base64_encode($plainString);
$encodedString = str_replace(
array('+', '/', '='),
array('.', '_', '-'),
$encodedString
);
return $this->_cryptIdent . $encodedString;
}
/**
* Decrypts a text.
*
* @param string $encryptedText Text to decrypt
*
* @return string
*/
public function decrypt($encryptedText)
{
$encryptedText = $this->_base64Decode($encryptedText);
if (!is_resource($this->_encDescriptor)) {
$this->init($this->_encryptionKey);
}
$clearText = mdecrypt_generic(
$this->_encDescriptor,
$encryptedText
);
return trim($clearText);
}
/**
* Encrypts a text
*
* @param string $clearText Text to encrypt
*
* @return string
*/
public function encrypt($clearText)
{
if (!is_resource($this->_encDescriptor)) {
$this->init();
}
$encryptedText = mcrypt_generic(
$this->_encDescriptor,
$clearText
);
return $this->_base64Encode($encryptedText);
}
/**
* Class destructor
*
* @return void
*/
public function __destruct()
{
$this->close();
}
}