php对称加密算法示例

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>';

(0)

相关推荐

  • PHP使用栈解决约瑟夫环问题算法示例

    本文实例讲述了PHP使用栈解决约瑟夫环问题算法.分享给大家供大家参考,具体如下: 约瑟夫环问题: 39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀.然后下一个重新报数,直到所有人都自杀身亡为止.然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏. <?php cla

  • php使用高斯算法实现图片的模糊处理功能示例

    本文实例讲述了php使用高斯算法实现图片的模糊处理功能.分享给大家供大家参考,具体如下: <?php class image_blur{ function gaussian_blur($srcImg,$savepath=null,$savename=null,$blurFactor=3){ $gdImageResource=$this->image_create_from_ext($srcImg); $srcImgObj=$this->blur($gdImageResource,$blu

  • PHP经典算法集锦【经典收藏】

    本文实例总结了PHP经典算法.分享给大家供大家参考,具体如下: 1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++){ echo str_repeat(" ",3-$i); echo str_repeat("*",$i*2+1); echo '<br/>'; } 2.冒泡排序,C里基础算法,从小到大对一组数

  • PHP实现的蚂蚁爬杆路径算法代码

    本文实例讲述了PHP实现的蚂蚁爬杆路径算法代码.分享给大家供大家参考,具体如下: <?php /** * 有一根27厘米的细木杆,在第3厘米.7厘米.11厘米.17厘米.23厘米这五个位置上各有一只蚂蚁. * 木杆很细,不能同时通过一只蚂蚁.开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头, * 但不会后退.当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走.假设蚂蚁们每秒钟可以走一厘米的距离. * 编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间. */ function ad

  • PHP实现的迪科斯彻(Dijkstra)最短路径算法实例

    本文实例讲述了PHP实现的迪科斯彻(Dijkstra)最短路径算法.分享给大家供大家参考,具体如下: 一.待解决问题 单源最短路径问题,在给定有向图中求一个顶点(单源顶点)到其他所有顶点的最短路径问题.在下图中,每条边上有一个权值,希望求解A到所有其他顶点(B/C/D/E/F/G)的最短路径. 二.问题分析(最短路径的子结构同样最优性) 如果P(A,G)是从顶点A到G的最短路径,假设D和F是这条路径上的中间点,那么P(D,F)一定时从D到F的最短路径.如果P(D,F)不是D到F的最短路径,那必然

  • 适用于抽奖程序、随机广告的PHP概率算法实例

    那么我们在程序里必然会设计到算法,即按照一定的概率让用户获得奖品.先来看两个概率算法函数. 算法一 复制代码 代码如下: /** * 全概率计算 * * @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4) * @return string 返回上面数组的key */function random($ps){    static $arr = array();    $key = md5(serialize($ps)); if (!isset

  • PHP常用算法和数据结构示例(必看篇)

    实例如下: </pre><pre name="code" class="php"><?php /** * Created by PhpStorm. * User: qishou * Date: 15-8-2 * Time: 上午9:12 */ header("content-type:text/html;charset=utf-8"); $arr = array(3,5,8,4,9,6,1,7,2); echo im

  • php中最简单的字符串匹配算法

    本文实例讲述了php中最简单的字符串匹配算法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php /* 最简单字符串匹配算法php实现方式   T: ababcabc P: abc   0.          1.          2. ababcabc    ababcabc    ababcabc |||          |||          ||| abc          abc          abc (X)          (X)         

  • PHP大转盘中奖概率算法实例

    本文实例讲述了PHP大转盘中奖概率算法的实现方法,分享给大家供大家参考.具体如下: 大转盘是最近很多线上网动中一个比较有意思的东西了,下面我们就来看看这个大转盘中奖概率算法与例子,希望对各位有所帮助. 这是一个APP客户端有大转盘抽奖算法,具体如何抽奖当然在我们服务端实现了.下面和大家简单分享一下实现代码: 复制代码 代码如下: header("Content-type: text/html; charset=utf-8"); $prize_arr = array( '0' =>

  • php加密算法之实现可逆加密算法和解密分享

    加密算法如下: 复制代码 代码如下: function encrypt($data, $key){ $key = md5($key);    $x  = 0;    $len = strlen($data);    $l  = strlen($key);    for ($i = 0; $i < $len; $i++)    {        if ($x == $l)         {         $x = 0;        }        $char .= $key{$x};   

  • php 大数据量及海量数据处理算法总结

    下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题.下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论. 1.Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数.将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明

  • 一组PHP可逆加密解密算法实例代码

    对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加密解密的方法: 加密算法如下: 复制代码 代码如下: function encrypt($data, $key){ $key = md5($key);    $x  = 0;    $len = strlen($data);    $l  = strlen($key);    for ($i = 0

随机推荐