使用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 相关文章推荐
支持oicq头像的留言簿(二)
Oct 09 PHP
PHP防注入安全代码
Apr 09 PHP
两个强悍的php 图像处理类1
Jun 15 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
Jun 21 PHP
必须收藏的php实用代码片段
Feb 02 PHP
php生成txt文件实例代码介绍
Apr 28 PHP
php加密解密字符串示例
Oct 13 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
php判断目录存在的简单方法
Sep 26 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
phpstrom使用xdebug配置方法
2013/12/17 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
python简单实现基数排序算法
2015/05/16 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
python requests 使用快速入门
2017/08/31 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
python实现画循环圆
2019/11/23 Python
Python序列类型的打包和解包实例
2019/12/21 Python
Python中求对数方法总结
2020/03/10 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
河童之夏观后感
2015/06/11 职场文书
大学军训心得体会800字
2016/01/11 职场文书