<?php
/**
 * AES_128_CBC
 * Date: 2016/12/21 0021
 * Time: 14:03
 */
namespace  app\modules\common;

class AESCBC
{

    //aes 128 cbc 加解密
    public static function aes_deal($str, $type = 'encrypt', $key = '6979636a66346f6b', $iv = '697a306163326f31')
    {
        if ($type == "encrypt") {
            $str=self::addPkcs7Padding($str);
            $encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv);
            return bin2hex($encrypt_str);
        } elseif ($type == 'decrypt') {
            $str=hex2bin($str);
            $decrypt_str =  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv);
            $str=self::stripPkcs7Padding($decrypt_str);
            return trim($str);
        }
    }

    //aes 128 cbc 加解密
    public static function aes_base64($str, $type = 'encrypt', $key = '6979636a66346f6b', $iv = '697a306163326f31')
    {

        if ($type == "encrypt") {
            $str=self::addPkcs7Padding($str);
            $encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv);
            return base64_encode($encrypt_str);
        } elseif ($type == 'decrypt') {
            $str=base64_decode($str);
            $decrypt_str =  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv);
            $str=self::stripPkcs7Padding($decrypt_str);
            return trim($str);
        }
    }

    //aes 128 cbc 加解密
    public static function aesEcbBase64($str, $type = 'encrypt', $key = '6979636a66346f6b')
    {

        if ($type == "encrypt") {
            $str=self::addPkcs7Padding($str);
            $encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
            return base64_encode($encrypt_str);
        } elseif ($type == 'decrypt') {
            $str=base64_decode($str);
            $decrypt_str =  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
            $str=self::stripPkcs7Padding($decrypt_str);
            return trim($str);
        }
    }


    //去除填充
    public static function stripPkcs7Padding($string)
    {
        $slast = ord(substr($string, -1));
        $slastc = chr($slast);

        if (preg_match("/$slastc{".$slast."}/", $string)) {
            $string = substr($string, 0, strlen($string)-$slast);
            return $string;
        } else {
            return false;
        }
    }
    /**
     *  PKCS #7 填充字符串由一个字节序列组成，每个字节填充该填充字节序列的长度。
    假定块长度为 8，数据长度为 9，
    数据： FF FF FF FF FF FF FF FF FF
    PKCS7 填充： FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07
    简单地说, PKCS5, PKCS7和SSL3, 以及CMS(Cryptographic Message Syntax)
    有如下相同的特点:
    1)填充的字节都是一个相同的字节
    2)该字节的值,就是要填充的字节的个数
    如果要填充8个字节,那么填充的字节的值就是0×8;
    要填充7个字节,那么填入的值就是0×7;
     * */
    //添加填充 128 $blocksize=16
    public static function addPkcs7Padding($string, $blocksize = 16)
    {
        $len = strlen($string); //取得字符串长度
        $pad = $blocksize - ($len % $blocksize); //取得补码的长度
        $string .= str_repeat(chr($pad), $pad); //用ASCII码为补码长度的字符， 补足最后一段
        return $string;
    }


    //生成16位字符串
    public static function six_string()
    {

        $arr=array('1','2','3','4','5','6','7','8','9','0','q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','k','l','z','x','c','v','b','n','m');
        $string='';
        for ($i=0; $i<8; $i++) {
            $string.=$arr[rand(0, count($arr)-1)];
        }
        return bin2hex($string);
    }
}
