zoukankan      html  css  js  c++  java
  • RSA非对称加密 php的openssl实现

    <?php
    /**
     * 使用openssl实现非对称加密
     * @since 2010-07-08
     */
    class Rsa
    {
        /**
         * private key
         */
            private $_privKey;
     
            /**
             * public key
             */
            private $_pubKey;
     
            /**
             * the keys saving path
             */
            private $_keyPath;
     
            /**
             * the construtor,the param $path is the keys saving path
             */
            public function __construct($path)
            {
                    if(empty($path) || !is_dir($path)){
                            throw new Exception('Must set the keys save path');
                    }
     
                    $this->_keyPath = $path;
            }
     
            /**
             * create the key pair,save the key to $this->_keyPath
             */
            public function createKey()
            {
                    $r = openssl_pkey_new();
                    openssl_pkey_export($r, $privKey);
                    file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
                    $this->_privKey = openssl_pkey_get_public($privKey);
     
                    $rp = openssl_pkey_get_details($r);
                    $pubKey = $rp['key'];
                    file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR .  'pub.key', $pubKey);
                    $this->_pubKey = openssl_pkey_get_public($pubKey);
            }
     
            /**
             * setup the private key
             */
            public function setupPrivKey()
            {
                    if(is_resource($this->_privKey)){
                            return true;
                    }
                    $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
                    $prk = file_get_contents($file);
                    $this->_privKey = openssl_pkey_get_private($prk);
                    return true;
            }
     
            /**
             * setup the public key
             */
            public function setupPubKey()
            {
                    if(is_resource($this->_pubKey)){
                            return true;
                    }
                    $file = $this->_keyPath . DIRECTORY_SEPARATOR .  'pub.key';
                    $puk = file_get_contents($file);
                    $this->_pubKey = openssl_pkey_get_public($puk);
                    return true;
            }
     
            /**
             * encrypt with the private key
             */
            public function privEncrypt($data)
            {
                    if(!is_string($data)){
                            return null;
                    }
     
                    $this->setupPrivKey();
     
                    $r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
                    if($r){
                            return base64_encode($encrypted);
                    }
                    return null;
            }
     
            /**
             * decrypt with the private key
             */
            public function privDecrypt($encrypted)
            {
                    if(!is_string($encrypted)){
                            return null;
                    }
     
                    $this->setupPrivKey();
     
                    $encrypted = base64_decode($encrypted);
     
                    $r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
                    if($r){
                            return $decrypted;
                    }
                    return null;
            }
     
            /**
             * encrypt with public key
             */
            public function pubEncrypt($data)
            {
                    if(!is_string($data)){
                            return null;
                    }
     
                    $this->setupPubKey();
     
                    $r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
                    if($r){
                            return base64_encode($encrypted);
                    }
                    return null;
            }
     
            /**
             * decrypt with the public key
             */
            public function pubDecrypt($crypted)
            {
                    if(!is_string($crypted)){
                            return null;
                    }
     
                    $this->setupPubKey();
     
                    $crypted = base64_decode($crypted);
     
                    $r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
                    if($r){
                            return $decrypted;
                    }
                    return null;
            }
     
            public function __destruct()
            {
                    @ fclose($this->_privKey);
                    @ fclose($this->_pubKey);
            }
     
    }
     
    //====================demo=======================
    //以下是一个简单的测试demo,如果不需要请删除
    $rsa = new Rsa('ssl-key');
     
    //私钥加密,公钥解密
    echo 'source:我是老鳖<br />';
    $pre = $rsa->privEncrypt('我是老鳖');
    echo 'private encrypted:<br />' . $pre . '<br />';
     
    $pud = $rsa->pubDecrypt($pre);
    echo 'public decrypted:' . $pud . '<br />';
     
    //公钥加密,私钥解密
    echo 'source:干IT的<br />';
    $pue = $rsa->pubEncrypt('干IT的');
    echo 'public encrypt:<br />' . $pue . '<br />';
     
    $prd = $rsa->privDecrypt($pue);
    echo 'private decrypt:' . $prd;
    //========================demo======================
    ?>

    需要注意的是apache要支持OpenSSL

  • 相关阅读:
    mui签到日历
    简单的vue-resourse获取json并应用到模板
    Ubuntu16.04安装wineqq国际版
    spring RestTemplate调用string和URL 请求问题
    java.util.AbstractSequentialList
    java.util.AbstractList
    maven pom 报错 inspects a maven model for resolution problems
    2019/9/6 spring实战第二章,shiro权限加密,授权
    2019/9/4 spring实战,shiro权限简单记录
    mybatis 转换结果问题
  • 原文地址:https://www.cnblogs.com/gpfeisoft/p/3531360.html
Copyright © 2011-2022 走看看