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截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
解析CI的AJAX分页 另类实现方法
Jun 27 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
destoon文章模块调用企业会员资料的方法
Aug 22 PHP
PHP页面输出时js设置input框的选中值
Sep 30 PHP
简单谈谈PHP中的trait
Feb 25 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 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
用PHP制作静态网站的模板框架(四)
2006/10/09 PHP
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
PHP如何实现跨域
2016/05/30 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
详解Swift中属性的声明与作用
2016/06/30 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
Python-opencv 双线性插值实例
2020/01/17 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
网络编辑职责
2014/03/01 职场文书
计算机毕业生求职信
2014/06/10 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
怎样写离婚协议书
2014/09/10 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python