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 相关文章推荐
基于mysql的论坛(4)
Oct 09 PHP
如何跨站抓取别的站点的页面的补充
Oct 09 PHP
php自定义函数之递归删除文件及目录
Aug 08 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
Jun 19 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
Yii2框架中一些折磨人的坑
Dec 15 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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
javascript判断移动端访问设备并解析对应CSS的方法
2015/02/05 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
JSP防止网页刷新重复提交数据的几种方法
2016/11/19 Javascript
Angular使用$http.jsonp发送跨站请求的方法
2017/03/16 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
vue配置接口域名方法总结
2019/05/12 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
python链接Oracle数据库的方法
2015/06/28 Python
Python实现的堆排序算法示例
2018/04/29 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
Python爬取12306车次信息代码详解
2020/08/12 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
政法大学毕业生自荐信范文
2014/01/01 职场文书
一份报关员的职业规划范文
2014/01/08 职场文书
高中打架检讨书
2014/02/13 职场文书
家长会主持词开场白
2014/03/18 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript