• AES加密解密的例子小结


    话不多说,先放上代码,一共有两个文件:AES.php(aes算法类文件)和aesDemo.php(应用实例文件),这里只贴出aesDemo.php,其他的看附件吧!
    aesDemo.php:

    例子,

     代码如下 复制代码

    <?php
    require_once('./AES.php');
    //$aes = new AES();
    $aes = new AES(true);// 把加密后的字符串按十六进制进行存储
    //$aes = new AES(true,true);// 带有调试信息且加密字符串按十六进制存储
    $key = "this is a 32 byte key";// 密钥
    $keys = $aes->makeKey($key);
    $encode = "123456";// 被加密的字符串
    $ct = $aes->encryptString($encode, $keys);
    echo "encode = ".$ct."<br>";
    $cpt = $aes->decryptString($ct, $keys);
    echo "decode = ".$cpt;
    ?>

    例子、AES加密类

     代码如下 复制代码

    <?php
    //php aes加密类
    class AESMcrypt {

    public $iv = null;
    public $key = null;
    public $bit = 128;
    private $cipher;

    public function __construct($bit, $key, $iv, $mode) {
    if(empty($bit) || empty($key) || empty($iv) || empty($mode))
    return NULL;

    $this->bit = $bit;
    $this->key = $key;
    $this->iv = $iv;
    $this->mode = $mode;

    switch($this->bit) {
    case 192:$this->cipher = MCRYPT_RIJNDAEL_192; break;
    case 256:$this->cipher = MCRYPT_RIJNDAEL_256; break;
    default: $this->cipher = MCRYPT_RIJNDAEL_128;
    } // www.111cn.net

    switch($this->mode) {
    case 'ecb':$this->mode = MCRYPT_MODE_ECB; break;
    case 'cfb':$this->mode = MCRYPT_MODE_CFB; break;
    case 'ofb':$this->mode = MCRYPT_MODE_OFB; break;
    case 'nofb':$this->mode = MCRYPT_MODE_NOFB; break;
    default: $this->mode = MCRYPT_MODE_CBC;
    }
    }

    public function encrypt($data) {
    $data = base64_encode(mcrypt_encrypt( $this->cipher, $this->key, $data, $this->mode, $this->iv));
    return $data;
    }

    public function decrypt($data) {
    $data = mcrypt_decrypt( $this->cipher, $this->key, base64_decode($data), $this->mode, $this->iv);
    $data = rtrim(rtrim($data), "..");
    return $data;
    }

    }
    //使用方法
    $aes = new AESMcrypt($bit = 128, $key = 'abcdef1234567890', $iv = '0987654321fedcba', $mode = 'cbc');
    $c = $aes->encrypt('haowei.me');
    var_dump($aes->decrypt($c));

    例子、附一个可加密可解密类

     代码如下 复制代码

    <?PHP
    /**
     * AES加密、解密类
     * @author hushangming
     *
     * 用法:
     * <pre>
     * // 实例化类
     * // 参数$_bit:格式,支持256、192、128,默认为128字节的
     * // 参数$_type:加密/解密方式,支持cfb、cbc、nofb、ofb、stream、ecb,默认为ecb
     * // 参数$_key:密钥,默认为abcdefghijuklmno
     * $tcaes = new TCAES();
     * $string = 'laohu';
     * // 加密
     * $encodeString = $tcaes->encode($string);
     * // 解密
     * $decodeString = $tcaes->decode($encodeString);
     * </pre>
     */
    class TCAES{
     private $_bit = MCRYPT_RIJNDAEL_256;
     private $_type = MCRYPT_MODE_CBC;
     //private $_key = 'abcdefghijuklmno0123456789012345';
     private $_key = 'abcdefghijuklmno'; // 密钥
     private $_use_base64 = true;
     private $_iv_size = null;
     private $_iv = null;
     
     /**
      * @param string $_key 密钥
      * @param int $_bit 默认使用128字节
      * @param string $_type 加密解密方式
      * @param boolean $_use_base64 默认使用base64二次加密
      */
     public function __construct($_key = '', $_bit = 128, $_type = 'ecb', $_use_base64 = true){
      // 加密字节
      if(192 === $_bit){
       $this->_bit = MCRYPT_RIJNDAEL_192;
      }elseif(128 === $_bit){
       $this->_bit = MCRYPT_RIJNDAEL_128;
      }else{
       $this->_bit = MCRYPT_RIJNDAEL_256;
      }
      // 加密方法
      if('cfb' === $_type){
       $this->_type = MCRYPT_MODE_CFB;
      }elseif('cbc' === $_type){
       $this->_type = MCRYPT_MODE_CBC;
      }elseif('nofb' === $_type){
       $this->_type = MCRYPT_MODE_NOFB;
      }elseif('ofb' === $_type){
       $this->_type = MCRYPT_MODE_OFB;
      }elseif('stream' === $_type){
       $this->_type = MCRYPT_MODE_STREAM;
      }else{
       $this->_type = MCRYPT_MODE_ECB;
      }
      // 密钥
      if(!empty($_key)){
       $this->_key = $_key;
      }
      // 是否使用base64
      $this->_use_base64 = $_use_base64;
      
      $this->_iv_size = mcrypt_get_iv_size($this->_bit, $this->_type);
      $this->_iv = mcrypt_create_iv($this->_iv_size, MCRYPT_RAND);
     }
     
     /**
      * 加密
      * @param string $string 待加密字符串
      * @return string
      */
     public function encode($string){
      if(MCRYPT_MODE_ECB === $this->_type){
       $encodeString = mcrypt_encrypt($this->_bit, $this->_key, $string, $this->_type); 
      }else{
       $encodeString = mcrypt_encrypt($this->_bit, $this->_key, $string, $this->_type, $this->_iv);
      }
      if($this->_use_base64)
       $encodeString = base64_encode($encodeString);
      return $encodeString;
     }
     
     /**
      * 解密
      * @param string $string 待解密字符串
      * @return string
      */
     public function decode($string){
      if($this->_use_base64)
       $string = base64_decode($string);
      
      $string = $this->toHexString($string);
      if(MCRYPT_MODE_ECB === $this->_type){
       $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type);
      }else{
       $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type, $this->_iv);
      }
      return $decodeString;
     }
     
     /**
      * 将$string转换成十六进制
      * @param string $string
      * @return stream
      */
     private function toHexString ($string){
      $buf = "";
      for ($i = 0; $i < strlen($string); $i++){
       $val = dechex(ord($string{$i}));
       if(strlen($val)< 2)
        $val = "0".$val;
       $buf .= $val;
      }
      return $buf;
     }
     
     /**
      * 将十六进制流$string转换成字符串
      * @param stream $string
      * @return string
      */
     private function fromHexString($string){
      $buf = "";
      for($i = 0; $i < strlen($string); $i += 2){
       $val = chr(hexdec(substr($string, $i, 2)));
       $buf .= $val;
      }
      return $buf;
     }
    }

     
    你可能感兴趣的文章
  • 相关阅读:
    Window服务的创建与删除
    remoting 中事件找不到订阅者时引发异常的解决办法
    TCP/IP 的一些常识
    JDK ByteBuffer & MINA IoBuffer 总结
    web协议总结
    NIO VS IO
    MINA TCP 粘包 少包最终解决方案
    NIO 之 通道
    流式套接字(TCP)和 数据报套接字(UDP)的区别
    MINA 异步 读写总结
  • 原文地址:https://www.cnblogs.com/alibai/p/3553642.html
Copyright © 2020-2023  润新知