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


Posted in PHP onJanuary 24, 2014
<?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

PHP 相关文章推荐
支持oicq头像的留言簿(二)
Oct 09 PHP
php下使用无限生命期Session的方法
Mar 16 PHP
PHP的password_hash()使用实例
Mar 17 PHP
PHP实现抓取HTTPS内容
Dec 01 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
CI框架扩展系统核心类的方法分析
May 23 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 PHP
Laravel 队列使用的实现
Jan 08 PHP
YII框架常用技巧总结
Apr 27 PHP
关于laravel后台模板laravel-admin select框的使用详解
Oct 03 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
测试php连接mysql是否成功的代码分享
Jan 24 #PHP
php实现邮件发送并带有附件
Jan 24 #PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 #PHP
php 发送带附件邮件示例
Jan 23 #PHP
php 获取页面中指定内容的实现类
Jan 23 #PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 #PHP
php 字符串压缩方法比较示例
Jan 23 #PHP
You might like
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
JavaScript学习笔记之定时器
2015/01/22 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
JavaScript判断日期时间差的实例代码
2018/03/01 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
租车协议书范本
2014/04/22 职场文书
中学生演讲稿
2014/04/26 职场文书
活动总结的格式
2014/05/07 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
镇创先争优活动总结
2014/08/28 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
小学校长个人总结
2015/03/03 职场文书
工作失职自我检讨书
2015/05/05 职场文书