使用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 相关文章推荐
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
分享一个php 的异常处理程序
Jun 22 PHP
PHP操作MySQL事务实例
Nov 05 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
php简单实现查询数据库返回json数据
Apr 16 PHP
Zend Framework教程之Zend_Layout布局助手详解
Mar 04 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
php 中奖概率算法实现代码
Jan 25 PHP
Laravel5.1 框架路由基础详解
Jan 04 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 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
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
Angularjs中ng-repeat的简单实例
2017/08/25 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
浅谈vuepress 踩坑记
2018/04/18 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
python 输出所有大小写字母的方法
2019/01/02 Python
pandas中的series数据类型详解
2019/07/06 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
出国考察邀请函
2014/01/21 职场文书
树转促学习心得体会
2014/09/10 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
2015秋季开学典礼主持词
2015/07/16 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
Java 实战项目之家居购物商城系统详解流程
2021/11/11 Java/Android
如何利用python实现Simhash算法
2022/06/28 Python