美文网首页
非对称加密算法RSA

非对称加密算法RSA

作者: 小慕先森 | 来源:发表于2017-09-01 11:19 被阅读0次
    <?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,如果不需要请删除
    $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;
    ?>  

    相关文章

      网友评论

          本文标题:非对称加密算法RSA

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