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

 更新时间:2014年01月24日 15:28:53   作者:   我要评论
这篇文章主要介绍了使用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;
?>


需要注意的是apache要支持OpenSSL

相关文章

  • Laravel实现表单提交

    Laravel实现表单提交

    本文给大家分享的是在使用laravel过程中如何实现表单提交的一个简单示例,非常简单,这里推荐给学习laravel的小伙伴
    2017-05-05
  • PHP、Java des加密解密实例

    PHP、Java des加密解密实例

    这篇文章主要介绍了PHP、Java des加密解密实例,des加密是对称加密中在互联网应用的比较多的一种加密方式,本文分别给出了PHP和JAVA版本的实现代码,需要的朋友可以参考下
    2015-04-04
  • Laravel框架实现的使用smtp发送邮件功能示例

    Laravel框架实现的使用smtp发送邮件功能示例

    这篇文章主要介绍了Laravel框架实现的使用smtp发送邮件功能,结合实例形式分析了Laravel框架相关配置及邮件发送操作技巧,需要的朋友可以参考下
    2019-03-03
  • Laravel中七个非常有用但很少人知道的Carbon方法

    Laravel中七个非常有用但很少人知道的Carbon方法

    在编写PHP应用时经常需要处理日期和时间,Carbon继承自 PHP DateTime 类的 API 扩展,它使得处理日期和时间更加简单,这篇文章主要给大家分享了Laravel中七个非常有用但很少人知道的Carbon方法,需要的朋友可以参考下。
    2017-09-09
  • Thinkphp 3.2框架使用Redis的方法详解

    Thinkphp 3.2框架使用Redis的方法详解

    这篇文章主要介绍了Thinkphp 3.2框架使用Redis的方法,结合实例形式详细分析了thinkPHP3.2操作redis的常用方法、相关注意事项与问题解决方法,需要的朋友可以参考下
    2019-10-10
  • smarty模板引擎基础知识入门

    smarty模板引擎基础知识入门

    这篇文章主要介绍了smarty模板引擎基础知识入门,较为详细的分析了smarty的基本概念并实例分析了相关的基本用法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • laravel model模型定义实现开启自动管理时间created_at,updated_at

    laravel model模型定义实现开启自动管理时间created_at,updated_

    今天小编就为大家整理了一篇laravel model模型定义实现开启自动管理时间created_at,updated_at,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • php使用imagick模块实现图片缩放、裁剪、压缩示例

    php使用imagick模块实现图片缩放、裁剪、压缩示例

    这篇文章主要介绍了php使用imagick模块实现图片缩放、裁剪、压缩示例,需要的朋友可以参考下
    2014-04-04
  • 如何判断php mysqli扩展类是否开启

    如何判断php mysqli扩展类是否开启

    php高级版本都支持mysqli扩展类,但是默认情况下,mysqli扩展类是没有开启的,本文章向大家介绍php如何判断mysqli扩展类是否开启,需要的朋友可以参考一下
    2016-12-12
  • phpcms模块开发之swfupload的使用介绍

    phpcms模块开发之swfupload的使用介绍

    本篇文章介绍了,phpcms模块开发之swfupload的使用分析,需要的朋友参考下
    2013-04-04

最新评论