使用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 相关文章推荐
php定时删除文件夹下文件(清理缓存文件)
Jan 23 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 PHP
解析php中curl_multi的应用
Jul 17 PHP
php上传文件问题汇总
Jan 30 PHP
php通过递归方式复制目录和子目录的方法
Mar 13 PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 PHP
Linux平台php命令行程序处理管道数据的方法
Nov 10 PHP
Yii 2.0如何使用页面缓存方法示例
May 23 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
php使用QueryList轻松采集js动态渲染页面方法
Sep 11 PHP
php使用yield对性能提升的测试实例分析
Sep 19 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 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
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
php中Snoopy类用法实例
2015/06/19 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
vue mounted组件的使用
2018/06/18 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
vue中引入mxGraph的步骤详解
2019/05/17 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
python 文件与目录操作
2008/12/24 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例
2019/05/04 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
Python实现微信好友的数据分析
2019/12/16 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js