ThinkPHP rsa非对称加密类

来源:互联网 发布:宜信大数据研发中心 编辑:程序博客网 时间:2024/06/05 19:46

公钥加密后的字符串是一直变化的,但是用私钥解密后的内容仍然是相同的,这是为了加密数据使用的。
私钥加密的字符串是不会变化的,即使暴露在外网上别人截取时如果没有公钥也是看不出来内容的,仅允许给予公钥的第三方来解密并看到内容,实际作用相当于签名功能,如果能拿到未加密的内容,说明一定是信任方的数据,因为有他的签名啊。
其实这种非对称加密技术可以用于单点登录中去,安全级别高,能解密获取到内容应该就是信任方的数据。

<?phpnamespace Common\Org;class RsaCrypt {    const CERPATH ='../Application/Runtime/Data/server.cer';  //生成证书路径    const PFXPATH = '../Application/Runtime/Data/server.pfx';  //秘钥文件路径    const FILEDIR =  '../Application/Runtime/Data/';         /**      * 生成公钥私钥      */     public static function generateCertKey()     {        $dn = array('countryName'=>'CN', 'stateOrProvinceName'=>'beijing', 'localityName'=>'beijing','organizationName'=>'clcw',             'organizationalUnitName'=>'clcw', 'commonName'=>'clcw', 'emailAddress'=>'service@clcw.com.cn');        $privkeypass = 'secret';       //私钥密码        $numberOfDays = 365;           //有效时长,单位为天        //生成证书        $privkey = openssl_pkey_new();        $csr = openssl_csr_new($dn, $privkey);        $sscert = openssl_csr_sign($csr, null, $privkey, $numberOfDays);        openssl_x509_export_to_file($sscert, self::CERPATH);        openssl_pkcs12_export_to_file($sscert, self::PFXPATH, $privkey, $privkeypass);        (file_exists(self::CERPATH)) or die('公钥的文件路径错误');        (file_exists(self::PFXPATH)) or die('密钥的文件路径错误');     }     public static function verifyData($originData, $decryptData)     {        $cer_key = file_get_contents(self::$cerpath);        $cer = openssl_x509_read($cer_key);        $res = openssl_verify($originData, $decryptData, $cer);        var_dump($res);     }     /**      * 生成公钥私钥文件      * @param $appName string 应用名称      */     public static function generateKey($appName='')     {        $result = ['status'=>0, 'msg'=>''];        if (!extension_loaded('openssl') ) {            $result['msg'] = 'php需要openssl支持';        }        //创建公钥        $res = openssl_pkey_new();//array('private_key_bits'=>512) 这一串参数不加,否则只能加密54个长度的字符串        //提取私钥        openssl_pkey_export($res, $privatekey);        //生成公钥        $public_key = openssl_pkey_get_details($res);        $publickey = $public_key['key'];        // $path = self::FILEDIR.$appName;        try{            // file_put_contents($path.'_public.pem', $publickey);            // file_put_contents($path.'_private.pem', $privatekey);            $result['status'] = 1;            $result['publickey']  = $publickey;            $result['privatekey'] = $privatekey;        }catch(\Exception $e) {            // throw new \Exception($e->getMessage());            $result['msg'] = $e->getMessage();        }        return $result;      }     /**      * 用私钥加密数据      * @param $data string 需要加密的字符串(最好不要超过200个字符)      * @param $appName string 应用名称      */     public static function privateEncrypt($data, $appName)     {        $result = ['status'=>0, 'msg'=>''];        $privatekey = C($appName.'.PRIVATE_KEY');        $myinfo = 'In '.__METHOD__.',privatekey:'.$privatekey."\n";        file_put_contents('/tmp/shiyf.log', $myinfo, FILE_APPEND);        //生成resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false        $privatekey = openssl_pkey_get_private($privatekey);        if (empty($privatekey)) {            $result['msg'] = '密钥不可用';        }        $encryptData = '';        //用私钥加密        if (openssl_private_encrypt($data, $encryptData, $privatekey)) {            $result['msg'] = base64_encode($encryptData);            $result['status'] = 1;        } else {            $result['msg'] = '加密失败!';        }        return $result;     }     /**      * 用公钥解密数据      * @param $data string 需要解密的字符串(最好不要超过200个字符)      * @param $appName string 应用名称      */     public static function publicDecrypt($data, $appName)     {        $result = ['status'=>0, 'msg'=>''];        $data = base64_decode($data);        $publickey = C($appName.'.PUBLIC_KEY');        //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false        $publickey = openssl_pkey_get_public($publickey);        if (empty($publickey)) {            $result['msg'] = '公钥不可用';        }        //解密数据        $decryptData = '';        if (openssl_public_decrypt($data, $decryptData, $publickey)) {            $result['msg'] =  $decryptData;            $result['status'] = 1;        } else {            $result['msg'] = '解密失败';        }        return $result;     }     /**      * 用公钥加密数据      * @param $data string 需要加密的字符串(最好不要超过200个字符)      * @param $appName string 应用名称      */     public static function publicEncrypt($data, $publickey)     {        $result = ['status'=>0, 'msg'=>''];        //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_private函数返回false        $publickey = openssl_pkey_get_public($publickey);        if (empty($publickey)) {            $result['msg'] = '公钥不可用';        }        $encryptData = '';        //用私钥加密        if (openssl_public_encrypt($data, $encryptData, $publickey)) {            $result['msg'] = base64_encode($encryptData);            $result['status'] = 1;        } else {            $result['msg'] = '加密失败!';        }        return $result;     }     /**      * 用私钥加密数据      * @param $data string 需要解密的字符串(最好不要超过200个字符)      * @param $appName string 应用名称      */     public static function privateDecrypt($data, $appName)     {        $result = ['status'=>0, 'msg'=>''];        $data = base64_decode($data);        $privatekey = C($appName.'.PRIVATE_KEY');        //生成resource类型的私钥,如果私钥文件内容被破坏,openssl_pkey_get_public函数返回false        $privatekey = openssl_pkey_get_private($privatekey);        if (empty($privatekey)) {            $result['msg'] = '私钥不可用';        }        //解密数据        $decryptData = '';        if (openssl_private_decrypt($data, $decryptData, $privatekey)) {            $result['msg'] =  $decryptData;            $result['status'] = 1;        } else {            $result['msg'] = '解密失败';        }        return $result;     }}