使用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 三维饼图的实现代码
Sep 28 PHP
用PHP实现递归循环每一个目录
Aug 08 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
Jan 11 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
Nov 12 PHP
php实现的短网址算法分享
Jun 20 PHP
PHP中使用imagick生成PSD文件缩略图教程
Jan 26 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
Mar 23 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
yii2实现分页,带搜索的分页功能示例
Jan 07 PHP
PHP设计模式之注册树模式分析
Jan 26 PHP
Thinkphp5 自定义上传文件名的实现方法
Jul 23 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
ASP知识讲座四
2006/10/09 PHP
Cannot modify header information错误解决方法
2008/10/08 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
2013/07/03 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
Python 初始化多维数组代码
2008/09/06 Python
详解python之配置日志的几种方式
2017/05/22 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
浅谈Python协程
2020/06/17 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
什么是Rollback Segment
2013/04/22 面试题
工程力学专业毕业生求职信
2013/10/06 职场文书
电子商务专业自我鉴定
2013/12/18 职场文书
企业法人授权委托书
2014/04/03 职场文书
安全生产专项整治方案
2014/05/06 职场文书
团拜会策划方案
2014/06/07 职场文书
教师个人学习总结
2015/02/11 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang
Java 定时任务技术趋势简介
2022/05/04 Java/Android