本人不推荐使用php写一些加解密算法,php执行效率毕竟不高,推荐使用AES加解密。php扩展mcrypt支持此加密算法。

 

AES(Advanced Encryption Standard,高级加密标准)是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。Rijndael是在AES中使用的基本密码算法。

使用mcrypt前要先确定是否已经安装mcrypt扩展,检查方法如下:

$cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表 
$mode_list = mcrypt_list_modes(); //mcrypt支持的加密模式列表

print_r($cipher_list);
print_r($mode_list);

其中输出的 rijndael-128,rijndael-192,rijndael-256就是AES加密,3种分别是使用不同的数据块和密钥长度进行加密。

下面是收集的一个加密类。

class aes {
    private $cipher = MCRYPT_RIJNDAEL_128; //算法
    //MCRYPT_RIJNDAEL_256
    private $mode = MCRYPT_MODE_ECB; //模式
    //MCRYPT_MODE_CBC
    private $secret_key = 'default_secret_key';

    public function setKey($key) {
        $this->secret_key = $key;
    }

    public function encode($data) {
        //打开加密算法和模式
        $td = mcrypt_module_open($this->cipher,'',$this->mode,'');
        //创建初始向量
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
        //初始化加密
        mcrypt_generic_init($td,$this->secret_key,$iv);
        $encrypted = mcrypt_generic($td,$data);
        //结束加密,执行清理工作
        mcrypt_generic_deinit($td);
        //关闭模块
        mcrypt_module_close($td);
        return $encrypted;
    }

    public function decode($data) {
        $td = mcrypt_module_open($this->cipher,'',$this->mode,'');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
        mcrypt_generic_init($td,$this->secret_key,$iv);
        $data = mdecrypt_generic($td,$data);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return trim($data);
    }
}

//示例
$aes = new aes();
$aes->setKey('key');

$string='www.phpsj.com';
$encode = $aes->encode($string);
var_dump('明文:'.$string);
var_dump('密文:'.$encode);
var_dump('可传输的密文:'.bin2hex($encode));
var_dump('base64密文:'.base64_encode($encode));
var_dump('解密:'.$aes->decode($encode));