• php实现非对称加密


    <?php
    /**
     * 使用openssl实现非对称加密
     * 
     * @since 2015-11-10
     */
    class Rsa
    {
        /**
         * 私钥
         * 
         */
        private $_privKey;
    
        /**
         * 公钥
         * 
         */
        private $_pubKey;
    
        /**
         * 保存文件地址
         */
        private $_keyPath;
    
        /**
         * 指定密钥文件地址
         * 
         */
        public function __construct($path)
        {
            if (empty($path) || !is_dir($path)) {
                throw new Exception('请指定密钥文件地址目录');
            }
            $this->_keyPath = $path;
        }
    
        /**
         * 创建公钥和私钥
         * 
         */
        public function createKey()
        {
            $config = [
                "config" => 'D:wampinapacheapache2.4.9confopenssl.cnf',
                "digest_alg" => "sha512",
                "private_key_bits" => 4096,
                "private_key_type" => OPENSSL_KEYTYPE_RSA,
            ];
            // 生成私钥
            $rsa = openssl_pkey_new($config);
            openssl_pkey_export($rsa, $privKey, NULL, $config);
            file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
            $this->_privKey = openssl_pkey_get_public($privKey);
            // 生成公钥
            $rsaPri = openssl_pkey_get_details($rsa);
            $pubKey = $rsaPri['key'];
            file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);
            $this->_pubKey = openssl_pkey_get_public($pubKey);
        }
    
        /**
         * 设置私钥
         * 
         */
        public function setupPrivKey()
        {
            if (is_resource($this->_privKey)) {
                return true;
            }
            $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
            $privKey = file_get_contents($file);
            $this->_privKey = openssl_pkey_get_private($privKey);
            return true;
        }
    
        /**
         * 设置公钥
         * 
         */
        public function setupPubKey()
        {
            if (is_resource($this->_pubKey)) {
                return true;
            }
            $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key';
            $pubKey = file_get_contents($file);
            $this->_pubKey = openssl_pkey_get_public($pubKey);
            return true;
        }
    
        /**
         * 用私钥加密
         * 
         */
        public function privEncrypt($data)
        {
            if (!is_string($data)) {
                return null;
            }
            $this->setupPrivKey();
            $result = openssl_private_encrypt($data, $encrypted, $this->_privKey);
            if ($result) {
                return base64_encode($encrypted);
            }
            return null;
        }
    
        /**
         * 私钥解密
         * 
         */
        public function privDecrypt($encrypted)
        {
            if (!is_string($encrypted)) {
                return null;
            }
            $this->setupPrivKey();
            $encrypted = base64_decode($encrypted);
            $result = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
            if ($result) {
                return $decrypted;
            }
            return null;
        }
    
        /**
         * 公钥加密
         * 
         */
        public function pubEncrypt($data)
        {
            if (!is_string($data)) {
                return null;
            }
            $this->setupPubKey();
            $result = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
            if ($result) {
                return base64_encode($encrypted);
            }
            return null;
        }
    
        /**
         * 公钥解密
         * 
         */
        public function pubDecrypt($crypted)
        {
            if (!is_string($crypted)) {
                return null;
            }
            $this->setupPubKey();
            $crypted = base64_decode($crypted);
            $result = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
            if ($result) {
                return $decrypted;
            }
            return null;
        }
    
        /**
         * __destruct
         * 
         */
        public function __destruct() {
            @fclose($this->_privKey);
            @fclose($this->_pubKey);
        }
    }
    
    ?> 

    测试

     
    $rsa = new Rsa('ssl-key');
    //私钥加密,公钥解密
    echo "待加密数据:segmentfault.com
    ";
    $pre = $rsa->privEncrypt("segmentfault.com");
    echo "加密后的密文:
    " . $pre . "
    ";
    $pud = $rsa->pubDecrypt($pre);
    echo "解密后数据:" . $pud . "
    ";
    
    
    
    //公钥加密,私钥解密
    echo "待加密数据:segmentfault.com
    ";
    $pue = $rsa->pubEncrypt("segmentfault.com");
    echo "加密后的密文:
    " . $pue . "
    ";
    $prd = $rsa->privDecrypt($pue);
    echo "解密后数据:" . $prd;
  • 相关阅读:
    【Nginx 快速入门】反向代理、负载均衡、动静分离
    【Redis】缓存穿透、缓存击穿、缓存雪崩(面试必备)
    【Redis】特殊数据类型
    【Redis】特殊数据类型
    【Redis】特殊数据类型
    typescript 技巧学习
    angular9的学习(十九)
    angular11源码探索二十六[Router整体路由配置]
    angular11源码探索二十五[Router路由事件]
    angular11源码探索二十四[路由检测变更策略]
  • 原文地址:https://www.cnblogs.com/gjw-hsf/p/7243028.html
Copyright © 2020-2023  润新知