• 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

  • 相关阅读:
    系统编码、文件编码与python系统编码
    python2判断编码格式
    android: 对apk进行系统签名
    android: 对普通的apk应用进行签名
    android studio: 设置单条注释不换行
    Gradle: Could not determine the dependencies of task ':app:processDebugResources'解决(转)
    android Dialog: 去除dialog 顶部 蓝色的线
    android:Error:” ” is not translated in “en” (English) [MissingTranslation]处理方法(转)
    android: 通过Intent筛选多种类型文件
    GIt: git rebase 和 git merge 的区别 (转)
  • 原文地址:https://www.cnblogs.com/gpfeisoft/p/3531360.html
Copyright © 2020-2023  润新知