使用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多例模式介绍
Jun 24 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
May 07 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php往mysql中批量插入数据实例教程
Dec 12 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 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扩展开发经验分享
2012/09/06 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
Laravel 队列使用的实现
2019/01/08 PHP
js的逻辑运算符 ||
2010/05/31 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
Angular4.0动画操作实例详解
2019/05/10 Javascript
vue-devtools的安装和使用步骤详解
2019/10/17 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
[43:36]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python的subprocess模块总结
2014/11/07 Python
Python处理CSV与List的转换方法
2018/04/19 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
Django 内置权限扩展案例详解
2019/03/04 Python
对python 调用类属性的方法详解
2019/07/02 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
linux面试题参考答案(10)
2013/11/04 面试题
大学校园生活自我鉴定
2014/01/13 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书