使用示例:
```
* $mcrypt = new PhalApi_Crypt_Mcrypt('12345678');
*
* $data = 'dogstar love php';
* $key = 'secrect';
*
* // 加密
* $encryptData = $mcrypt->encrypt($data, $key);
*
* // 解密
* $decryptData = $mcrypt->decrypt($encryptData, $key);
```
*
* @package PhalApi\Crypt
* @link http://php.net/manual/zh/function.mcrypt-generic.php
* @license http://www.phalapi.net/license GPL 协议
* @link http://www.phalapi.net/
* @author dogstar 2014-12-10
*/
class PhalApi_Crypt_Mcrypt implements PhalApi_Crypt {
/**
* @var string $iv 加密向量, 最大长度不得超过PhalApi_Crypt_Mcrypt::MAX_IV_SIZE
*/
protected $iv;
/**
* @var int 最大加密向量长度
*/
const MAX_IV_SIZE = 8;
/**
* @var int 最大加密key的长度
*/
const MAX_KEY_LENGTH = 56;
/**
* @param string $iv 加密的向量 最大长度不得超过 MAX_IV_SIZE
*/
public function __construct($iv = '********') {
$this->iv = str_pad($iv, static::MAX_IV_SIZE, '*');
if (strlen($this->iv) > static::MAX_IV_SIZE) {
$this->iv = substr($this->iv, 0, static::MAX_IV_SIZE);
}
}
/**
* 对称加密
*
* @param string $data 待加密的数据
* @param string key 私钥
* @return string 加密后的数据
*/
public function encrypt($data, $key) {
if ($data === '') {
return $data;
}
$cipher = $this->createCipher($key);
$encrypted = mcrypt_generic($cipher, $data);
$this->clearCipher($cipher);
return $encrypted;
}
/**
* 对称解密
*
* @see PhalApi_Crypt_Mcrypt::encrypt()
*
* @param string $data 待解密的数据
* @param string key 私钥
* @return string 解密后的数据
*/
public function decrypt($data, $key) {
if ($data === '') {
return $data;
}
$cipher = $this->createCipher($key);
$decrypted = mdecrypt_generic($cipher, $data);
$this->clearCipher($cipher);
return rtrim($decrypted, "\0");
}
/**
* 创建cipher
* @param string $key 私钥
* @return resource
* @throws PhalApi_Exception_InternalServerError
*/
protected function createCipher($key) {
$cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_CBC, '');
if ($cipher === FALSE || $cipher < 0) {
throw new PhalApi_Exception_InternalServerError(
T('mcrypt_module_open with {cipher}', array('cipher' => $cipher))
);
}
mcrypt_generic_init($cipher, $this->formatKey($key), $this->iv);
return $cipher;
}
/**
* 格式化私钥
* @param string $key 私钥
*/
protected function formatKey($key) {
return strlen($key) > static::MAX_KEY_LENGTH ? substr($key, 0, static::MAX_KEY_LENGTH) : $key;
}
/**
* 释放cipher
* @param resource $cipher
*/
protected function clearCipher($cipher) {
mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);
}
}