美文网首页
AES RSA 加解密

AES RSA 加解密

作者: 可望不可j | 来源:发表于2022-08-12 10:30 被阅读0次
    <?php
    namespace App\Models;
    use Illuminate\Support\Facades\Log;
    
    class IcbcPayModel
    {
    
        //AES秘钥
        protected $aesKey = "";
        //向量
        protected $hex_iv = "00000000000000000000000000000000";
        //公钥
        protected $publicKey = '';
        //私钥
        protected $privateKey = '';
    
        //地址
        protected $publicCerPath;
    
        //系统
        protected $school_rsa = [
            '118'=>[
                'public'=>'public.pem',
                'private'=>'private.pem',
            ]
        ];
    
        public function __construct()
        {
            $this->key = hash('sha256', $this->aesKey, true);
        }
    
    
        /**
         * 公钥-加密
         * @param string $RSA_PUBLIC 公钥
         * @param string $string 需要加密的字符串
         * @param bool $is_sssembly true|需要拼接  false|不需要
         * @return array
         */
        public function public_key_encryp($string,$school_id){
    
            if(isset($this->school_rsa[$school_id]['public'])){
                $this->publicKey = public_path() . "/cert/IcbcPayCert/".$school_id."/".$this->school_rsa[$school_id]['public'];
            }else{
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
    
            $keyContent = file_get_contents($this->publicKey);
            if(!$keyContent){
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
    
            //验证公钥是否正确
            $public_key = openssl_pkey_get_public($keyContent);
            if(!$public_key){
                return ['status'=>false,'messate'=>'公钥不可用'];
            }
            //第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式
            $return_en = openssl_public_encrypt($string, $crypted, $public_key);
            if(!$return_en){
                return ['status'=>false,'messate'=>'公钥错误'];
            }
            $eb64_cry = base64_encode($crypted);
            return ['status'=>true,'messate'=>'ok','data'=>$eb64_cry];
        }
    
        /**
         * 私钥-解密
         * @param string $string 需要加密的字符串
         * @return array
         */
        public function private_key_decrypt($string,$school_id){
    
            if($this->school_rsa[$school_id]['private']){
                $this->privateKey = public_path() . "/cert/IcbcPayCert/".$school_id."/".$this->school_rsa[$school_id]['private'];
            }else{
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
    
            $keyContent = file_get_contents($this->privateKey);
            if(!$keyContent){
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
            //验证私钥
            $private_key = openssl_pkey_get_private($keyContent);
            if(!$private_key){
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
            $return_de = openssl_private_decrypt(base64_decode($string), $decrypted, $private_key);
            if(!$return_de){
                return ['status'=>false,'messate'=>'解密失败,请检查私秘钥'];
            }
            return ['status'=>true,'messate'=>'ok','data'=>$decrypted];
        }
    
    
        /**
         * 私钥-加密
         * @param string $string 需要加密的字符串
         * @return array
         */
    
        public function private_key_encryp($string,$school_id){
            if($this->school_rsa[$school_id]['private']){
                $this->privateKey = public_path() . "/cert/IcbcPayCert/".$school_id."/".$this->school_rsa[$school_id]['private'];
            }else{
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
    
            $keyContent = file_get_contents($this->privateKey);
            if(!$keyContent){
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
    
            //验证私钥是否正确
            $private_key = openssl_pkey_get_private($keyContent);
            if(!$private_key){
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
            //第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式
            $return_en = openssl_private_encrypt($string, $crypted, $private_key);
            if(!$return_en){
                return ['status'=>false,'messate'=>'加密失败'];
            }
            $eb64_cry = base64_encode($crypted);
            return ['status'=>true,'messate'=>'ok','data'=>$eb64_cry];
        }
    
        /**
         * 公钥-解密
         * @param string $string 需要加密的字符串
         * @return array
         */
        public function public_key_decrypt($string,$school_id){
            if(isset($this->school_rsa[$school_id]['public'])){
                $this->publicKey = public_path() . "/cert/IcbcPayCert/".$school_id."/".$this->school_rsa[$school_id]['public'];
            }else{
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
            $keyContent = file_get_contents($this->publicKey);
            if(!$keyContent){
                return ['status'=>false,'messate'=>'私钥不可用'];
            }
            //验证公钥是否正确
            $public_key = openssl_pkey_get_public($keyContent);
            if(!$public_key){
                return ['status'=>false,'messate'=>'公钥不可用'];
            }
            $return_en = openssl_public_decrypt(base64_decode($string), $decrypted, $public_key);
            if(!$return_en){
                return ['status'=>false,'messate'=>'解密失败'];
            }
            return ['status'=>true,'messate'=>'ok','data'=>$decrypted];
        }
    
        /**
         * AES 解密
         * @param $input
         * @return string
         */
        public function encrypt($input)
        {
            $data = openssl_encrypt($input, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
            $data = base64_encode($data);
            return $data;
        }
    
        /**
         * 解密
         * @param $input
         * @return false|string
         */
        public function decrypt($input)
        {
            $decrypted = openssl_decrypt(base64_decode($input), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
            return $decrypted;
        }
    
        public function hexToStr($hex){
            $string='';
            for ($i=0; $i < strlen($hex)-1; $i+=2){
                $string .= chr(hexdec($hex[$i].$hex[$i+1]));
            }
            return $string;
        }
    }
    
    
    

    相关文章

      网友评论

          本文标题:AES RSA 加解密

          本文链接:https://www.haomeiwen.com/subject/mjuxgrtx.html