PHP进行AES加密

一、AES简介

   高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图: 

AES.png

注:此处暂时不详细介绍AES加密的内容,想进一步了解的读者可以去查找相关资料。


二、使用PHP进行AES加密:

class Aes {

    private $key = null;
    
    /**
     *
     * @param $key 密钥
     * @return String
     */
    public function __construct($key) {
          //此处采用的是AES-128的方式进行加密,所以key值必须为16位的字符串
       $this->key = $key;
    }
    
    /**
     * Mcrypt的方式加密
     * @param String input 加密的字符串
     * @param String key   解密的key
     * @return HexString
     */
    public function encrypt($input = '') {
      $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
      $input = $this->pkcs5_pad($input, $size);
      $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
      $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
      mcrypt_generic_init($td, $this->key, $iv);
      $data = mcrypt_generic($td, $input);
      mcrypt_generic_deinit($td);
      mcrypt_module_close($td);
      $data = base64_encode($data);
      return $data;
    }
    
    /**
     * 填充方式 pkcs5
     * @param String text  原始字符串
     * @param String blocksize   加密长度
     * @return String
     */
    private function pkcs5_pad($text, $blocksize) {
      $pad = $blocksize - (strlen($text) % $blocksize);
      return $text . str_repeat(chr($pad), $pad);
    }
    
    /**
     * 解密
     * @param String input 解密的字符串
     * @param String key   解密的key
     * @return String
     */
    public function decrypt($sStr) {
      $decrypted= mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$this->key,base64_decode($sStr), MCRYPT_MODE_ECB);
      $dec_s = strlen($decrypted);
      $padding = ord($decrypted[$dec_s-1]);
      $decrypted = substr($decrypted, 0, -$padding);
      return $decrypted;
    }
    
    /**
     * 用openssl进行解密
     * @param String data 加密的字符串
     * @param String method   加密的方式
     * @return String
     */
    public function encrypt_openssl($data,$method = 'AES-128-ECB')
    {
      return openssl_encrypt($data,$method,$this->key);
    }
    
    /**
     * 用openssl进行解密
     * @param String data 解密的字符串
     * @param String method   解密的方式
     * @return String
      */
    public function decrypt_openssl($data,$method = 'AES-128-ECB')
    {
      return openssl_decrypt($data,$method,$this->key);
    }
}

接下来,我们如下使用以上的类:

$data = [
  'name' => 'handsome',
  'id' => 1
];

$data = http_build_query($data);
//http_build_query()函数能把数组转换成name=handsome&id=1这样的形式

$Aes = new Aes('handsome333rui77');//此处的key是随便输入的16位字符串

var_dump($Aes->encrypt($data)); //结果为:9lRks1VZcWHbh/z8LQWFNHEYcelQ8DcTS/y0uTFNhcc=
var_dump($Aes->decrypt('9lRks1VZcWHbh/z8LQWFNHEYcelQ8DcTS/y0uTFNhcc=')); //解密,结果为:name=handsome&id=1
var_dump($Aes->encrypt_openssl($data));  //加密
var_dump($Aes->decrypt_openssl('9lRks1VZcWHbh/z8LQWFNHEYcelQ8DcTS/y0uTFNhcc='));  //解密

注:在PHP7中,Mcrypt已经被抛弃,所以,php7版本以上的推荐使用openssl


头像
QQ登录: