日期:2014-05-17 浏览次数:20571 次
<?php
require_once("PKCS5.php");
require_once("AESKey.php");
require_once("ECBMode.php");
require_once("Hex.php");
class Aes
{
private $_pad;//填充方式
private $_mode;//加密类
/**
* 构造函数
* @param base64keyString 密钥base64编码字符串
*/
public function Aes($base64keyString)
{
$this->_pad = new PKCS5(); //为了与java保持一致,所以采用PKCS5填充
$key = Hex::string2ByteArray(base64_decode($base64keyString));
$this->_mode = new ECBMode(new AESKey($key), $this->_pad);
$this->_pad->setBlockSize($this->_mode->getBlockSize());
}
/**
* 将明文加密为密文base64编码字符串
* @param plainSrc 明文
* @return 密文base64编码
*/
public function encrypt($plainSrc)
{
$src = Hex::string2ByteArray($plainSrc);
$src = $this->_mode->encrypt($src);
return base64_encode(Hex::ByteArray2String($src));
}
/**
* 将base64编码字符串(密文)解密成 明文
* @param base64Src 密文base64编码字符串
* @return 明文
*/
public function decrypt($base64Src)
{
$src = base64_decode($base64Src);
$src = $this->_mode->decrypt(Hex::string2ByteArray($src));
return Hex::byteArray2String($src);
}
/**
* 释放内存
*/
public function dispose()
{
$this->_mode->dispose();
}
}
//var_dump(Hex::string2ByteArray(base64_decode("MK2X82eL6jkKbzvlJU1ZMR6rcKO+SBhmbPOmFD/2Mxw=")));
$_aes = new Aes("MK2X82eL6jkKbzvlJU1ZMR6rcKO+SBhmbPOmFD/2Mxw=");
//echo "=================<br>";
$ret = $_aes->encrypt("1234567890abcdef1234567890abcdefaaafdsfsdffasfasfasfasdf");
echo $ret;
var_dump($_aes->decrypt($ret));
?>
<?php
require_once("IPad.php");
class PKCS5 implements IPad
{
private $blockSize = 0;
public function PKCS5($blockSize=0) {
$this->blockSize = $blockSize;
}
public function pad($a)
{
$c = $this->blockSize-count($a)%$this->blockSize;
for ($i=0;$i<$c;++$i){
$a[] = $c;
}
return $a;
}
public function unpad($a)
{
$len = count($a);
$c = $len % $this->blockSize;
if ($c!=0) throw new Exception("PKCS#5::unpad: ByteArray.length isn't a multiple of the blockSize");
$c = $a[$len-1];
array_splice($a,$len-$c,$c);
return $a;
}
public function setBlockSize($bs)
{
$this->blockSize = $bs;
}
}
?>
<?php
require_once("ISymmetricKey.php");
require_once("AESKeyInclude.php");
require_once("Hex.php");
class AESKey implements ISymmetricKey
{
private $_keyByte;
private $_keyLength;
private $_nNr;
private $_stateByte;
private $_tempByte;
public function AESKey($key/*:ByteArray*/) {
$this->_tempByte = array();
$this->_stateByte = array();
$this->_keyLength = count($key);
$this->_keyByte = $key;
$this->expandKey();
}
// produce Nb bytes for each round
private function expandKey()
{
$tmp0=0;
$tmp1=0;
$tmp2=0;
$tmp3=0;
$tmp4=0;
$idx=0;
$Nk = $this->_keyLength/4;
//echo("count:".$Nk."<br>".count($this->_keyByte)."<br>");
$this->_nNr = $Nk+6;
$_keyByte = $this->_keyByte;
$_nNr = $this->_nNr;
$Nb = AESKeyInclude::$Nb;
$Sbox = AESKeyInclude::$_Sbox;
$Rcon = AESKeyInclude::$_Rcon;
for( $idx = $Nk; $idx < $Nb * ($_nNr + 1); $idx++ ) {
$tmp0 = $_keyByte[4*$idx - 4];
$tmp1 = $_keyByte[4*$idx - 3];
$tmp2 = $_keyByte[4*$idx - 2];
$tmp3 = $_keyByte[4*$idx - 1];
if( !($idx % $Nk) ) {
$tmp4 = $tmp3;
$tmp3 = $Sbox[$tmp0];
$tmp0 = $Sbox[$tmp1] ^ $Rcon[$idx/$Nk];
$tmp1 = $Sbox[$tmp2];
$tmp2 = $Sbox[$tmp4];
} else if( $Nk > 6 && $idx % $Nk == 4 ) {
$tmp0 = $Sbox[$tmp0];
$tmp1 = $Sbox[$tmp1];
$tmp2 = $Sbox[$tmp2];
$tmp3 = $Sbox[$tmp3];
}
$_keyByte[4*$idx+0] = $_keyByte[4*$idx - 4*$Nk + 0] ^ $tmp0;
$_keyByte[4*$idx+1] = $_keyByte