您的位置
主页 > 网站技术 > 语言编程 > » 正文

使用openssl实现rsa非对称加密算法示例

来源: 站长圈 点击:

复制代码 代码如下:

<?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;

?>




首页  - 关于站长圈  - 广告服务  - 联系我们  - 关于站长圈  - 网站地图  - 版权声明