zl程序教程

您现在的位置是:首页 >  后端

当前栏目

php对称加密算法示例

PHP 示例 加密算法 对称
2023-06-13 09:15:26 时间


php对称加密算法

KEY是之前定义的常量

复制代码代码如下:

Mcrypt::encrypt();
Mcrypt::decrypt();

复制代码代码如下:


defined("ROOT")orexit("AccessDenied");

classMcrypt{

 publicstaticfunctionencrypt($code){
  returnbase64_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)));
 }

 publicstaticfunctiondecrypt($code){
  returnmcrypt_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/256bit(字节长度8/16/32)
 *支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bitAES:128/256bit)
 *支持模式:CBC/ECB/OFB/CFB
 *密文编码:base64字符串/十六进制字符串/二进制字符串流
 *填充方式:PKCS5Padding(DES)
 *
 *@author:linvo
 *@version:1.0.0
 *@date:2013/1/10
 */ 
classXcrypt{ 

   private$mcrypt; 
   private$key; 
   private$mode; 
   private$iv; 
   private$blocksize; 

   /**
    *构造函数
    *
    *@paramstring密钥
    *@paramstring模式
    *@paramstring向量("off":不使用/"auto":自动/其他:指定值,长度同密钥)
    */ 
   publicfunction__construct($key,$mode="cbc",$iv="off"){ 
       switch(strlen($key)){ 
       case8: 
           $this->mcrypt=MCRYPT_DES; 
           break; 
       case16: 
           $this->mcrypt=MCRYPT_RIJNDAEL_128; 
           break; 
       case32: 
           $this->mcrypt=MCRYPT_RIJNDAEL_256; 
           break; 
       default: 
           die("Keysizemustbe8/16/32"); 
       } 

       $this->key=$key; 

       switch(strtolower($mode)){ 
       case"ofb": 
           $this->mode=MCRYPT_MODE_OFB; 
           if($iv=="off")die("OFBmustgiveaIV");//OFB必须有向量 
           break; 
       case"cfb": 
           $this->mode=MCRYPT_MODE_CFB; 
           if($iv=="off")die("CFBmustgiveaIV");//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; 
       } 

    
   } 

 
   /**
    *获取向量值
    *@paramstring向量值编码(base64/hex/bin)
    *@returnstring向量值
    */ 
   publicfunctiongetIV($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; 
   } 

 
   /**
    *加密
    *@paramstring明文
    *@paramstring密文编码(base64/hex/bin)
    *@returnstring密文
    */ 
   publicfunctionencrypt($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; 

   } 

   /**
    *解密 
    *@paramstring密文
    *@paramstring密文编码(base64/hex/bin)
    *@returnstring明文
    */ 
   publicfunctiondecrypt($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;  
   }

   privatefunction_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); 
   } 

   privatefunction_pkcs5Unpad($text){ 
       $pad=ord($text{strlen($text)-1}); 
       if($pad>strlen($text))returnfalse; 
       if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad)returnfalse; 
       $ret=substr($text,0,-1*$pad); 
       return$ret; 
   } 

   privatefunction_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";//256bit 
$key="1234567812345678";//128bit 
$key="12345678";//64bit 

//设置模式和IV 
$m=newXcrypt($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>";