#1 Kvoid
我知道有朋友不喜欢用session做验证,但是用cookie做验证太不安全,自己写加密解密?不,php本身有mcrypt扩展,提供多种算法和模式,还不够么?这里封装了一个,改成sp扩展方式就大家自己去动手了哈哈。/**ecb模式使用简单,但是这种密码本加密模式会让人有规律可循,其余模式均会用到向量
* Mcrypt类
*
* mcrypt扩展功能封装
*/
class Mcrypt {
/**
* 密钥
*/
private $key;
/**
* 当前算法
*/
private $algorithm;
/**
* 当前模式
*/
private $mode;
/**
* 向量
*/
private $iv;
/**
* 构造函数
*/
public function __construct($key = null, $algorithm, $mode, $iv = null) {
$this->algorithm = $algorithm;
$this->mode = $mode;
$this->base64 = $base64;
$check_arr = $this->__check();
if (!$check_arr[0]) die($check_arr[1]);
$key_size = mcrypt_get_key_size($this->algorithm, $this->mode);
$this->key = substr(md5($key), 0, $key_size);
$this->__handle_iv($iv);
}
/**
* 进行检测
*/
private function __check() {
if (!function_exists('mcrypt_module_open')) return array(false, '未开启mcrypt扩展');
if (!in_array($this->algorithm, self::list_algorithms())) return array(false, '不支持的算法:' . $this->algorithm);
if (!in_array($this->mode, self::list_modes())) return array(false, '不支持的模式:' . $this->mode);
return array(true);
}
/**
* 处理向量
*/
private function __handle_iv($iv) {
$this->iv = $iv ? trim(base64_decode($iv)) : mcrypt_create_iv(mcrypt_get_iv_size($this->algorithm, $this->mode));
}
/**
* 获取向量
*/
public function getiv() {
return base64_encode($this->iv);
}
/**
* 加密
*/
public function encrypt($data) {
$data = mcrypt_encrypt($this->algorithm, $this->key, $data, $this->mode, $this->iv);
return base64_encode($data);
}
/**
* 解密
*/
public function decrypt($data) {
$data = trim(base64_decode($data));
$data = mcrypt_decrypt($this->algorithm, $this->key, $data, $this->mode, $this->iv);
return $data;
}
/**
* 返回环境所支持的算法 受libmcrypt版本影响
*/
public static function list_algorithms() {
return mcrypt_list_algorithms();
}
/**
* 返回环境所支持的模式 受libmcrypt版本影响
*/
public static function list_modes() {
return mcrypt_list_modes();
}
}
/**
* demo :
* $str = '我内个擦';
* $key = 'al&8kxc2sd';
* $mc = new Mcrypt($key, 'gost', 'ecb');
* $en = $mc->encrypt($str);
* $de = $mc->decrypt($en);
* echo '加密前:', $str . '
'; //加密前:我内个擦
* echo '加密后:', $en . '
'; //加密后:�Pw�Hp/�+F����X�
* echo '解密后:', $de . '
'; //解密后:我内个擦
*/
?>
详情请参考我的这篇博客 传送门
2011-07-10 16:30:41