加密解密mcrypt扩展类

#1 Kvoid

我知道有朋友不喜欢用session做验证,但是用cookie做验证太不安全,自己写加密解密?不,php本身有mcrypt扩展,提供多种算法和模式,还不够么?这里封装了一个,改成sp扩展方式就大家自己去动手了哈哈。
/**
* 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 . '
'; //解密后:我内个擦
*/
?>
ecb模式使用简单,但是这种密码本加密模式会让人有规律可循,其余模式均会用到向量
详情请参考我的这篇博客 传送门

2011-07-10 16:30:41

#2 anythink

这么神奇?

2011-07-10 18:13:41

#3 jake

函数参考 http://cn.php.net/manual/zh/function.mcrypt-encrypt.php

2011-07-10 18:17:39

#4 anythink

想用cookie 但是觉得 mcrypt_encrypt 不安全啊...

2011-07-11 10:49:18