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下通过POST还是GET来传值
Jun 05 PHP
PHP扩展编写点滴 技巧收集
Mar 09 PHP
php 5.3.5安装memcache注意事项小结
Apr 12 PHP
PHP删除数组中的特定元素的代码
Jun 28 PHP
php获取服务器信息的实现代码
Feb 04 PHP
深入PHP数据加密详解
Jun 18 PHP
php MessagePack介绍
Oct 06 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
php实现的用户查询类实例
Jun 18 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
PHP操作路由器实现方法示例
Apr 27 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 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
第十二节--类的自动加载
2006/11/16 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
php浏览历史记录的方法
2015/03/10 PHP
深入浅出php socket编程
2015/05/13 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
jquery提交form表单简单示例分享
2014/03/03 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
js判断密码强度的方法
2020/03/18 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
Python如何为图片添加水印
2016/11/25 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python PIL库图片灰化处理
2020/04/07 Python
使用Pycharm分段执行代码
2020/04/15 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
python爬虫 requests-html的使用
2020/11/30 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
实习自我鉴定模板
2013/09/28 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
2014年保密工作总结
2014/11/22 职场文书
中秋客户感谢信
2015/01/22 职场文书
军训通讯稿范文
2015/07/18 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书