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中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
PHP中把数据库查询结果输出为json格式简单实例
Apr 09 PHP
PHP导入导出Excel代码
Jul 07 PHP
PHP实现多文件上传的方法
Jul 08 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 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
Zend引擎的发展 [15]
2006/10/09 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
PHP模拟http请求的方法详解
2016/11/09 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
jQuery中实现动画效果的基本操作介绍
2013/04/16 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
静心口服夜广告词
2014/03/20 职场文书
小学生寒假家长评语
2014/04/16 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
党风廉正建设责任书
2015/01/29 职场文书
党小组评议意见
2015/06/02 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL