使用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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
ThinkPHP后台首页index使用frameset时的注意事项分析
Aug 22 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
PHP实现批量生成App各种尺寸Logo
Mar 19 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
PHP获取网页所有连接的方法(附demo源码下载)
Mar 30 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
php取出数组单个值的方法
Mar 12 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 PHP
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 PHP
一文搞懂PHP中的抽象类和接口
May 25 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
使用php4加速网络传输
2006/10/09 PHP
PHP 采集心得技巧
2009/05/15 PHP
PHP 程序授权验证开发思路
2009/07/09 PHP
php 8小时时间差的解决方法小结
2009/12/22 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
jQuery参数列表集合
2011/04/06 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
2014/10/31 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
HTML5之语义标签介绍
2016/07/07 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
英文简历中的自我评价
2013/10/06 职场文书
廉洁使者实施方案
2014/03/29 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
读书笔记格式
2015/07/02 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
2019年工作总结范文
2019/05/21 职场文书