PHP7.1 AES加密类库

     分类:代码片段     有: 0 条评论

<?php
/**
 * Created by PhpStorm.
 * User: yan
 * Date: 2019/9/12
 * Time: 9:26 PM
 */
namespace tools;

/**
 * AES加密类库
 * Class Aes
 * @package tools
 */
class Aes {

    //如果是AES-128-CBC长度的必须是16位,AES-192-CBC 必须为32位 ,AES-256-CBC必须位64位

    const iv = 'xxx';

    //可以任意长度,貌似超过64会被截取,尚未验证
    const key = 'xxx';


    //加密
    public static function encrypt($input)
    {
        /**
         * data string 需要加密的字符串
         * method 加密方法这里选CBC,其他模式暂时还没研究
         * key 加密密钥
         * opthins 填充模式 建议选OPENSSL_NO_PADDING(不填充) ,自己手动填充
         * iv ;//加密初始化向量
         *
         */

        //加密字符串需要自己手动去填充补位,也就是你字符串不足需要进行补位,要补够16
        $data = openssl_encrypt(self::addpadding($input), 'AES-128-CBC', self::key, OPENSSL_NO_PADDING, self::iv);
        //因为加密出来的字符不方便传输,所以需要把它转成16进制,也可以用base64加密
        return bin2hex($data);
    }

    //解密
    public static function decrypt($input)
    {
        $decrypted = openssl_decrypt(hex2bin($input), 'AES-128-CBC', self::key, OPENSSL_NO_PADDING, self::iv);

        //因为加密的时候,补了位,所以返回的时候需要把补了位的去除掉
        return rtrim($decrypted,"\0");
    }

    //手动填充(补位)

    /**
     * 手动填充
     * @param $string // 需要填充的字符串
     * @param int $blocksize 填充位数
     * @return string
     */
    private static function addpadding($string, $blocksize = 16) {

        //判断长度
        $len = strlen($string);

        //计算需要补位的长度
        $pad = $blocksize - ($len % $blocksize);

        //把字符串重新n次,然后拼接
        $string .= str_repeat("\0", $pad);

        return $string;

    }
}
(●゚ω゚●)