php中AES加密解密的例子小结

php中AES加密解密的例子小结

话不多说,先放上代码,一共有两个文件:AES.php(aes算法类文件)和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;

}

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;

}

}