php对称加密算法示例


Posted in PHP onMay 07, 2014

php对称加密算法

KEY 是之前定义的常量

Mcrypt::encrypt();
Mcrypt::decrypt();
defined('ROOT') or exit('Access Denied');
class Mcrypt{
 public static function encrypt($code){
  return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(KEY), $code, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
 }
 public static function decrypt($code){
  return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(KEY), base64_decode($code), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND));
 }
}

常用对称加密算法(DES/AES)类

xcrypt.php

/** 
 * 常用对称加密算法类 
 * 支持密钥:64/128/256 bit(字节长度8/16/32) 
 * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit) 
 * 支持模式:CBC/ECB/OFB/CFB 
 * 密文编码:base64字符串/十六进制字符串/二进制字符串流 
 * 填充方式: PKCS5Padding(DES) 
 * 
 * @author: linvo 
 * @version: 1.0.0 
 * @date: 2013/1/10 
 */  
class Xcrypt{      private $mcrypt;  
    private $key;  
    private $mode;  
    private $iv;  
    private $blocksize;  
    /** 
     * 构造函数 
     * 
     * @param string 密钥 
     * @param string 模式 
     * @param string 向量("off":不使用 / "auto":自动 / 其他:指定值,长度同密钥) 
     */  
    public function __construct($key, $mode = 'cbc', $iv = "off"){  
        switch (strlen($key)){  
        case 8:  
            $this->mcrypt = MCRYPT_DES;  
            break;  
        case 16:  
            $this->mcrypt = MCRYPT_RIJNDAEL_128;  
            break;  
        case 32:  
            $this->mcrypt = MCRYPT_RIJNDAEL_256;  
            break;  
        default:  
            die("Key size must be 8/16/32");  
        }  
        $this->key = $key;  
        switch (strtolower($mode)){  
        case 'ofb':  
            $this->mode = MCRYPT_MODE_OFB;  
            if ($iv == 'off') die('OFB must give a IV'); //OFB必须有向量  
            break;  
        case 'cfb':  
            $this->mode = MCRYPT_MODE_CFB;  
            if ($iv == 'off') die('CFB must give a IV'); //CFB必须有向量  
            break;  
        case 'ecb':  
            $this->mode = MCRYPT_MODE_ECB;  
            $iv = 'off'; //ECB不需要向量  
            break;  
        case 'cbc':  
        default:  
            $this->mode = MCRYPT_MODE_CBC;  
        }  
        switch (strtolower($iv)){  
        case "off":  
            $this->iv = null;  
            break;  
        case "auto":  
            $source = PHP_OS=='WINNT' ? MCRYPT_RAND : MCRYPT_DEV_RANDOM;  
            $this->iv = mcrypt_create_iv(mcrypt_get_block_size($this->mcrypt, $this->mode), $source);  
            break;  
        default:  
            $this->iv = $iv;  
        }  
     
    }  
  
    /** 
     * 获取向量值 
     * @param string 向量值编码(base64/hex/bin) 
     * @return string 向量值 
     */  
    public function getIV($code = 'base64'){  
        switch ($code){  
        case 'base64':  
            $ret = base64_encode($this->iv);  
            break;  
        case 'hex':  
            $ret = bin2hex($this->iv);  
            break;  
        case 'bin':  
        default:  
            $ret = $this->iv;  
        }  
        return $ret;  
    }  
  
    /** 
     * 加密 
     * @param string 明文 
     * @param string 密文编码(base64/hex/bin) 
     * @return string 密文 
     */  
    public function encrypt($str, $code = 'base64'){  
        if ($this->mcrypt == MCRYPT_DES) $str = $this->_pkcs5Pad($str);  
        if (isset($this->iv)) {  
            $result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);    
        } else {  
            @$result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode);    
        }  
        switch ($code){  
        case 'base64':  
            $ret = base64_encode($result);  
            break;  
        case 'hex':  
            $ret = bin2hex($result);  
            break;  
        case 'bin':  
        default:  
            $ret = $result;  
        }  
        return $ret;  
    }  
    /** 
     * 解密  
     * @param string 密文 
     * @param string 密文编码(base64/hex/bin) 
     * @return string 明文 
     */  
    public function decrypt($str, $code = "base64"){      
        $ret = false;  
        switch ($code){  
        case 'base64':  
            $str = base64_decode($str);  
            break;  
        case 'hex':  
            $str = $this->_hex2bin($str);  
            break;  
        case 'bin':  
        default:  
        }  
        if ($str !== false){  
            if (isset($this->iv)) {  
                $ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);    
            } else {  
                @$ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode);    
            }  
            if ($this->mcrypt == MCRYPT_DES) $ret = $this->_pkcs5Unpad($ret);  
            $ret = trim($ret);  
        }  
        return $ret;   
    } 
    private function _pkcs5Pad($text){  
        $this->blocksize = mcrypt_get_block_size($this->mcrypt, $this->mode);    
        $pad = $this->blocksize - (strlen($text) % $this->blocksize);  
        return $text . str_repeat(chr($pad), $pad);  
    }  
    private function _pkcs5Unpad($text){  
        $pad = ord($text{strlen($text) - 1});  
        if ($pad > strlen($text)) return false;  
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;  
        $ret = substr($text, 0, -1 * $pad);  
        return $ret;  
    }  
    private function _hex2bin($hex = false){  
        $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;      
        return $ret;  
    } 
} 

上面类的使用方法

<?php  
header('Content-Type:text/html;Charset=utf-8;');  include "xcrypt.php";  
echo '<pre>';    
$a = isset($_GET['a']) ? $_GET['a'] : '测试123';  
//密钥  
$key = '12345678123456781234567812345678'; //256 bit  
$key = '1234567812345678'; //128 bit  
$key = '12345678'; //64 bit  
//设置模式和IV  
$m = new Xcrypt($key, 'cbc', 'auto');  
//获取向量值  
echo '向量:';  
var_dump($m->getIV());  
//加密  
$b = $m->encrypt($a, 'base64');  
//解密  
$c = $m->decrypt($b, 'base64');  
echo '加密后:';  
var_dump($b);  
echo '解密后:';  
var_dump($c);  
echo '</pre>'; 
PHP 相关文章推荐
PHP ajax 分页类代码
Nov 13 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
PHP自动选择 连接本地还是远程数据库
Dec 02 PHP
php记录日志的实现代码
Aug 08 PHP
linux系统上支持php的 iconv()函数的方法
Oct 01 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
destoon找回管理员密码的方法
Jun 21 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
php实现mysql封装类示例
May 07 #PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
May 07 #PHP
php读取3389的脚本
May 06 #PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
May 06 #PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 #PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
May 06 #PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 #PHP
You might like
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
yii2安装详细流程
2018/05/23 PHP
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
收集的几个Python小技巧分享
2014/11/22 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
2018/06/21 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
Python Excel处理库openpyxl使用详解
2019/05/09 Python
python函数的万能参数传参详解
2019/07/26 Python
Python 获取项目根路径的代码
2019/09/27 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
python实现udp聊天窗口
2020/03/31 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
某科技软件测试面试题
2013/05/19 面试题
什么是方法的重载
2013/06/24 面试题
教师开学感言
2014/02/14 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
《将心比心》教学反思
2016/02/23 职场文书
《三国志》赏析
2019/08/27 职场文书